From 4756a1697798e8c9282fa138808f5f963a120ab3 Mon Sep 17 00:00:00 2001 From: Shivan Kaul Sahib Date: Fri, 13 Aug 2021 12:53:00 -0700 Subject: [PATCH 1/2] Add 1 MB worth of sugarcoat resources For following handpicked websites: - www.reuters.com (76K) - vimeo.com (244K) - windows.com (164K) - www.independent.co.uk (188K) - live.house.gov (68K) - fedex.com (468K) --- dist/resources.json | 2 +- filter_lists/default.json | 7 ++ generateMetadataJsonFromScriptResources.js | 20 ++++++ metadata.json | 66 ++++++++++++++++++- ...in-b2d095f00aca850075d265f4a81c8fb7.min.js | 1 + ...cs-a14946c73def6bdaa93155f58435a82e.min.js | 1 + ...6d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js | 1 + ...p2-a52bcd9059a7d75c4d5b8f66db49a380.min.js | 1 + ...pt-83c6e054eb06b453d56c97b9ddd181d6.min.js | 1 + ...in-7754fade75bed02e4097bf3d7fff178c.min.js | 1 + ...in-2eb9609b74432d652877d41a51a8d2ba.min.js | 1 + ...er-7754008b0da848856cddb20094976335.min.js | 1 + 12 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 generateMetadataJsonFromScriptResources.js create mode 100644 resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min.js create mode 100644 resources/sugarcoat-analytics-a14946c73def6bdaa93155f58435a82e.min.js create mode 100644 resources/sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js create mode 100644 resources/sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min.js create mode 100644 resources/sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min.js create mode 100644 resources/sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min-7754fade75bed02e4097bf3d7fff178c.min.js create mode 100644 resources/sugarcoat-launch-ENbb9d0de7cc374dc99259df2c4b823cef.min-2eb9609b74432d652877d41a51a8d2ba.min.js create mode 100644 resources/sugarcoat-moatheader-7754008b0da848856cddb20094976335.min.js diff --git a/dist/resources.json b/dist/resources.json index 0637a088..7fc68814 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[] \ No newline at end of file +[{"name":"sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"dmFyIGZkeF9pbml0U0NWYXJzLGZkeF9kZWJ1ZyxmZHhfc2V0Q29va2llLGZkeF9nZXRDb29raWUsZmR4X2NhbXBhaWduLGZkeF9ndXAsZmR4X2ZpcmVTRG90VCxmZHhfZmlyZVNEb3RUTCxmZHhfc3BTcmNoLGxvZ0xpbmtWaWV3LGZkeF9sb2dMaW5rVmlldyxzZXRMaW5rVmlldyxmZHhfc2V0TGlua1ZpZXcsZmR4X2dldExpbmtWaWV3LGZkeF9saW5rRm9ybWF0LGZkeF90cmFja01hcHBpbmcsZmR4X2xvZ0Rvd25sb2FkLGxvZ1BhZ2VWaWV3LGZkeF9sb2dQYWdlVmlldyxsb2dQdXJjaGFzZSxmZHhfbG9nUHVyY2hhc2UsZmR4X2xvZ1B1cmNoYXNlTUFHUyxpc09iamVjdCxmZHhfbG9nUHVyY2hhc2VfUGFnZUxldmVsLGZkeF9sb2dQdXJjaGFzZU1BR1IsZmR4X2xvZ1B1cmNoYXNlV1JFRyxwcm9jZXNzRGF0YSxmZHhfY29udmVydFRvU3RyLGZkeF9sb2dDaGF0LHNfZG9QbHVnaW5zLGZkeF9pbml0UGx1Z2lucyxBcHBNZWFzdXJlbWVudF9Nb2R1bGVfSW50ZWdyYXRlLEFwcE1lYXN1cmVtZW50X01vZHVsZV9BdWRpZW5jZU1hbmFnZW1lbnQsQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0FjdGl2aXR5TWFwLEFwcE1lYXN1cmVtZW50LHNfZ2ksc19wZ2ljcSxmZHhfcnVuU0NvZGUsZmR4X2luaXRTQ29kZSxmZHhfY3JlYXRlQ3VzdG9tRXZlbnQsZmR4X2Rpc3BhdGNoQ3VzdG9tRXZlbnQsZmR4X2ZpcmVDdXN0b21FdmVudCxNQUdTRXZhck1hcHBpbmc7e2NvbnN0ICRfX19tb2NrX2M3Y2FlYzUwMWRjYTIzODc9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7bGV0IGlzU2VhbGVkPWZhbHNlO2NsYXNzIFN0b3JhZ2V7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfX1nZXQgbGVuZ3RoKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aH1rZXkoaW5kZXgpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7aWYoaW5kZXg8MHx8aW5kZXg+PWtleXMubGVuZ3RoKXtyZXR1cm4gbnVsbH1yZXR1cm4ga2V5c1tpbmRleF19Z2V0SXRlbShrZXkpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcyxrZXkpP3RoaXNba2V5XTpudWxsfXNldEl0ZW0oa2V5LHZhbHVlKXt0aGlzW2tleV09U3RyaW5nKHZhbHVlKX1yZW1vdmVJdGVtKGtleSl7ZGVsZXRlIHRoaXNba2V5XX1jbGVhcigpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7Zm9yKGNvbnN0IGtleSBvZiBrZXlzKXtkZWxldGUgdGhpc1trZXldfX19ZXhwb3J0cy5TdG9yYWdlPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6U3RvcmFnZSx3cml0YWJsZTp0cnVlfTtjb25zdCBsb2NhbFN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5sb2NhbFN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSxnZXQoKXtyZXR1cm4gbG9jYWxTdG9yYWdlfX07Y29uc3Qgc2Vzc2lvblN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5zZXNzaW9uU3RvcmFnZT17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLGdldCgpe3JldHVybiBzZXNzaW9uU3RvcmFnZX19O2lzU2VhbGVkPXRydWV9KSgkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3KTtjb25zdCAkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0PXt9OyhleHBvcnRzPT57InVzZSBzdHJpY3QiO2NvbnN0IHhoclVuc2VudD0wO2NvbnN0IHhock9wZW5lZD0xO2NvbnN0IHhockhlYWRlcnNSZWNlaXZlZD0yO2NvbnN0IHhockxvYWRpbmc9Mztjb25zdCB4aHJEb25lPTQ7Y29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2w9U3ltYm9sKCJkZWZlcnJlZEhhbmRsZSIpO2NvbnN0IHhock9uTG9hZFN0YXJ0U3ltYm9sPVN5bWJvbCgib25sb2Fkc3RhcnQiKTtjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sPVN5bWJvbCgib25wcm9ncmVzcyIpO2NvbnN0IHhock9uQWJvcnRTeW1ib2w9U3ltYm9sKCJvbmFib3J0Iik7Y29uc3QgeGhyT25FcnJvclN5bWJvbD1TeW1ib2woIm9uZXJyb3IiKTtjb25zdCB4aHJPbkxvYWRTeW1ib2w9U3ltYm9sKCJvbmxvYWQiKTtjb25zdCB4aHJPblRpbWVvdXRTeW1ib2w9U3ltYm9sKCJvbnRpbWVvdXQiKTtjb25zdCB4aHJPbkxvYWRFbmRTeW1ib2w9U3ltYm9sKCJvbmxvYWRlbmQiKTtjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2w9U3ltYm9sKCJvbnJlYWR5c3RhdGVjaGFuZ2UiKTtjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sPVN5bWJvbCgicmVhZHlTdGF0ZSIpO2NvbnN0IHhoclRpbWVvdXRTeW1ib2w9U3ltYm9sKCJ0aW1lb3V0Iik7Y29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIik7Y29uc3QgeGhyVXBsb2FkU3ltYm9sPVN5bWJvbCgidXBsb2FkIik7Y29uc3QgeGhyUmVzcG9uc2VUeXBlU3ltYm9sPVN5bWJvbCgicmVzcG9uc2VUeXBlIik7Y29uc3QgZGVmaW5lRXZlbnQ9KG9iaixzeW1ib2wpPT57Y29uc3QgdHlwZT1zeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosc3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpudWxsLHdyaXRhYmxlOnRydWV9KTtvYmouYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGZ1bmN0aW9uKGV2ZW50KXtjb25zdCBoYW5kbGVyPXRoaXNbc3ltYm9sXTtpZihoYW5kbGVyKXtoYW5kbGVyLmNhbGwodGhpcyxldmVudCl9fSl9O2NvbnN0IGNoYW5nZVJlYWR5U3RhdGU9KHhocixyZWFkeVN0YXRlKT0+e3hoclt4aHJSZWFkeVN0YXRlU3ltYm9sXT1yZWFkeVN0YXRlO3hoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVhZHlzdGF0ZWNoYW5nZSIpKX07bGV0IGlzU2VhbGVkPXRydWU7Y2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtpZighKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkmJiEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWRlZmluZUV2ZW50KHRoaXMseGhyT25Mb2FkU3RhcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25Qcm9ncmVzc1N5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkFib3J0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uRXJyb3JTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25Mb2FkU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uVGltZW91dFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRFbmRTeW1ib2wpfWdldCBvbmxvYWRzdGFydCgpe3JldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXX1zZXQgb25sb2Fkc3RhcnQodmFsdWUpe3RoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdPXZhbHVlfWdldCBvbnByb2dyZXNzKCl7cmV0dXJuIHRoaXNbeGhyT25Qcm9ncmVzc1N5bWJvbF19c2V0IG9ucHJvZ3Jlc3ModmFsdWUpe3RoaXNbeGhyT25Qcm9ncmVzc1N5bWJvbF09dmFsdWV9Z2V0IG9uYWJvcnQoKXtyZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXX1zZXQgb25hYm9ydCh2YWx1ZSl7dGhpc1t4aHJPbkFib3J0U3ltYm9sXT12YWx1ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdfXNldCBvbmVycm9yKHZhbHVlKXt0aGlzW3hock9uRXJyb3JTeW1ib2xdPXZhbHVlfWdldCBvbnRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdfXNldCBvbnRpbWVvdXQodmFsdWUpe3RoaXNbeGhyT25UaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgb25sb2FkZW5kKCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXX1zZXQgb25sb2FkZW5kKHZhbHVlKXt0aGlzW3hock9uTG9hZEVuZFN5bWJvbF09dmFsdWV9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldD17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsd3JpdGFibGU6dHJ1ZX07Y2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7aWYoaXNTZWFsZWQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKX1zdXBlcigpfX1leHBvcnRzLlhNTEh0dHBSZXF1ZXN0VXBsb2FkPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RVcGxvYWQsd3JpdGFibGU6dHJ1ZX07Y2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtpc1NlYWxlZD1mYWxzZTtjb25zdCB4aHJVcGxvYWQ9bmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkO2lzU2VhbGVkPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO2RlZmluZUV2ZW50KHRoaXMseGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZWFkeVN0YXRlU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVbnNlbnQsd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclRpbWVvdXRTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOjAsd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ZmFsc2Usd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclVwbG9hZFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6eGhyVXBsb2FkLHdyaXRhYmxlOmZhbHNlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyUmVzcG9uc2VUeXBlU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiIix3cml0YWJsZTp0cnVlfSl9Z2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpe3JldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSl7dGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdPXZhbHVlfWdldCByZWFkeVN0YXRlKCl7cmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF19b3BlbihtZXRob2QsdXJsKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJEb25lOntjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyT3BlbmVkKTticmVha319fXNldFJlcXVlc3RIZWFkZXIobmFtZSx2YWx1ZSl7fXNldFRydXN0VG9rZW4odHJ1c3RUb2tlbil7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbeGhyVGltZW91dFN5bWJvbF19c2V0IHRpbWVvdXQodmFsdWUpe3RoaXNbeGhyVGltZW91dFN5bWJvbF09dmFsdWV9Z2V0IHdpdGhDcmVkZW50aWFscygpe3JldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF19c2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSl7c3dpdGNoKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pe2Nhc2UgeGhyVW5zZW50OmNhc2UgeGhyT3BlbmVkOnticmVha31kZWZhdWx0Ont0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAnd2l0aENyZWRlbnRpYWxzJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELiIpfX10aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF09ISF2YWx1ZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbeGhyVXBsb2FkU3ltYm9sXX1zZW5kKCl7aWYodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXT09PXhock9wZW5lZCYmdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09PT1udWxsKXt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1zZXRUaW1lb3V0KCgpPT57dGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09bnVsbDtjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyRG9uZSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWVsc2V7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIGV4ZWN1dGUgJ3NlbmQnIG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSBvYmplY3QncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4iKX19YWJvcnQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSE9PW51bGwpe2NsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7dGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09bnVsbDtjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyVW5zZW50KTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImFib3J0IikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX19Z2V0IHJlc3BvbnNlVVJMKCl7cmV0dXJuIiJ9Z2V0IHN0YXR1cygpe3JldHVybiAwfWdldCBzdGF0dXNUZXh0KCl7cmV0dXJuIiJ9Z2V0UmVzcG9uc2VIZWFkZXIobmFtZSl7cmV0dXJuIG51bGx9b3ZlcnJpZGVNaW1lVHlwZShtaW1lKXt9Z2V0IHJlc3BvbnNlVHlwZSgpe3JldHVybiB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF19c2V0IHJlc3BvbnNlVHlwZSh2YWx1ZSl7c3dpdGNoKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pe2Nhc2UgeGhyRG9uZTp7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3Jlc3BvbnNlVHlwZScgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLiIpfX1zd2l0Y2godmFsdWUpe2Nhc2UiIjpjYXNlImFycmF5YnVmZmVyIjpjYXNlImJsb2IiOmNhc2UiZG9jdW1lbnQiOmNhc2UianNvbiI6Y2FzZSJ0ZXh0Ijp7dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdPXZhbHVlO2JyZWFrfX19Z2V0IHJlc3BvbnNlKCl7Y29uc3QgcmVzcG9uc2VUeXBlPXRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTtyZXR1cm4gcmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Ij8iIjpudWxsfWdldCByZXNwb25zZVRleHQoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO2lmKHJlc3BvbnNlVHlwZT09PSIifHxyZXNwb25zZVR5cGU9PT0idGV4dCIpe3JldHVybiIifWVsc2V7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9fWdldCByZXNwb25zZVhNTCgpe3JldHVybiBudWxsfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIlVOU0VOVCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyVW5zZW50fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJPUEVORUQiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhock9wZW5lZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhySGVhZGVyc1JlY2VpdmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJMT0FESU5HIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJMb2FkaW5nfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJET05FIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJEb25lfSk7ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdD17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlhNTEh0dHBSZXF1ZXN0LHdyaXRhYmxlOnRydWV9fSkoJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NCk7KGZ1bmN0aW9uKCl7ZmR4X2luaXRTQ1ZhcnM9JF9fX3Zhcl8xMGZmMzEzNDlkNmU2ZWNjOyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2luaXRTQ1ZhcnMsIm5hbWUiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiJmZHhfaW5pdFNDVmFycyIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfZGVidWc9JF9fX3Zhcl83MzY5NzZkMzczZTk5OTg3Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2RlYnVnLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2RlYnVnIix3cml0YWJsZTpmYWxzZX0pO2ZkeF9zZXRDb29raWU9JF9fX3Zhcl9jODE4NWE4YzA0ZmY1Y2M1Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X3NldENvb2tpZSwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9zZXRDb29raWUiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2dldENvb2tpZT0kX19fdmFyXzRiMzZmMmU1N2FlNTg4YjM7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZ2V0Q29va2llLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2dldENvb2tpZSIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfY2FtcGFpZ249JF9fX3Zhcl8zZTU4YWQ2MWJmMjU2OTdiOyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2NhbXBhaWduLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2NhbXBhaWduIix3cml0YWJsZTpmYWxzZX0pO2ZkeF9ndXA9JF9fX3Zhcl84MTZmNGQwNzBhZjAwMDc4Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2d1cCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9ndXAiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2ZpcmVTRG90VD0kX19fdmFyXzBlMzBiZGFmYjU3YzVlNmM7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZmlyZVNEb3RULCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2ZpcmVTRG90VCIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfZmlyZVNEb3RUTD0kX19fdmFyXzA4MjhjMThhYzNlMWE3OTg7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZmlyZVNEb3RUTCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9maXJlU0RvdFRMIix3cml0YWJsZTpmYWxzZX0pO2ZkeF9zcFNyY2g9JF9fX3Zhcl81Mzg3YzA2ZDBlMmQ3ZmE2Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X3NwU3JjaCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9zcFNyY2giLHdyaXRhYmxlOmZhbHNlfSk7bG9nTGlua1ZpZXc9JF9fX3Zhcl8zZTMxY2JiNzZkZGNhYzYwOyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkobG9nTGlua1ZpZXcsIm5hbWUiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiJsb2dMaW5rVmlldyIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfbG9nTGlua1ZpZXc9JF9fX3Zhcl9iYmRmMzY1ZDc4OTk1OWI3Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xvZ0xpbmtWaWV3LCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2xvZ0xpbmtWaWV3Iix3cml0YWJsZTpmYWxzZX0pO3NldExpbmtWaWV3PSRfX192YXJfMzE3Y2MzNGM0YzYxOTBkMjsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHNldExpbmtWaWV3LCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToic2V0TGlua1ZpZXciLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X3NldExpbmtWaWV3PSRfX192YXJfMDlhZDliMjc1ZDYxMGMxYjsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9zZXRMaW5rVmlldywibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9zZXRMaW5rVmlldyIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfZ2V0TGlua1ZpZXc9JF9fX3Zhcl83MDhmMzlhZjIxY2IzM2I3Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2dldExpbmtWaWV3LCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2dldExpbmtWaWV3Iix3cml0YWJsZTpmYWxzZX0pO2ZkeF9saW5rRm9ybWF0PSRfX192YXJfZDlkYWYzOTc4NDhlNjhhNzsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9saW5rRm9ybWF0LCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2xpbmtGb3JtYXQiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X3RyYWNrTWFwcGluZz0kX19fdmFyXzI5OWM1NTkzMmFkMGE5ZGU7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfdHJhY2tNYXBwaW5nLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X3RyYWNrTWFwcGluZyIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfbG9nRG93bmxvYWQ9JF9fX3Zhcl9iOThkNGZjZDJlMWY0YWNjOyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xvZ0Rvd25sb2FkLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2xvZ0Rvd25sb2FkIix3cml0YWJsZTpmYWxzZX0pO2xvZ1BhZ2VWaWV3PSRfX192YXJfOWRhNTU3NDBkM2NkM2QwZDsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGxvZ1BhZ2VWaWV3LCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToibG9nUGFnZVZpZXciLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2xvZ1BhZ2VWaWV3PSRfX192YXJfMWJmYmJhYTU4NTA5ZmE5NTsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dQYWdlVmlldywibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9sb2dQYWdlVmlldyIsd3JpdGFibGU6ZmFsc2V9KTtsb2dQdXJjaGFzZT0kX19fdmFyXzU5OTMxYTJlMWVlOWI1MDc7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShsb2dQdXJjaGFzZSwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImxvZ1B1cmNoYXNlIix3cml0YWJsZTpmYWxzZX0pO2ZkeF9sb2dQdXJjaGFzZT0kX19fdmFyX2E4OGRjYTEzNTgxYjc2Yzk7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nUHVyY2hhc2UsIm5hbWUiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiJmZHhfbG9nUHVyY2hhc2UiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2xvZ1B1cmNoYXNlTUFHUz0kX19fdmFyXzg1Y2U5OWJiMTgyOTAyNTQ7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nUHVyY2hhc2VNQUdTLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2xvZ1B1cmNoYXNlTUFHUyIsd3JpdGFibGU6ZmFsc2V9KTtpc09iamVjdD0kX19fdmFyX2I0Yzc0ZDFkZjJhNTk0Mjk7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShpc09iamVjdCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImlzT2JqZWN0Iix3cml0YWJsZTpmYWxzZX0pO2ZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWw9JF9fX3Zhcl85MWYxZjgwM2Q5MTY4OGY4Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xvZ1B1cmNoYXNlX1BhZ2VMZXZlbCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWwiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2xvZ1B1cmNoYXNlTUFHUj0kX19fdmFyX2I1ZTNjZjM0YWNmMTNmM2M7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nUHVyY2hhc2VNQUdSLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2xvZ1B1cmNoYXNlTUFHUiIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfbG9nUHVyY2hhc2VXUkVHPSRfX192YXJfOTkyODcwZDYwMzgwNjgxNzsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dQdXJjaGFzZVdSRUcsIm5hbWUiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiJmZHhfbG9nUHVyY2hhc2VXUkVHIix3cml0YWJsZTpmYWxzZX0pO3Byb2Nlc3NEYXRhPSRfX192YXJfNjQzYzk5NDcyNzgzZjRhMjsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHByb2Nlc3NEYXRhLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToicHJvY2Vzc0RhdGEiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2NvbnZlcnRUb1N0cj0kX19fdmFyXzI5YWNiNmRkZWE2OWM0MTA7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfY29udmVydFRvU3RyLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X2NvbnZlcnRUb1N0ciIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfbG9nQ2hhdD0kX19fdmFyXzhjZTYyZGExMzM4OTVjZTk7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nQ2hhdCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9sb2dDaGF0Iix3cml0YWJsZTpmYWxzZX0pO3NfZG9QbHVnaW5zPSRfX192YXJfMmE4ZmY4MGVlMGYzY2U1NDsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHNfZG9QbHVnaW5zLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToic19kb1BsdWdpbnMiLHdyaXRhYmxlOmZhbHNlfSk7ZmR4X2luaXRQbHVnaW5zPSRfX192YXJfNzQ3ZjdhYzI0Y2ZmOWU1OTsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9pbml0UGx1Z2lucywibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9pbml0UGx1Z2lucyIsd3JpdGFibGU6ZmFsc2V9KTtBcHBNZWFzdXJlbWVudF9Nb2R1bGVfSW50ZWdyYXRlPSRfX192YXJfODQ1OTU2YTU4ZjA0ODFkODsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KEFwcE1lYXN1cmVtZW50X01vZHVsZV9JbnRlZ3JhdGUsIm5hbWUiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiJBcHBNZWFzdXJlbWVudF9Nb2R1bGVfSW50ZWdyYXRlIix3cml0YWJsZTpmYWxzZX0pO0FwcE1lYXN1cmVtZW50X01vZHVsZV9BdWRpZW5jZU1hbmFnZW1lbnQ9JF9fX3Zhcl9mZGNiMmI1ZmY4OGNkZDk2Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0F1ZGllbmNlTWFuYWdlbWVudCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6IkFwcE1lYXN1cmVtZW50X01vZHVsZV9BdWRpZW5jZU1hbmFnZW1lbnQiLHdyaXRhYmxlOmZhbHNlfSk7QXBwTWVhc3VyZW1lbnRfTW9kdWxlX0FjdGl2aXR5TWFwPSRfX192YXJfMTM4MjJhNDNlZWRkYWZhYzsoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KEFwcE1lYXN1cmVtZW50X01vZHVsZV9BY3Rpdml0eU1hcCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6IkFwcE1lYXN1cmVtZW50X01vZHVsZV9BY3Rpdml0eU1hcCIsd3JpdGFibGU6ZmFsc2V9KTtBcHBNZWFzdXJlbWVudD0kX19fdmFyXzJkZjgwMDUzODQzOWI4MTE7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShBcHBNZWFzdXJlbWVudCwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6IkFwcE1lYXN1cmVtZW50Iix3cml0YWJsZTpmYWxzZX0pO3NfZ2k9JF9fX3Zhcl8xNDExYmNlOWUyYmM2Yjg1Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoc19naSwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6InNfZ2kiLHdyaXRhYmxlOmZhbHNlfSk7c19wZ2ljcT0kX19fdmFyXzM4NTE4OWRjN2U1NThlYjA7KHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShzX3BnaWNxLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToic19wZ2ljcSIsd3JpdGFibGU6ZmFsc2V9KTtmZHhfcnVuU0NvZGU9JF9fX3Zhcl84YmYxYWI3ZWQyOTdiMmM4Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X3J1blNDb2RlLCJuYW1lIix7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiZmR4X3J1blNDb2RlIix3cml0YWJsZTpmYWxzZX0pO2ZkeF9pbml0U0NvZGU9JF9fX3Zhcl85YjJhNGMyZjc2ZTczYTE2Oyh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2luaXRTQ29kZSwibmFtZSIse2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ImZkeF9pbml0U0NvZGUiLHdyaXRhYmxlOmZhbHNlfSk7ZnVuY3Rpb24gJF9fX3Zhcl8xMGZmMzEzNDlkNmU2ZWNjKCl7d2luZG93LnNjX2NvZGVfdmVyPSIzLjAuNDAiLHdpbmRvdy5zY19jb2RlX3Zlcl9kYXRlPSIwNjE1MjAyMS4wMSIsd2luZG93LnNfdmVyc2lvbj0iQU0uMi4yMi4wIix3aW5kb3cuc19hY2NvdW50PSJmZWRleGdsYmxkZXYiLCJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIiksd2luZG93Lnd3d0hvc3Q9X2ZkeC5wY2ZVdGlsKCksInd3dy5mZWRleC5jb20iPT13d3dIb3N0JiYoc19hY2NvdW50PV9zYXRlbGxpdGUuZ2V0VmFyKCJzQWNjb3VudCIpKSx3aW5kb3cucz1zX2dpKHNfYWNjb3VudCkscy5wYWdlTG9hZENvbXBsZXRlPSExLHMudHJhY2tEb3dubG9hZExpbmtzPSEwLHMudHJhY2tFeHRlcm5hbExpbmtzPSEwLHMudHJhY2tJbmxpbmVTdGF0cz0hMCxzLmxpbmtEb3dubG9hZEZpbGVUeXBlcz0iZXhlLHppcCx3YXYsbXAzLG1wNCxtb3YsbXBnLGF2aSx3bXYscGRmLGRvYyxkb2N4LHhscyx4bHN4LHBwdCxwcHR4LHBuZyIscy5saW5rTGVhdmVRdWVyeVN0cmluZz0hMSxzLmxpbmtUcmFja1ZhcnM9Ik5vbmUiLHMubGlua1RyYWNrRXZlbnRzPSJOb25lIixzLnVzZVBsdWdpbnM9ITAscy5saW5rSW50ZXJuYWxGaWx0ZXJzPSJqYXZhc2NyaXB0OixmZWRleC5jb20saWFtZmVkZXguY29tLGZlZGV4YWRzLmRlc2lnbmNkdC5jb20sa2lua29zZGV2LmNvbSxraW5rb3N0ZXN0LmNvbSxzZW5zZWF3YXJlLmNvbSxmZWRleHNhbWVkYXkuY29tLGZlZGV4LnAuZGVsaXZlcnkubmV0LGZlZGV4LmNvLmpwLHBzZy5raW5rb3MuY29tLGZlZGV4Y2FyZXMuY29tLGJvbmdvdXMuY29tIix3aW5kb3cubmx0cms9IiJ9ZnVuY3Rpb24gJF9fX3Zhcl83MzY5NzZkMzczZTk5OTg3KGUsdCxuKXt0PXZvaWQgMCE9PXQ/IlsiK3QrIl0gIjoiIixuPXZvaWQgMCE9PW4/IlsiK24rIl0gIjoiIix3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2c/Y29uc29sZS5sb2codCtuK2UpOndpbmRvdy5vcGVyYSYmb3BlcmEucG9zdEVycm9yJiZvcGVyYS5wb3N0RXJyb3IodCtuK2UpO3RyeXt2YXIgaT12b2lkIDAhPT1mZHhfZ2V0Q29va2llKCJmZHhfZGVidWciKT9mZHhfZ2V0Q29va2llKCJmZHhfZGVidWciKS5zcGxpdCgiLCIpOltdLHI9X2ZkeC5nZXRUZXN0TGV2ZWwoKSxhPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyJ8Iit0K24rZSsifCIrcisifCIrKCJ1bmRlZmluZWQiIT10eXBlb2YgcyYmcy5wYWdlTmFtZT9zLnBhZ2VOYW1lOmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2kucHVzaChhLnJlcGxhY2UoLywvZywiIyMiKSksZmR4X3NldENvb2tpZSgiZmR4X2RlYnVnIixpLDEsIi8iLCIuZmVkZXguY29tIil9Y2F0Y2gobyl7fX1mdW5jdGlvbiAkX19fdmFyX2M4MTg1YThjMDRmZjVjYzUoZSx0LG4saSxyKXt0cnl7aWYobnVsbCE9PXQpe3ZhciBhPWVzY2FwZSh0KTtpZigiIiE9PW4pe3ZhciBzPW5ldyBEYXRlO3Muc2V0RGF0ZShzLmdldERhdGUoKStuKSxhKz1udWxsPT09bj8iIjoiOyBleHBpcmVzPSIrcy50b1VUQ1N0cmluZygpfWErPW51bGwhPWk/IjsgcGF0aD0iK2k6IiIsYSs9bnVsbCE9cj8iOyBkb21haW49IityOiIiLGRvY3VtZW50LmNvb2tpZT1lKyI9IithfX1jYXRjaChvKXtmZHhfZGVidWcobywiQ0lNIiwiZmR4X3NldENvb2tpZSIpfX1mdW5jdGlvbiAkX19fdmFyXzRiMzZmMmU1N2FlNTg4YjMoZSl7dHJ5e2Zvcih2YXIgdCxuPXt9LGk9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpLHI9MDtyPGkubGVuZ3RoO3IrKyluWyh0PWlbcl0uc3BsaXQoIj0iKSlbMF1dPXVuZXNjYXBlKHRbMV0pO3JldHVybiBuW2VdfWNhdGNoKGEpe2ZkeF9kZWJ1ZyhhLCJDSU0iLCJmZHhfZ2V0Q29va2llIil9fWZ1bmN0aW9uICRfX192YXJfM2U1OGFkNjFiZjI1Njk3Yigpe3RyeXtyZXR1cm4gZmR4X2d1cCh3aW5kb3cubG9jYXRpb24hPXdpbmRvdy5wYXJlbnQubG9jYXRpb24/ZG9jdW1lbnQucmVmZXJyZXI6ZG9jdW1lbnQubG9jYXRpb24sImNtcCIpfWNhdGNoKGUpe3JldHVybiBmZHhfZGVidWcoZSwiU0MiLCJmZHhfY2FtcGFpZ24iKSwiIn19ZnVuY3Rpb24gJF9fX3Zhcl84MTZmNGQwNzBhZjAwMDc4KGUsdCl7dD10LnJlcGxhY2UoL1tcW10vLCJcXFsiKS5yZXBsYWNlKC9bXF1dLywiXFxdIik7dmFyIG49bmV3IFJlZ0V4cCgiW1xcPyZdIit0KyI9KFteJiNdKikiLCJpIikuZXhlYyhlKTtyZXR1cm4gbnVsbD09bj8iIjpuWzFdfWZ1bmN0aW9uICRfX192YXJfMGUzMGJkYWZiNTdjNWU2Yygpe3RyeXtzLmRlbGF5Vj0hMTtzLnQoKTtzLmV2ZW50cz0iIixzLmxpc3QxPSIiLHMubGlzdDI9IiIscy5saXN0Mz0iIixzRXZudHNPbmNlPSIiLHMuY193KCJTQ19MSU5LUyIsIiIpLHMuY193KCJzZXRMaW5rIiwiIil9Y2F0Y2goZSl7ZmR4X2RlYnVnKGUsIlNDIiwiZmR4X2ZpcmVTRG90VCIpfX1mdW5jdGlvbiAkX19fdmFyXzA4MjhjMThhYzNlMWE3OTgoZSx0LG4pe3RyeXtzLmxpbmtUcmFja1ZhcnM9cy5hcGwocy5saW5rVHJhY2tWYXJzLCJwcm9wNTAiLCIsIiwyKSxzLnRsKGUsdCxuKSxzLmxpbmtUcmFja1ZhcnM9Ik5vbmUiLHMubGlua1RyYWNrRXZlbnRzPSJOb25lIixzLmV2ZW50cz0iIixzLmxpc3QxPSIiLHMubGlzdDI9IiIscy5saXN0Mz0iIixzLmNfdygiU0NfTElOS1MiLCIiKSxzLmNfdygic2V0TGluayIsIiIpfWNhdGNoKGkpe2ZkeF9kZWJ1ZyhpLCJTQyIsImZkeF9maXJlU0RvdFRMIil9fWZ1bmN0aW9uICRfX192YXJfNTM4N2MwNmQwZTJkN2ZhNihlKXt2YXIgdD1zLlV0aWwuZ2V0UXVlcnlQYXJhbSgicSIpLG49X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIikscj0oMDxlLnRvdGFsUmVzdWx0Q291bnQ/IlN1Y2Nlc3MiOiJGYWlsdXJlIikrIjoiK2UudG90YWxSZXN1bHRDb3VudCsiOiIrbjtpZih0KXtzLnByb3A0OT10LHMucHJvcDQ5PXMucHJvcDQ5LnRvTG93ZXJDYXNlKCksMD09cy5wcm9wNDkuaW5kZXhPZigiKyIpJiYocy5wcm9wNDk9cy5wcm9wNDkucmVwbGFjZSgiKyIsIiAgIikpLHMucHJvcDQ5PXMucmVwbChzLnByb3A0OSwiKyIsIiAiKSxzLnByb3A0OT1zLnJlcGwocy5wcm9wNDksIiAgIiwiICsiKS5yZXBsYWNlKC9eXHMrLywiIiksMDxlLnRvdGFsUmVzdWx0Q291bnQ/KHMucHJvcDE9cy5lVmFyMT1zLnByb3A0OSxzLmV2ZW50cz1zLmFwbChzLmV2ZW50cywiZXZlbnQxMTgiLCIsIiwyKSk6KHMucHJvcDE9cy5lVmFyMT0iMDoiK3MucHJvcDQ5LHMuZXZlbnRzPXMuYXBsKHMuZXZlbnRzLCJldmVudDExOSIsIiwiLDIpKSx2b2lkIDAhPT1yJiYiIiE9PXImJihzLnByb3A0OT1yKyI6IitzLnByb3A0OSk7dmFyIGE9IiI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBGRFguREFUQUxBWUVSLnNlYXJjaC5yZXN1bHQuYmFubmVyJiYiIiE9RkRYLkRBVEFMQVlFUi5zZWFyY2gucmVzdWx0LmJhbm5lciYmRkRYLkRBVEFMQVlFUi5zZWFyY2gucmVzdWx0LmJhbm5lcil7dmFyIG89ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiY3Etc2VhcmNocHJvbW90ZS1iYW5uZXJzIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2ZvcihpPTA7aTxvLmxlbmd0aDtpKyspe3ZhciBjPW9baV07aWYoImZ4Zy1pbWFnZS1jb21wb25lbnRfX2ltYWdlIj09Yy5jbGFzc05hbWUmJigidW5kZWZpbmVkIiE9dHlwZW9mIGMuY2hpbGRyZW5bMF0uYXR0cmlidXRlc1siZGF0YS1hbmFseXRpY3MiXSYmKGErPSIkIitjLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbImRhdGEtYW5hbHl0aWNzIl0udmFsdWUpLDA8PWEuaW5kZXhPZigiU1BCfFJlc3VsdHMgTm90IEZvdW5kIEltYWdlIikpKXthPSJTUEJ8UmVzdWx0cyBOb3QgRm91bmQgSW1hZ2UiO2JyZWFrfX0iIiE9PWEmJmEmJihhPWEucmVwbGFjZSgiJCIsIiIpLHMucHJvcDQ5PXMucHJvcDQ5KyI6IithKX1zLmVWYXI0OT0iRD1jNDkifX1mdW5jdGlvbiAkX19fdmFyXzNlMzFjYmI3NmRkY2FjNjAoZSx0LG4saSl7ZmR4X2xvZ0xpbmtWaWV3KGUsdCxuLGkpfWZ1bmN0aW9uICRfX192YXJfYmJkZjM2NWQ3ODk5NTliNyhlLHQpe3ZvaWQgMD09PXQmJih0PSIiKSwtMTxzLmV2ZW50cy5pbmRleE9mKCJldmVudDkwNCIpJiYocy5saW5rVHJhY2tFdmVudHM9cy5ldmVudHM9cy5ldmVudHM9cy5yZmwocy5ldmVudHMsImV2ZW50OTA0IikpO3ZhciBuPVsidHJrLWxhbmRpbmdQYWdlMVRyYWNraW5nTnVtYmVyc1ByZXNlbnQiLCJ0cmstbGFuZGluZ1BhZ2UtVHJhY2tCdG4iLCJ0cmstdHJhY2tCeVJlZmVyZW5jZS1UcmFja0J0biIsInRyay10cmFja0J5VENOLVRyYWNrQnRuIiwidHJrLWxhbmRpbmdQYWdlLXRyYWNrLWhlbHBMaW5rIiwidHJrLWxhbmRpbmdQYWdlLW11bGl0aXBsZVRyYWNraW5nTnVtYmVyTGluayIsInRyay1sYW5kaW5nUGFnZS1zaW5nbGVUcmFja2luZ051bWJlckxpbmsiLCJ0cmstdHJhY2tCeVJlZmVyZW5jZS1EZXN0aW5hdGlvbkNvdW50cnkiLCJ0cmstbGFuZGluZ1BhZ2UtcHJvbXB0VG9Mb2dpbmZvckJPTCIsInRyay1PUE9ELWNhbmNlbCIsInRyay1PUE9ELVByaW50TGV0dGVyLVN1Ym1pdCIsInRyay1PUE9ELUVtYWlsTGV0dGVyLVN1Ym1pdCIsInRyay1PUE9ELUZheC1TdWJtaXQiLCJ0cmstbGFuZGluZ3BhZ2UtYm9sRG93bmxvYWRCdXR0b24iLCJ0cmstbGFuZGluZ1BhZ2UtdHJhY2staGVscExpbmsiXTtpZigxPT0hIShfc2F0ZWxsaXRlLmdldFZhcigiY2xpY2s6YmxvY2tGbGFnIikoZSwiY2xpY2s6YmxvY2tMaXN0Iil8fC0xPGUuaW5kZXhPZigidmFQb3BpbkFzayIpKSlyZXR1cm4tMTxuLmluZGV4T2YoZS50cmltKCkpJiZmZHhfc2V0TGlua1ZpZXcoZSksITA7aWYobnVsbCE9ZSl7LTE8KGU9ZmR4X2xpbmtGb3JtYXQoZSkpLmluZGV4T2YoInRyay0iKSYmKGU9ZmR4X3RyYWNrTWFwcGluZyhlKSk7dmFyIGk9bmV3IERhdGUscj0oaS5nZXRNb250aCgpLGkuZ2V0RGF0ZSgpLGkuZ2V0RnVsbFllYXIoKSxpLmdldEhvdXJzKCksaS5nZXRNaW51dGVzKCkpO3I8MTAmJihyPSIwIityKTt2YXIgYT1pLmdldFNlY29uZHMoKTthPDEwJiYoYT0iMCIrYSk7cy5saW5rVHJhY2tWYXJzPSJwcm9wMixwcm9wMyxwcm9wNCxwcm9wNSxwcm9wNixwcm9wMTgscHJvcDE5LHByb3AyMCxwcm9wMzEscHJvcDMzLHByb3AzNSxwcm9wNDEscHJvcDQ4LHByb3A1Mixwcm9wNTQscHJvcDU1LHByb3A1Nixwcm9wNzAscHJvcDcxLGVWYXI0LGVWYXI2LGVWYXIxMSxlVmFyMTMsZVZhcjQzLGVWYXI1MCxlVmFyNTIsZVZhcjU2LGVWYXI1MyxldmVudHMiLHMuZVZhcjQ9X3NhdGVsbGl0ZS5nZXRWYXIoImxvZ2luOnN0YXR1cyIpLCJoZHJ8TG9naW4iPT1lJiYodCs9ImV2ZW50MyIpLCJoZHJ8U0lHTiBPVVQiPT1lJiYodCs9ImV2ZW50MTAiLHMuZVZhcjQ9IkxvZ2dlZCBPdXQiKSx0JiYocy5saW5rVHJhY2tFdmVudHM9dCxzLmV2ZW50cz10KSxzLnByb3A0PSJEPXY0IixzLnByb3A1PV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnJlZ2lvbiIpLHMucHJvcDY9IkQ9djYiLHMucHJvcDE4PXMucGFnZU5hbWUscy5wcm9wMTk9ZSxzLnByb3AyMD1zLnBhZ2VOYW1lKyI6IitlLHMucHJvcDMxPSIiIT09cy52aXNpdG9yLmdldEFuYWx5dGljc1Zpc2l0b3JJRCgpPyJbQ1NddjF8IitzLnZpc2l0b3IuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKCkrIltDRV0iOnMudmlzaXRvci5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLHMucHJvcDMzPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnBhZ2UgdHlwZSIpLHMucHJvcDQxPSJEPXY0MSIscy5wcm9wNDM9IkQ9djQzIjt2YXIgbz1uZXcgRGF0ZSxjPW8uZ2V0TW9udGgoKSsxLGw9by5nZXREYXRlKCksdT1vLmdldEZ1bGxZZWFyKCk7cmV0dXJuIHMucHJvcDUyPXMuZVZhcjUyPXUrIi0iK2MrIi0iK2wscy5wcm9wNTQ9IkQ9djU0IixzLnByb3A1NT0iRD12NTUiLHMuZVZhcjY9X3NhdGVsbGl0ZS5nZXRWYXIoImxvZ2luOnVzZXItaWQiKSxzLmVWYXI0Mz0iTDoiK2Uscy5lVmFyNTY9cy5wcm9wNTY9ZSxzLmVWYXI1Mz0iKzEiLG5sdHJrPSJ5IixmZHhfZmlyZVNEb3RUTCh0aGlzLCJvIixlKSwhMH19ZnVuY3Rpb24gJF9fX3Zhcl8zMTdjYzM0YzRjNjE5MGQyKGUpe2ZkeF9zZXRMaW5rVmlldyhlKX1mdW5jdGlvbiAkX19fdmFyXzA5YWQ5YjI3NWQ2MTBjMWIoZSl7LTE8KGU9ZmR4X2xpbmtGb3JtYXQoZSkpLmluZGV4T2YoInRyay0iKSYmKGU9ZmR4X3RyYWNrTWFwcGluZyhlKSk7dmFyIHQ9cy5wYWdlTmFtZSsiXl4iK2UrIl5eIitzLnBhZ2VOYW1lKyIgfCAiK2UrIl5eIjtyZXR1cm4gcy5jX3coInNldExpbmsiLHQsMCksITB9ZnVuY3Rpb24gJF9fX3Zhcl83MDhmMzlhZjIxY2IzM2I3KCl7dHJ5e3ZhciBlPXMuY19yKCJzZXRMaW5rIik7aWYodm9pZCAwIT09ZSYmIiIhPWUpe3ZhciB0PWUuc3BsaXQoIl5eIik7cy5wcm9wMTg9dFswXSxzLnByb3AxOT10WzFdLHMucHJvcDIwPXRbMl0scy5jX3coIlNDX0xJTktTIiwiIil9fWNhdGNoKG4pe2ZkeF9kZWJ1ZyhuLCJTQyIsImZkeF9nZXRMaW5rVmlldyIpfX1mdW5jdGlvbiAkX19fdmFyX2Q5ZGFmMzk3ODQ4ZTY4YTcoZSl7Zm9yKHZhciB0PWUuc3BsaXQoInwiKSxuPSIiLGk9MDtpPHQubGVuZ3RoO2krKykiIiE9biYmKG4rPSJ8Iiksbis9dFtpXS50cmltKCk7cmV0dXJuIG59ZnVuY3Rpb24gJF9fX3Zhcl8yOTljNTU5MzJhZDBhOWRlKGUpe3ZhciB0PV9zYXRlbGxpdGUuZ2V0VmFyKCJ0cmFjazpidG5NYXBwaW5nIik7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB0W2VdP2U6dFtlXX1mdW5jdGlvbiAkX19fdmFyX2I5OGQ0ZmNkMmUxZjRhY2MoZSx0KXtzLmxpbmtUcmFja1ZhcnM9ImVWYXI2LGVWYXIxMTAsZVZhcjQzLHByb3AzNyxwcm9wNzAscHJvcDcxLGV2ZW50cyI7dHJ5e2lmKHZvaWQgMCE9PWUpe2lmKHMucHJvcDM3PWUudG9TdHJpbmcoKSwic2luZ2xlIj09dC50b0xvd2VyQ2FzZSgpKXMuZXZlbnRzPXMuYXBsKHMuZXZlbnRzLCJldmVudDEyIiwiLCIsMikscy5saW5rVHJhY2tFdmVudHM9ImV2ZW50MTIiO2Vsc2UgaWYoIm11bHRpcGxlIj09dC50b0xvd2VyQ2FzZSgpKXt2YXIgbj0wOyJmYWlsZWQiIT1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSYmKG49ZS5sZW5ndGgpLHMuZXZlbnRzPXMuYXBsKHMuZXZlbnRzLCJldmVudDE4MT0iK24sIiwiLDIpLHMubGlua1RyYWNrRXZlbnRzPSJldmVudDE4MSJ9cmV0dXJuIGZkeF9maXJlU0RvdFRMKHRoaXMsImQiKSwhMH19Y2F0Y2goaSl7ZmR4X2RlYnVnKGksIlNDIiwiZmR4X2xvZ0Rvd25sb2FkIil9fWZ1bmN0aW9uICRfX192YXJfOWRhNTU3NDBkM2NkM2QwZChlLHQsbixpLHIsYSl7ZmR4X2xvZ1BhZ2VWaWV3KGUsdCxuLGkscixhKX1mdW5jdGlvbiAkX19fdmFyXzFiZmJiYWE1ODUwOWZhOTUoZSx0LG4saSxyKXt0cnl7dmFyIGE9IiI7d3d3SG9zdC5tYXRjaCgvd3d3KHNib3guaWRldnxiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpJiYoYT0iZmVkZXgvIiksYSE9ZS5zbGljZSgwLGEubGVuZ3RoKSYmKGU9YStlKSxzLnBhZ2VOYW1lPWUsZmR4X2dldExpbmtWaWV3KCksdD8ocy5saW5rVHJhY2tFdmVudHM9dCxzLmV2ZW50cz10KToocy5saW5rVHJhY2tFdmVudHM9IiIscy5ldmVudHM9IiIpO3ZhciBvPV9zYXRlbGxpdGUuZ2V0VmFyKCJzZWFyY2g6c3BEYXRhIik7dm9pZCAwIT09byYmIiIhPW8mJmZkeF9zcFNyY2gobyksbiYmKHMucHJvcDQ9biksaSYmKHMucHJvcDc0PWkpO3ZhciBjPW5ldyBEYXRlLGw9KGMuZ2V0TW9udGgoKSxjLmdldERhdGUoKSxjLmdldEZ1bGxZZWFyKCksYy5nZXRIb3VycygpLGMuZ2V0TWludXRlcygpKTtsPDEwJiYobD0iMCIrbCk7dmFyIHU9Yy5nZXRTZWNvbmRzKCk7dTwxMCYmKHU9IjAiK3UpO3MuZVZhcjQzPSJWOiIrcy5wYWdlTmFtZSxzLnByb3A0Mz0iRD12NDMiO3ZhciBkPW5ldyBEYXRlLHA9ZC5nZXRNb250aCgpKzEsZj1kLmdldERhdGUoKSxnPWQuZ2V0RnVsbFllYXIoKTtzLnByb3A1Mj1zLmVWYXI1Mj1nKyItIitwKyItIitmLHI/KHMuZGVsYXlWPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZmR4X2ZpcmVTRG90VCgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCJlcnJvcjoiK2UpfX0sMmUzKSk6ZmR4X2ZpcmVTRG90VCgpfWNhdGNoKHYpe2NvbnNvbGUubG9nKCJlcnJvcjoiK3YpfX1mdW5jdGlvbiAkX19fdmFyXzU5OTMxYTJlMWVlOWI1MDcoZSx0KXt2b2lkIDAhPT1lJiZmZHhfbG9nUHVyY2hhc2UoZSx0KX1mdW5jdGlvbiAkX19fdmFyX2E4OGRjYTEzNTgxYjc2YzkoZSx0KXt0cnl7dmFyIG49cy5ldmVudHM9IiI7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBlLkxvZ1B1cmNoYXNlUmVxdWVzdCYmbnVsbCE9PWUuTG9nUHVyY2hhc2VSZXF1ZXN0JiYoZS5Mb2dQdXJjaGFzZVJlcXVlc3QuY2xpZW50SWQmJihlLkxvZ1B1cmNoYXNlUmVxdWVzdC5jbGllbnRJZD1lLkxvZ1B1cmNoYXNlUmVxdWVzdC5jbGllbnRJZC50b1VwcGVyQ2FzZSgpKSwiTUFHUyI9PWUuTG9nUHVyY2hhc2VSZXF1ZXN0LmNsaWVudElkJiYoZmR4X2xvZ1B1cmNoYXNlTUFHUyhlLkxvZ1B1cmNoYXNlUmVxdWVzdCx0KSxuPSJNQUdTU2hpcEJ0biIpLCJNQUdSIj09ZS5Mb2dQdXJjaGFzZVJlcXVlc3QuY2xpZW50SWQmJihmZHhfbG9nUHVyY2hhc2VNQUdSKGUuTG9nUHVyY2hhc2VSZXF1ZXN0LHQpLG49Ik1BR1JSYXRlQnRuIikpLG51bGwhPWUmJiJNQUdTIj09ZS5jbGllbnRJZCYmInVuZGVmaW5lZCIhPT1lLnBhZ2VOYW1lJiZudWxsIT09ZS5wYWdlTmFtZSYmIiIhPT1lLnBhZ2VOYW1lJiYoZmR4X2xvZ1B1cmNoYXNlX1BhZ2VMZXZlbChlLHQpLG49ZS5wYWdlTmFtZSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLmFwcElkJiZudWxsIT09ZS5hcHBJZCYmIldSRUciPT1lLmFwcElkJiYoZmR4X2xvZ1B1cmNoYXNlV1JFRyhlLHQpLG49IldSRUdSZWdpc3RlckJ0biIpLCIiIT09cy5ldmVudHMmJihubHRyaz0ieSIscy5lVmFyNDA9IkQ9ZXZlbnRzIixzLnByb3A0MD0iRD1ldmVudHMiLHMucHJvcDQzPSJEPXY0MyIscy5wcm9wMTg9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cGFnZSBuYW1lIikscy5wcm9wMTk9bixzLnByb3AyMD1zLnBhZ2VOYW1lKyI6IituLHMubGlua1RyYWNrVmFycz1zLmFwbChzLmxpbmtUcmFja1ZhcnMsInByb3A2LGVWYXI2LHByb3AxOCxwcm9wMTkscHJvcDIwLHByb3AzMSxlVmFyMzgscHJvcDQwLGVWYXI0MCxwcm9wNDMsZVZhcjQzLHByb3A0NixlVmFyNDYsZVZhcjczLGVWYXI3NSxwcm9wNzQsZVZhcjExMixlVmFyMTEzLGVWYXIxMTQsZVZhcjExNSxlVmFyMTE2LGVWYXIxMTcsZVZhcjExOCxlVmFyMTE5LGVWYXIxMjAsZVZhcjEyMSxlVmFyMTM2LGVWYXIxMzgsZVZhcjEzOSxlVmFyMTQyLGVWYXIxNDMsZVZhcjE0NSxwcm9kdWN0cyxwdXJjaGFzZUlELGV2ZW50cyIsIiwiLDIpLHMubGlua1RyYWNrRXZlbnRzPXMuZXZlbnRzLGZkeF9maXJlU0RvdFRMKHRoaXMsIm8iLG4pLHMucHJvZHVjdHM9IiIscy5wdXJjaGFzZUlEPSIiLHMuZXZlbnRzPSIiLHMuZVZhcjczPSIiLHMuZVZhcjc1PSIiLHMucHJvcDc0PSIiLCEocy5lVmFyNDM9IiIpKX1jYXRjaChpKXtyZXR1cm4gZmR4X2RlYnVnKGksIlNDIiwiZmR4X2xvZ1B1cmNoYXNlIiksITF9fWZ1bmN0aW9uICRfX192YXJfODVjZTk5YmIxODI5MDI1NChlLHQpe3RyeXt2YXIgbj0iIixpPWUuY2xpZW50SWQrIjpJTlRfIitlLklOVDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuY2xpZW50SWQmJiIiIT09ZS5jbGllbnRJZCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBlLnNoaXBEYXRhJiZudWxsIT09ZS5zaGlwRGF0YSlmb3IodmFyIHIgaW4gZS5zaGlwRGF0YSl7aSs9IjoiK3IrIl8iK2Uuc2hpcERhdGFbcl19bj0iWSI9PWUuSU5UPyJldmVudDY4IjoiZXZlbnQ2NyIscy5ldmVudHM9InB1cmNoYXNlLCIrbixzLmxpbmtUcmFja0V2ZW50cz1zLmV2ZW50cyxzLmVWYXIxNDM9aSxzLnByb2R1Y3RzPSI7TUFHUzs7OyIrbisiO2VWYXIxNDM9IitzLmVWYXIxNDMscy5lVmFyNDM9IlM6TUFHUyI7dHJ5e251bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWNhdGNoKGEpe2ZkeF9kZWJ1ZyhhLCJTQyIsImZkeF9sb2dQdXJjaGFzZU1BR1M6Y2FsbGJhY2siKX19fWNhdGNoKGEpe2ZkeF9kZWJ1ZyhhLCJTQyIsImZkeF9sb2dQdXJjaGFzZU1BR1MiKX19ZnVuY3Rpb24gJF9fX3Zhcl9iNGM3NGQxZGYyYTU5NDI5KGUpe3JldHVybiBlIT09dW5kZWZpbmVkJiZudWxsIT09ZSYmZS5jb25zdHJ1Y3Rvcj09T2JqZWN0fWZ1bmN0aW9uICRfX192YXJfOTFmMWY4MDNkOTE2ODhmOChlLHQpe3RyeXt2YXIgbj0iIjtpZihzLmxpbmtUcmFja1ZhcnM9cy5hcGwocy5saW5rVHJhY2tWYXJzLE1BR1NFdmFyTWFwcGluZ1tlLnBhZ2VOYW1lXVswXSwiLCIsMiksaXNPYmplY3QoZSkpZm9yKHZhciBpIGluInVuZGVmaW5lZCIhPXR5cGVvZiBlLlNSQyYmIiIhPWUuU1JDJiYocy5saW5rVHJhY2tWYXJzPXMuYXBsKHMubGlua1RyYWNrVmFycywiZVZhcjE2NiIsIiwiLDIpLHMuZVZhcjE2Nj1lLlNSQyksZSl7dmFyIHI9ZVtpXTtpZihpc09iamVjdChyKSl7Zm9yKHZhciBpIGluIHIpbis9aSsiXyIrcltpXSsiOiI7bj1uLnN1YnN0cmluZygwLG4ubGVuZ3RoLTEpKyI6In19dmFyIGE9bi5zdWJzdHJpbmcoMCxuLmxlbmd0aC0xKTtzLmV2ZW50cz0iU2NBZGQsIitbTUFHU0V2YXJNYXBwaW5nW2UucGFnZU5hbWVdWzFdXSxzLmxpbmtUcmFja0V2ZW50cz1zLmV2ZW50cyxzW1tNQUdTRXZhck1hcHBpbmdbZS5wYWdlTmFtZV1bMF1dXT1hLHMucHJvZHVjdHM9IjtNQUdTOzs7OyIrTUFHU0V2YXJNYXBwaW5nW2UucGFnZU5hbWVdWzBdKyI9IitzW01BR1NFdmFyTWFwcGluZ1tlLnBhZ2VOYW1lXVswXV0scy5lVmFyNDM9IlM6IitlLnBhZ2VOYW1lO3RyeXtudWxsIT10JiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChvYmopfWNhdGNoKG8pe2ZkeF9kZWJ1ZyhvLCJTQyIsImZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWw6Y2FsbGJhY2siKX19Y2F0Y2gobyl7ZmR4X2RlYnVnKG8sIlNDIiwiZmR4X2xvZ1B1cmNoYXNlX1BhZ2VMZXZlbCIpfX1mdW5jdGlvbiAkX19fdmFyX2I1ZTNjZjM0YWNmMTNmM2MoZSx0KXt0cnl7dmFyIG49ZS5jbGllbnRJZCsiOklOVF8iK2UuSU5ULGk9ZS5jbGllbnRJZDtpZih2b2lkIDAhPT1lJiYiIiE9PWUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZS5zaGlwRGF0YSYmbnVsbCE9PWUuc2hpcERhdGEpZm9yKHZhciByIGluIGUuc2hpcERhdGEpe24rPSI6IityKyJfIitlLnNoaXBEYXRhW3JdfWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZS5jb21EYXRhJiZudWxsIT09ZS5jb21EYXRhKWZvcih2YXIgciBpbiBlLmNvbURhdGEpe2krPSI6IityKyJfIitlLmNvbURhdGFbcl19cy5ldmVudHM9InNjQWRkLGV2ZW50MTEwIixzLmxpbmtUcmFja0V2ZW50cz1zLmV2ZW50cyxzLmVWYXIxMzY9bixzLmVWYXIxNDI9aSxzLnByb2R1Y3RzPSI7TUFHUjs7OztlVmFyMTM2PSIrcy5lVmFyMTM2KyJ8ZVZhcjE0Mj0iK3MuZVZhcjE0MixzLmVWYXI0Mz0iUzpSYXRlTUFHUiI7dHJ5e251bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWNhdGNoKGEpe2ZkeF9kZWJ1ZyhhLCJTQyIsImZkeF9sb2dQdXJjaGFzZU1BR1I6Y2FsbGJhY2siKX19fWNhdGNoKGEpe2ZkeF9kZWJ1ZyhhLCJTQyIsImZkeF9sb2dQdXJjaGFzZU1BR1IiKX19ZnVuY3Rpb24gJF9fX3Zhcl85OTI4NzBkNjAzODA2ODE3KGUsdCl7dHJ5e3ZhciBuPSIiLGk9IiI7bnVsbCE9ZSYmKCJ1bmRlZmluZWQiIT10eXBlb2YgZS5wcm9maWxlJiYobj1wcm9jZXNzRGF0YShlLnByb2ZpbGUpKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUuYWRkdERhdGEmJihpPXByb2Nlc3NEYXRhKGUuYWRkdERhdGEpKSxzLmVWYXIxNDU9bisifCIraSkscy5ldmVudHM9InNjQWRkIixzLmxpbmtUcmFja0V2ZW50cz1zLmV2ZW50cyxzLnByb2R1Y3RzPSI7IitlLmFwcElkKyI7Ozs7ZVZhcjE0NT0iK3MuZVZhcjE0NSxzLmVWYXI0Mz0iUzoiK2UuYXBwSWQ7dHJ5e251bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWNhdGNoKHIpe2ZkeF9kZWJ1ZyhyLCJTQyIsImZkeF9sb2dQdXJjaGFzZVdSRUc6Y2FsbGJhY2siKX19Y2F0Y2gocil7ZmR4X2RlYnVnKHIsIlNDIiwiZmR4X2xvZ1B1cmNoYXNlV1JFRyIpfX1mdW5jdGlvbiAkX19fdmFyXzY0M2M5OTQ3Mjc4M2Y0YTIoZSl7dmFyIHQ9IiI7aWYobnVsbCE9ZSl7Zm9yKHZhciBuIGluIGUpdCs9IjoiK24rIl8iK2Vbbl07dD10LnJlcGxhY2UoIjoiLCIiKX1yZXR1cm4gdH1mdW5jdGlvbiAkX19fdmFyXzI5YWNiNmRkZWE2OWM0MTAoZSl7dHJ5e3ZhciB0PVtdO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZS5qb2luPT11bmRlZmluZWQpZm9yKHByb3AgaW4gZSlwcm9wJiYiIiE9cHJvcCYmZVtwcm9wXSYmIiIhPWVbcHJvcF0mJnQucHVzaChwcm9wLCI6IixmZHhfY29udmVydFRvU3RyKGVbcHJvcF0pLCIsIik7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUuam9pbiE9dW5kZWZpbmVkKWZvcihwcm9wIGluIGUpcHJvcCYmIiIhPXByb3AmJmVbcHJvcF0mJiIiIT1lW3Byb3BdJiZ0LnB1c2goZmR4X2NvbnZlcnRUb1N0cihlW3Byb3BdKSwiLCIpO2Vsc2UiZnVuY3Rpb24iIT10eXBlb2YgZSYmIiIhPWUudG9TdHJpbmcoKSYmdC5wdXNoKGUudG9TdHJpbmcoKSk7cmV0dXJuIHQuam9pbigiIil9Y2F0Y2gobil7ZmR4X2RlYnVnKG4sIlNDIiwiZmR4X2NvbnZlcnRUb1N0ciIpfX1mdW5jdGlvbiAkX19fdmFyXzhjZTYyZGExMzM4OTVjZTkoZSx0KXt0cnl7aWYodClpZihzLmxpbmtUcmFja1ZhcnM9InByb3A2LGVWYXI2LHByb3AzMSxlVmFyNDMscHJvcDUyLGVWYXI1Mixwcm9wNTYsZVZhcjU2LGVWYXI1Myxwcm9wMTgscHJvcDE5LHByb3AyMCxwcm9wNDEsZXZlbnRzIixsPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5zdGF0dXMmJmUuc3RhdHVzP2Uuc3RhdHVzOiIiKXt2YXIgbj17dmFQb3BpbkFzazoiZXZlbnQxMTIiLHRyYW5zdG9MQToiZXZlbnQxMTQifSxpPSIiO2Zvcih2YXIgciBpbiBhPW5bbF0scy5wcm9wMTg9cy5wYWdlTmFtZSxzLnByb3AxOT1sLHMucHJvcDIwPXMucGFnZU5hbWUrIjoiK2wsZSllW3JdJiYoaSs9IjoiK2Vbcl0pO3MuZVZhcjE0PXQrIjoiK3MucGFnZU5hbWUraSxzLmxpbmtUcmFja1ZhcnM9cy5hcGwocy5saW5rVHJhY2tWYXJzLCJlVmFyMTQiLCIsIiwyKSxzLmxpbmtUcmFja0V2ZW50cz1zLmV2ZW50cz1hLG5sdHJrPSJ5IixmZHhfZmlyZVNEb3RUTCh0aGlzLCJvIix0KX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuY2hhdFJlcXVlc3QmJm51bGwhPT1lLmNoYXRSZXF1ZXN0KXt2YXIgYT0iIixvPSh0PSIiLCIiKTtmb3IodmFyIHIgaW4gcy5saW5rVHJhY2tWYXJzPSJwcm9wNixlVmFyNixwcm9wMzEsZVZhcjQzLHByb3A1MixlVmFyNTIscHJvcDU2LGVWYXI1NixlVmFyNTMscHJvcDE4LHByb3AxOSxwcm9wMjAscHJvcDQxLGV2ZW50cyIsZS5jaGF0UmVxdWVzdFswXS5jaGF0RGF0YSl7dmFyIGM9IiIrZS5jaGF0UmVxdWVzdFswXS5jaGF0RGF0YVtyXTtvKz0ifCIrKHI9ci5yZXBsYWNlKCJ8IiwiLSIpKSsiXyIrKGM9Yy5yZXBsYWNlKCJ8IiwiLSIpKX1pZigiQ0hBVCI9PWUuY2hhdFJlcXVlc3RbMF0uY2xpZW50SWQpdD0ibGl2ZWFnZW50X0NIQVQiLGE9ImV2ZW50NDUiLHMucHJvcDU5PXMuZVZhcjU5PW8ucmVwbGFjZSgifCIsIiIpLHMubGlua1RyYWNrVmFycz1zLmFwbChzLmxpbmtUcmFja1ZhcnMsImVWYXI1OSxwcm9wNTkiLCIsIiwyKTtlbHNlIGlmKCJOSU5BIj09ZS5jaGF0UmVxdWVzdFswXS5jbGllbnRJZCl0cnl7dD0idmFfTklOQSI7dmFyIGw9ZS5jaGF0UmVxdWVzdFswXS5jaGF0RGF0YS5zdGF0dXM7YT0obj17dmFQb3Bpbk9wZW46ImV2ZW50MTEyIix2YVBvcGluQ2xvc2U6ImV2ZW50MTEzIix0cmFuc3RvTEE6ImV2ZW50MTE0In0pW2xdLHMuZVZhcjE0PW8ucmVwbGFjZSgifCIsIiIpLnJlcGxhY2UoInZhUG9waW5PcGVuIiwidmFQb3BpbiIpLnJlcGxhY2UoInZhUG9waW5DbG9zZSIsInZhUG9waW4iKSxzLmxpbmtUcmFja1ZhcnM9cy5hcGwocy5saW5rVHJhY2tWYXJzLCJlVmFyMTQiLCIsIiwyKX1jYXRjaCh1KXtmZHhfZGVidWcodSwiU0MiLCJmZHhfbG9nQ2hhdDpOSU5BIil9cy5saW5rVHJhY2tFdmVudHM9cy5ldmVudHM9YSxubHRyaz0ieSIsZmR4X2ZpcmVTRG90VEwodGhpcywibyIsdCl9fWNhdGNoKHUpe2ZkeF9kZWJ1Zyh1LCJTQyIsImZkeF9sb2dDaGF0Iil9fWZ1bmN0aW9uICRfX192YXJfMmE4ZmY4MGVlMGYzY2U1NChlKXtjb25zdCAkX19fb2xkX2JhMjNiNGIyNWQ3ZjZiYTA9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIiksJF9fX29sZF8yNTY1MjkwOGJhOWE2MWNjPXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csInNlc3Npb25TdG9yYWdlIik7dHJ5e2lmKCRfX19vbGRfYmEyM2I0YjI1ZDdmNmJhMCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywibG9jYWxTdG9yYWdlIiwkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3LmxvY2FsU3RvcmFnZSk7aWYoJF9fX29sZF8yNTY1MjkwOGJhOWE2MWNjKSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJzZXNzaW9uU3RvcmFnZSIsJF9fX21vY2tfYzdjYWVjNTAxZGNhMjM4Ny5zZXNzaW9uU3RvcmFnZSk7cmV0dXJuIGZ1bmN0aW9uKCl7d2luZG93LmZkeF9jb250cm9sbGVyVmVyc2lvbiwidW5kZWZpbmVkIj09dHlwZW9mIGUucGFnZU5hbWUmJiIiPT1lLnBhZ2VOYW1lJiYoX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cGFnZSBuYW1lIiksMSkmJl9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnBhZ2UgbmFtZSIpJiYoZS5wYWdlTmFtZT1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpwYWdlIG5hbWUiKSksZS5wYWdlTmFtZT1lLnBhZ2VOYW1lLnRvTG93ZXJDYXNlKCksZS5lVmFyMzg9IkQ9cGFnZU5hbWUiLGUuZVZhcjUwPVtsb2NhdGlvbi5ob3N0LGxvY2F0aW9uLnBhdGhuYW1lXS5qb2luKCIiKSxlLnByb3A0Nj1lLmVWYXI0Nj0iRD1wYWdlTmFtZSI7dmFyIHQ9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLG49ZS5nZXRUaW1lUGFydGluZygiaCIsIi02Iix0KSxpPWUuZ2V0VGltZVBhcnRpbmcoImQiLCItNiIsdCk7ZS5lVmFyNz1lLnByb3A3PW4rInwiK2k7dmFyIHI9bmV3IERhdGUsYT1yLmdldE1vbnRoKCkrMSxzPXIuZ2V0RGF0ZSgpLG89ci5nZXRGdWxsWWVhcigpO2UucHJvcDUyPWUuZVZhcjUyPW8rIi0iK2ErIi0iK3M7dmFyIGM9ZS5nZXRQcmV2aW91c1ZhbHVlKGUucGFnZU5hbWUsImdwdl9wYWdlTmFtZSIpO2MmJihlLnByb3AxMj1jLGUuZVZhcjI9IkQ9YzEyIiksZS5wcm9wMzU9IkQ9QWNjZXB0LUxhbmd1YWdlIixlLmVWYXI1Mz0iKzEiLGUuZVZhcjQwPSJEPWV2ZW50cyI7dHJ5e3ZhciBsPWUuZ2V0UGVyY2VudFBhZ2VWaWV3ZWQoZS5wYWdlTmFtZSk7dm9pZCAwIT09bCYmIm9iamVjdCI9PXR5cGVvZiBsJiY0PT09bC5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgbFsyXSYmKGUucHJvcDYwPWxbMl0rIjoiK2xbMV0pfWNhdGNoKGcpe2ZkeF9kZWJ1ZyhnLCJTQyIsInNfZG9QbHVnaW5zOnBwdkFycmF5Iil9aWYoImQiPT1lLmxpbmtUeXBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUubGlua09iamVjdC5kYXRhc2V0LmFsdCYmKGUubGlua1R5cGU9IiIpLCJkIj09ZS5saW5rVHlwZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmxpbmtPYmplY3QmJjAhPT1lLmxpbmtPYmplY3QmJnZvaWQgMCE9PWUubGlua09iamVjdC5nZXRBdHRyaWJ1dGUoImhyZWYiKSYmKGUudXJsPWUubGlua09iamVjdC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxlLnByb3AzNz1lLmVWYXIzNz1lLnVybC5zdWJzdHJpbmcoZS51cmwubGFzdEluZGV4T2YoIi8iKSsxLGUudXJsLmxlbmd0aCksZS5lVmFyNDM9IkQ6IitlLnByb3AzNyxlLmV2ZW50cz1lLmFwbChlLmV2ZW50cywiZXZlbnQxMiIsIiwiLDIpLGUubGlua1RyYWNrRXZlbnRzPSJldmVudDEyIixlLmxpbmtUcmFja1ZhcnM9InByb3AxOCxwcm9wMTkscHJvcDIwLGVWYXIzNyxlVmFyNDMsZXZlbnRzIiksInkiIT1ubHRyayYmKGUuZVZhcjY9X3NhdGVsbGl0ZS5nZXRWYXIoImxvZ2luOnVzZXItaWQiKSxlLnByb3A2PSJEPXY2IixlLmxpbmtUcmFja1ZhcnM9ZS5hcGwoZS5saW5rVHJhY2tWYXJzLCJwcm9wMixwcm9wMyxwcm9wNCxwcm9wNSxwcm9wNixwcm9wMTgscHJvcDE5LHByb3AyMCxwcm9wMzEscHJvcDMzLHByb3AzNSxwcm9wNDgscHJvcDUwLGVWYXI0LGVWYXI2LGVWYXIxMyxlVmFyNTAiLCIsIiwyKSxlLnNldHVwTGlua1RyYWNrKCJwcm9wMTgscHJvcDE5LHByb3AyMCIsIlNDX0xJTktTIiksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnByb3AxOSYmIiIhPT1lLnByb3AxOSYmKC0xPGUucHJvcDE5LmluZGV4T2YoInNwcml0ZS1wbGFjZWhvbGRlci5wbmciKSYmKGUucHJvcDE5PSJoZHJ8U2VhcmNoIiksZS5wcm9wMjA9ZS5wcm9wMTgrIiB8ICIrZS5wcm9wMTkpKSxlLmVWYXI0NXx8KGUuZVZhcjQ1PWUuVXRpbC5nZXRRdWVyeVBhcmFtKCJJTlRDTVAiKSxlLmVWYXI0NT1lLmdldFZhbE9uY2UoZS5lVmFyNDUsInNfaW50Y2FtcGFpZ24iLDApLGUuY2xpY2tQYXN0KGUuZVZhcjQ1LCJldmVudDgyIiwiZXZlbnQ4MyIsInNfY3AtYmFnIikpLGUuZVZhcjQ1JiYoZS5saXN0MT1lLmVWYXI0NSxlLmV2ZW50cz1lLmFwbChlLmV2ZW50cywiZXZlbnQ0NCIsIiwiLDIpKSwhZS5jYW1wYWlnbil7ZS5jYW1wYWlnbj1lLlV0aWwuZ2V0UXVlcnlQYXJhbSgiQ01QIik7dmFyIHU9ZS5VdGlsLmdldFF1ZXJ5UGFyYW0oIkxJTksiKTtlLmNhbXBhaWduJiZ1JiYoZS5lVmFyNTg9dSksIiI9PWUuY2FtcGFpZ24mJihlLmNhbXBhaWduPWZkeF9jYW1wYWlnbigpKSxlLmNhbXBhaWduPWUuZ2V0VmFsT25jZShlLmNhbXBhaWduLCJzX2NhbXBhaWduIiwwKX1lLmNsaWNrUGFzdChlLmNhbXBhaWduLCJldmVudDIzIiwiZXZlbnQyNCIpO3ZhciBkPWUuZ2V0QWFtU2VnbWVudHMoImFhbV9zYyIsImFhbXNjIikucmVwbGFjZSgvXHwvZywiLCIpO2UubGlzdDI9ZS5hcGwoZS5saXN0MixkLCIsIiwyKSxlLnByb3A0OD1zX3ZlcnNpb24rIl8iK3NjX2NvZGVfdmVyKyJfIitzY19jb2RlX3Zlcl9kYXRlLGUucHJvcDUwPXNfYWNjb3VudDt2YXIgcD1fZmR4LmdldFRlc3RMZXZlbCgpO3AmJihlLnByb3A1MCs9Il9MYXVuY2hfIitwKSxlLmVWYXI0MT1lLmdldFZpc2l0TnVtKCJkIiksZS5wcm9wMzE9IiIhPT1lLnZpc2l0b3IuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKCk/IltDU112MXwiK2UudmlzaXRvci5nZXRBbmFseXRpY3NWaXNpdG9ySUQoKSsiW0NFXSI6ZS52aXNpdG9yLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCksbmx0cms9IiIsInVuZGVmaW5lZCIhPXR5cGVvZiBwcnA3MiYmIiIhPXBycDcyJiYoZS5wcm9wNzI9cHJwNzIpO3ZhciBmPSIiOyhmPV9zYXRlbGxpdGUuY29va2llLmdldCgiUmJ0IikpIT11bmRlZmluZWQmJiIiIT1mJiYiZjEiPT09ZiYmKGUuYWJvcnQ9ITApfS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtpZigkX19fb2xkX2JhMjNiNGIyNWQ3ZjZiYTApKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX29sZF9iYTIzYjRiMjVkN2Y2YmEwKTtpZigkX19fb2xkXzI1NjUyOTA4YmE5YTYxY2MpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csInNlc3Npb25TdG9yYWdlIiwkX19fb2xkXzI1NjUyOTA4YmE5YTYxY2MpfX1mdW5jdGlvbiAkX19fdmFyXzc0N2Y3YWMyNGNmZjllNTkoKXtmdW5jdGlvbiBlKGUpe3ZhciB0LG4saSxyPXRoaXMsYT0obmV3IERhdGUsci5jX3JyKGUpKSxzPXIuY19yc3BlcnMoKTtyZXR1cm4gYXx8KGU9ci5VdGlsLnVybERlY29kZShlKSxuPSh0PShzPSh0PXMuaW5kZXhPZigiICIrZSsiPSIpKTwwP3IuY19ycigic19zZXNzIik6cykuaW5kZXhPZigiICIrZSsiPSIpKTwwP3Q6cy5pbmRleE9mKCJ8Iix0KSxpPXQ8MD90OnMuaW5kZXhPZigiOyIsdCksbj0wPG4/bjppLGE9dDwwPyIiOnIuVXRpbC51cmxEZWNvZGUocy5zdWJzdHJpbmcodCsyK2UubGVuZ3RoLG48MD9zLmxlbmd0aDpuKSkpfWZ1bmN0aW9uIHQoKXt2YXIgZT1zLmNfcnIoInNfcGVycyIpLHQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksbj1udWxsLGk9W10scj0iIjtpZighZSlyZXR1cm4gcjtmb3IodmFyIGE9MCxvPShpPWUuc3BsaXQoIjsiKSkubGVuZ3RoO2E8bzthKyspKG49aVthXS5tYXRjaCgvXHwoWzAtOV0rKSQvKSkmJnBhcnNlSW50KG5bMV0pPj10JiYocis9aVthXSsiOyIpO3JldHVybiByfWZ1bmN0aW9uIG4oZSx0LG4pe3ZhciBpLHIsYSxzLG89dGhpcyxjPW5ldyBEYXRlLGw9MCx1PSJzX3BlcnMiLGQ9InNfc2VzcyIscD0wLGY9MDtpZihjLnNldFRpbWUoYy5nZXRUaW1lKCktNmU0KSxvLmNfcnIoZSkmJm8uY193cihlLCIiLGMpLGU9by5VdGlsLnVybEVuY29kZShlKSwtMTwoYT0oaT1vLmNfcnNwZXJzKCkpLmluZGV4T2YoIiAiK2UrIj0iKSkmJihpPWkuc3Vic3RyaW5nKDAsYSkraS5zdWJzdHJpbmcoaS5pbmRleE9mKCI7IixhKSsxKSxwPTEpLC0xPChhPShyPW8uY19ycihkKSkuaW5kZXhPZigiICIrZSsiPSIpKSYmKHI9ci5zdWJzdHJpbmcoMCxhKStyLnN1YnN0cmluZyhyLmluZGV4T2YoIjsiLGEpKzEpLGY9MSksYz1uZXcgRGF0ZSxuP24uZ2V0VGltZSgpPmMuZ2V0VGltZSgpJiYoaSs9IiAiK2UrIj0iK28uVXRpbC51cmxFbmNvZGUodCkrInwiK24uZ2V0VGltZSgpKyI7IixwPTEpOihyKz0iICIrZSsiPSIrby5VdGlsLnVybEVuY29kZSh0KSsiOyIsZj0xKSxyPXIucmVwbGFjZSgvJTAwL2csIiIpLGk9aS5yZXBsYWNlKC8lMDAvZywiIiksZiYmby5jX3dyKGQsciwwKSxwKXtmb3Iocz1pO3MmJi0xIT1zLmluZGV4T2YoIjsiKTspe3ZhciBnPXBhcnNlSW50KHMuc3Vic3RyaW5nKHMuaW5kZXhPZigifCIpKzEscy5pbmRleE9mKCI7IikpKTtzPXMuc3Vic3RyaW5nKHMuaW5kZXhPZigiOyIpKzEpLGw9bDxnP2c6bH1jLnNldFRpbWUobCksby5jX3dyKHUsaSxjKX1yZXR1cm4gdD09by5jX3Ioby5VdGlsLnVybEVuY29kZShlKSl9cy5kb1BsdWdpbnM9c19kb1BsdWdpbnMscy5wX2NoZWNrSW50ZXJ2YWw9bmV3IEFycmF5LHMucF9jYmN0PTAscy50X2NiPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZighZSllPTRlMzt0fHwodD0ic19wX2NhbGxCYWNrQ29kZSIpLGludGVydmFsPTEwMCxuLnBfY2J3YWl0PTA7dmFyIGk9MTsidW5kZWZpbmVkIiE9dHlwZW9mIG4ucmMmJihpPW4ucmNbbi52aXNpdG9yTmFtZXNwYWNlXSksaT5uLnBfY2JjdCYmKG4ucF9jYmN0Kyssbi5wX2NoZWNrSW50ZXJ2YWxbaV09c2V0SW50ZXJ2YWwoInMucF9jYWxsQmFjaygiK2UrIiwgIitpKyIsICciK3QrIicpIixpbnRlcnZhbCkpfSxzLnBfY2FsbEJhY2s9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzOyJ1bmRlZmluZWQiPT10eXBlb2Ygbi52aXNpdG9yTmFtZXNwYWNlJiYobi52aXNpdG9yTmFtZXNwYWNlPXNfYWNjb3VudCk7dmFyIGk9IiI7MTx0JiYoaT0iXyIrKHQtMSkpO3ZhciByPSJzX2lfIituLnZpc2l0b3JOYW1lc3BhY2UraTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvd1tyXSYmMDx3aW5kb3dbcl0uaGVpZ2h0PyhjbGVhckludGVydmFsKG4ucF9jaGVja0ludGVydmFsW3RdKSwhMCk6KG4ucF9jYndhaXQrPWludGVydmFsLG4ucF9jYndhaXQ+ZSYmKGNsZWFySW50ZXJ2YWwobi5wX2NoZWNrSW50ZXJ2YWxbdF0pLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93W3JdJiYod2luZG93W3JdLnNyYz0iaHR0cHM6Ly93d3cuZmVkZXguY29tL2ltYWdlcy9hc2NlbmQvc2hhcmVkL2hlYWRlcnMvY29ycF9sb2dvLmdpZj9zY19yZXNwb25zZV9mYWlsdXJlIikpLCExKX0scy5sb29rdXBsb29rdXA9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEscyxvLGMsbCx1PXRoaXMsZD0wLHA9ZT9lLmxlbmd0aDowLGY9bmV3IEFycmF5LGc9bmV3IEFycmF5O2ZvcihpPTA7aTxwO2krKyktMTwodD1lLmluZGV4T2YoInwiLGkpKSYmKGZbZF09ZS5zdWJzdHJpbmcoaSx0KSxkKyssaT10KTtmb3IoaT0wO2k8ZDtpKyspe2ZvcihuPTAsYT1mW2ldP2ZbaV0ubGVuZ3RoOjAsaj0wO2o8YTtqKyspaWYoLTE8KHI9ZltpXS5pbmRleE9mKCJ+IixqKSkpZ1tuXT1mW2ldLnN1YnN0cmluZyhqLHIpLG4rKyxqPXI7ZWxzZXtpZigtMT09ciYmbjwzfHwzPG4pYnJlYWs7aWYoLTE9PXImJjM9PW4pe2dbbl09ZltpXS5zdWJzdHJpbmcoaik7YnJlYWt9fWlmKC0xPT1yJiYzPT1uKXtpZihvPWdbMF0scz1nWzFdLGM9Z1syXSxsPWdbM10sbyYmImMiPT1jJiYtMTx1LnBhZ2VOYW1lLmluZGV4T2Yobykpe3UuZXZlbnRzPXUuYXBsKHUuZXZlbnRzLGwsIiwiLDIpO2JyZWFrfWlmKG8mJiJlIj09YyYmdS5wYWdlTmFtZT09byl7dS5ldmVudHM9dS5hcGwodS5ldmVudHMsbCwiLCIsMik7YnJlYWt9aWYocyYmImMiPT1jJiYtMTxkb2N1bWVudC5VUkwuaW5kZXhPZihzKSl7dS5ldmVudHM9dS5hcGwodS5ldmVudHMsbCwiLCIsMik7YnJlYWt9aWYocyYmImUiPT1jJiZkb2N1bWVudC5VUkw9PXMpe3UuZXZlbnRzPXUuYXBsKHUuZXZlbnRzLGwsIiwiLDIpO2JyZWFrfX19fSxzLmZhZT1mdW5jdGlvbihlKXt0cnl7dmFyIHQsbjtpZih2b2lkIDAhPT1lKXtpZighZS5hY3RpdmVFbGVtZW50fHwhZS5hY3RpdmVFbGVtZW50LnR5cGUpcmV0dXJuO249KHQ9ZS5hY3RpdmVFbGVtZW50KS50eXBlfWVsc2V7aWYoIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fCFkb2N1bWVudC5hY3RpdmVFbGVtZW50LnR5cGUpcmV0dXJuO249KHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudHlwZX1pZigidGV4dCI9PW58fCJ0ZXh0YXJlYSI9PW58fCJjaGVja2JveCI9PW58fCJyYWRpbyI9PW58fCJzZWxlY3Qtb25lIj09bnx8ImJ1dHRvbiI9PW4pe3ZhciBpPXQuaWQ7aWYoIiI9PShpPSIiPT09aT90Lm5hbWU6aSkmJnQub3V0ZXJIVE1MJiYiIiE9PXQub3V0ZXJIVE1MJiYoaT10Lm91dGVySFRNTC5zdWJzdHJpbmcoMCw4NSkpLCIiPT09aSl7dmFyIHI9ZmR4X2dldENvb2tpZSgic19sZmYiKTtpPShpPXZvaWQgMCE9PXI/cjoiW1BOOiIrcy5wYWdlTmFtZSsiXSIpLnJlcGxhY2Uocy5mb3JtTmFtZSsifCIsIiIpfWZkeF9zZXRDb29raWUoInNfbGZmIixzLmZvcm1OYW1lKyJ8IitpLDMwLCIvIiwiLmZlZGV4LmNvbSIpfX1jYXRjaChhKXtmZHhfZGVidWcoYSwiU0MiLCJzLmZhZSIpfX0scy5wYXJ0bmVyREZBQ2hlY2s9bmV3IEZ1bmN0aW9uKCJjZmciLCJ2YXIgcz10aGlzLGM9Y2ZnLnZpc2l0Q29va2llLHNyYz1jZmcuY2xpY2tUaHJvdWdoUGFyYW0sc2NwPWNmZy5zZWFyY2hDZW50ZXJQYXJhbSxwPWNmZy5uZXdSc2lkc1Byb3AsdHY9Y2ZnLnRFdmFyLGRsPScsJyxjcixuYyxxLGcsZ3MsaSxqLGssZm5kLHY9MSx0PW5ldyBEYXRlLGNuPTAsY2E9bmV3IEFycmF5LGFhPW5ldyBBcnJheSxjcz1uZXcgQXJyYXk7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzE4MDAwMDApO2NyPXMuY19yKGMpO2lmKGNyKXt2PTA7fWNhPXMuc3BsaXQoY3IsZGwpO2lmKHMudW4pYWE9cy5zcGxpdChzLnVuLGRsKTtlbHNlIGFhPXMuc3BsaXQocy5hY2NvdW50LGRsKTtmb3IoaT0wO2k8YWEubGVuZ3RoO2krKyl7Zm5kID0gMDtmb3Ioaj0wO2o8Y2EubGVuZ3RoO2orKyl7aWYoYWFbaV0gPT0gY2Fbal0pe2ZuZD0xO319aWYoIWZuZCl7Y3NbY25dPWFhW2ldO2NuKys7fX1pZihjcy5sZW5ndGgpe2ZvcihrPTA7azxjcy5sZW5ndGg7aysrKXtuYz0obmM/bmMrZGw6JycpK2NzW2tdO31jcj0oY3I/Y3IrZGw6JycpK25jO3MudnByKHAsbmMpO3Y9MTt9aWYocy53ZClxPXMud2QubG9jYXRpb24uc2VhcmNoLnRvTG93ZXJDYXNlKCk7ZWxzZSBxPXMudy5sb2NhdGlvbi5zZWFyY2gudG9Mb3dlckNhc2UoKTtxPXMucmVwbChxLCc/JywnJicpO2c9cS5pbmRleE9mKCcmJytzcmMudG9Mb3dlckNhc2UoKSsnPScpO2dzPShzY3ApP3EuaW5kZXhPZignJicrc2NwLnRvTG93ZXJDYXNlKCkrJz0nKTotMTtpZihnPi0xKXtzLnZwcihwLGNyKTt2PTE7fWVsc2UgaWYoZ3M+LTEpe3Y9MDtzLnZwcih0diwnU2VhcmNoQ2VudGVyIFZpc2l0b3JzJyk7fWlmKCFzLmNfdyhjLGNyLHQpKXtzLmNfdyhjLGNyLDApO31pZighcy5jX3IoYykpe3Y9MDt9cmV0dXJuIHY+PTE7Iikscy52cHI9bmV3IEZ1bmN0aW9uKCJ2cyIsInYiLCJpZih0eXBlb2YodikhPSd1bmRlZmluZWQnICYmIHZzKXt2YXIgcz10aGlzOyBldmFsKCdzLicrdnMrJz1cIicrdisnXCInKX0iKSxzLmdldEFjdGlvbkRlcHRoPW5ldyBGdW5jdGlvbigiYyIsInZhciBzPXRoaXMsdj0xLHQ9bmV3IERhdGU7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzE4MDAwMDApO2lmKCFzLmNfcihjKSl7dj0xfWlmKHMuY19yKGMpKXt2PXMuY19yKGMpO3YrK31pZighcy5jX3coYyx2LHQpKXtzLmNfdyhjLHYsMCl9cmV0dXJuIHY7Iikscy5nZXRWaXNpdE51bT1uZXcgRnVuY3Rpb24oInRwIiwiYyIsImMyIiwidmFyIHM9dGhpcyxlPW5ldyBEYXRlLGN2YWwsY3Zpc2l0LGN0PWUuZ2V0VGltZSgpLGQ7aWYoIXRwKXt0cD0nbSc7fWlmKHRwPT0nbSd8fHRwPT0ndyd8fHRwPT0nZCcpe2VvPXMuZW5kb2YodHApLHk9ZW8uZ2V0VGltZSgpO2Uuc2V0VGltZSh5KTt9ZWxzZSB7ZD10cCo4NjQwMDAwMDtlLnNldFRpbWUoY3QrZCk7fWlmKCFjKXtjPSdzX3ZudW0nO31pZighYzIpe2MyPSdzX2ludmlzaXQnO31jdmFsPXMuY19yKGMpO2lmKGN2YWwpe3ZhciBpPWN2YWwuaW5kZXhPZignJnZuPScpLHN0cj1jdmFsLnN1YnN0cmluZyhpKzQsY3ZhbC5sZW5ndGgpLGs7fWN2aXNpdD1zLmNfcihjMik7aWYoY3Zpc2l0KXtpZihzdHIpe2Uuc2V0VGltZShjdCsxODAwMDAwKTtzLmNfdyhjMiwndHJ1ZScsZSk7cmV0dXJuIHN0cjt9ZWxzZSB7cmV0dXJuICd1bmtub3duIHZpc2l0IG51bWJlcic7fX1lbHNlIHtpZihzdHIpe3N0cisrO2s9Y3ZhbC5zdWJzdHJpbmcoMCxpKTtlLnNldFRpbWUoayk7cy5jX3coYyxrKycmdm49JytzdHIsZSk7ZS5zZXRUaW1lKGN0KzE4MDAwMDApO3MuY193KGMyLCd0cnVlJyxlKTtyZXR1cm4gc3RyO31lbHNlIHtzLmNfdyhjLGUuZ2V0VGltZSgpKycmdm49MScsZSk7ZS5zZXRUaW1lKGN0KzE4MDAwMDApO3MuY193KGMyLCd0cnVlJyxlKTtyZXR1cm4gMTt9fSIpLHMuZGltbz1uZXcgRnVuY3Rpb24oIm0iLCJ5IiwidmFyIGQ9bmV3IERhdGUoeSxtKzEsMCk7cmV0dXJuIGQuZ2V0RGF0ZSgpOyIpLHMuZW5kb2Y9bmV3IEZ1bmN0aW9uKCJ4IiwidmFyIHQ9bmV3IERhdGU7dC5zZXRIb3VycygwKTt0LnNldE1pbnV0ZXMoMCk7dC5zZXRTZWNvbmRzKDApO2lmKHg9PSdtJyl7ZD1zLmRpbW8odC5nZXRNb250aCgpLHQuZ2V0RnVsbFllYXIoKSktdC5nZXREYXRlKCkrMTt9ZWxzZSBpZih4PT0ndycpe2Q9Ny10LmdldERheSgpO31lbHNlIHtkPTE7fXQuc2V0RGF0ZSh0LmdldERhdGUoKStkKTtyZXR1cm4gdDsiKSxzLmdldFZpc2l0U3RhcnQ9bmV3IEZ1bmN0aW9uKCJjIiwidmFyIHM9dGhpcyx2PTEsdD1uZXcgRGF0ZTt0LnNldFRpbWUodC5nZXRUaW1lKCkrMTgwMDAwMCk7aWYocy5jX3IoYykpe3Y9MH1pZighcy5jX3coYywxLHQpKXtzLmNfdyhjLDEsMCl9aWYoIXMuY19yKGMpKXt2PTB9cmV0dXJuIHY7Iikscy5jcm9zc1Zpc2l0UGFydGljaXBhdGlvbj1uZXcgRnVuY3Rpb24oInYiLCJjbiIsImV4IiwiY3QiLCJkbCIsImV2IiwiZHYiLCJ2YXIgcz10aGlzLGNlO2lmKHR5cGVvZihkdik9PT0ndW5kZWZpbmVkJylkdj0wO2lmKHMuZXZlbnRzJiZldil7dmFyIGF5PXMuc3BsaXQoZXYsJywnKTt2YXIgZWE9cy5zcGxpdChzLmV2ZW50cywnLCcpO2Zvcih2YXIgdT0wO3U8YXkubGVuZ3RoO3UrKyl7Zm9yKHZhciB4PTA7eDxlYS5sZW5ndGg7eCsrKXtpZihheVt1XT09ZWFbeF0pe2NlPTE7fX19fWlmKCF2fHx2PT0nJyl7aWYoY2Upe3MuY193KGNuLCcnKTtyZXR1cm4nJzt9ZWxzZSByZXR1cm4nJzt9dj1lc2NhcGUodik7dmFyIGFycnk9bmV3IEFycmF5KCksYT1uZXcgQXJyYXkoKSxjPXMuY19yKGNuKSxnPTAsaD1uZXcgQXJyYXkoKTtpZihjJiZjIT0nJyl7YXJyeT1zLnNwbGl0KGMsJ10sWycpO2ZvcihxPTA7cTxhcnJ5Lmxlbmd0aDtxKyspe3o9YXJyeVtxXTt6PXMucmVwbCh6LCdbJywnJyk7ej1zLnJlcGwoeiwnXScsJycpO3o9cy5yZXBsKHosXCInXCIsJycpO2FycnlbcV09cy5zcGxpdCh6LCcsJyl9fXZhciBlPW5ldyBEYXRlKCk7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrNSk7aWYoZHY9PTAmJmFycnkubGVuZ3RoPjAmJmFycnlbYXJyeS5sZW5ndGgtMV1bMF09PXYpYXJyeVthcnJ5Lmxlbmd0aC0xXT1bdixuZXcgRGF0ZSgpLmdldFRpbWUoKV07ZWxzZSBhcnJ5W2FycnkubGVuZ3RoXT1bdixuZXcgRGF0ZSgpLmdldFRpbWUoKV07dmFyIHN0YXJ0PWFycnkubGVuZ3RoLWN0PDA/MDphcnJ5Lmxlbmd0aC1jdDt2YXIgdGQ9bmV3IERhdGUoKTtmb3IodmFyIHg9c3RhcnQ7eDxhcnJ5Lmxlbmd0aDt4Kyspe3ZhciBkaWZmPU1hdGgucm91bmQoKHRkLmdldFRpbWUoKS1hcnJ5W3hdWzFdKS84NjQwMDAwMCk7aWYoZGlmZjxleCl7aFtnXT11bmVzY2FwZShhcnJ5W3hdWzBdKTthW2ddPVthcnJ5W3hdWzBdLGFycnlbeF1bMV1dO2crKzt9fXZhciBkYXRhPXMuam9pbihhLHtkZWxpbTonLCcsZnJvbnQ6J1snLGJhY2s6J10nLHdyYXA6XCInXCJ9KTtzLmNfdyhjbixkYXRhLGUpO3ZhciByPXMuam9pbihoLHtkZWxpbTpkbH0pO2lmKGNlKXMuY193KGNuLCcnKTtyZXR1cm4gcjsiKSxzLnBfZ3B2bmU9bmV3IEZ1bmN0aW9uKCJrIiwidSIsInZhciBzPXRoaXMsdj0nJyxpPXUuaW5kZXhPZignPycpLHE7aWYoayYmaT4tMSl7cT11LnN1YnN0cmluZyhpKzEpO3Y9cy5wdChxLCcmJywncF9ndmZuZScsayl9cmV0dXJuIHYiKSxzLnBfZ3ZmbmU9bmV3IEZ1bmN0aW9uKCJ0IiwiayIsImlmKHQpe3ZhciBzPXRoaXMsaT10LmluZGV4T2YoJz0nKSxwPWk8MD90OnQuc3Vic3RyaW5nKDAsaSksdj1pPDA/J1RydWUnOnQuc3Vic3RyaW5nKGkrMSk7aWYocC50b0xvd2VyQ2FzZSgpPT1rLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHY7fXJldHVybiAnJyIpLHMucHQ9bmV3IEZ1bmN0aW9uKCJ4IiwiZCIsImYiLCJhIiwidmFyIHM9dGhpcyx0PXgsej0wLHkscjt3aGlsZSh0KXt5PXQuaW5kZXhPZihkKTt5PXk8MD90Lmxlbmd0aDp5O3Q9dC5zdWJzdHJpbmcoMCx5KTtyPXNbZl0odCxhKTtpZihyKXJldHVybiByO3orPXkrZC5sZW5ndGg7dD14LnN1YnN0cmluZyh6LHgubGVuZ3RoKTt0PXo8eC5sZW5ndGg/dDonJ31yZXR1cm4nJzsiKSxzLmdldFF1ZXJ5UGFyYW1Ob0VuY29kZT1uZXcgRnVuY3Rpb24oInAiLCJkIiwidSIsInZhciBzPXRoaXMsdj0nJyxpLHQ7ZD1kP2Q6Jyc7dT11P3U6KHMucGFnZVVSTD9zLnBhZ2VVUkw6d2luZG93LmxvY2F0aW9uKTtpZih1PT0nZicpdT1zLmd0ZnMoKS5sb2NhdGlvbjt3aGlsZShwKXtpPXAuaW5kZXhPZignLCcpO2k9aTwwP3AubGVuZ3RoOmk7dD1zLnBfZ3B2bmUocC5zdWJzdHJpbmcoMCxpKSx1KycnKTtpZih0KXYrPXY/ZCt0OnQ7cD1wLnN1YnN0cmluZyhpPT1wLmxlbmd0aD9pOmkrMSl9cmV0dXJuIHYiKSxzLmdldE5ld1JlcGVhdD1uZXcgRnVuY3Rpb24oImQiLCJjbiIsInZhciBzPXRoaXMsZT1uZXcgRGF0ZSgpLGN2YWwsc3ZhbCxjdD1lLmdldFRpbWUoKTtkPWQ/ZDozMDtjbj1jbj9jbjonc19ucic7ZS5zZXRUaW1lKGN0K2QqMjQqNjAqNjAqMTAwMCk7Y3ZhbD1zLmNfcihjbik7aWYoY3ZhbC5sZW5ndGg9PTApe3MuY193KGNuLGN0KyctTmV3JyxlKTtyZXR1cm4nTmV3Jzt9c3ZhbD1zLnNwbGl0KGN2YWwsJy0nKTtpZihjdC1zdmFsWzBdPDMwKjYwKjEwMDAmJnN2YWxbMV09PSdOZXcnKXtzLmNfdyhjbixjdCsnLU5ldycsZSk7cmV0dXJuJ05ldyc7fWVsc2V7cy5jX3coY24sY3QrJy1SZXBlYXQnLGUpO3JldHVybidSZXBlYXQnO30iKSxzLmdldFZhbE9uY2U9bmV3IEZ1bmN0aW9uKCJ2IiwiYyIsImUiLCJ2YXIgcz10aGlzLGs9cy5jX3IoYyksYT1uZXcgRGF0ZTtlPWU/ZTowO2lmKHYpe2Euc2V0VGltZShhLmdldFRpbWUoKStlKjg2NDAwMDAwKTtzLmNfdyhjLHYsZT9hOjApO31yZXR1cm4gdj09az8nJzp2Iikscy5nZXRQcmV2aW91c1ZhbHVlPW5ldyBGdW5jdGlvbigidiIsImMiLCJlbCIsInZhciBzPXRoaXMsdD1uZXcgRGF0ZSxpLGoscj0nJzt0LnNldFRpbWUodC5nZXRUaW1lKCkrMTgwMDAwMCk7aWYoZWwpe2lmKHMuZXZlbnRzKXtpPXMuc3BsaXQoZWwsJywnKTtqPXMuc3BsaXQocy5ldmVudHMsJywnKTtmb3IoeCBpbiBpKXtmb3IoeSBpbiBqKXtpZihpW3hdPT1qW3ldKXtpZihzLmNfcihjKSkgcj1zLmNfcihjKTt2P3MuY193KGMsdix0KTpzLmNfdyhjLCdubyB2YWx1ZScsdCk7cmV0dXJuIHJ9fX19fWVsc2V7aWYocy5jX3IoYykpIHI9cy5jX3IoYyk7dj9zLmNfdyhjLHYsdCk6cy5jX3coYywnbm8gdmFsdWUnLHQpO3JldHVybiByfSIpLHMuZ2V0VGltZVBhcnRpbmc9bmV3IEZ1bmN0aW9uKCJ0IiwieiIsInkiLCJkYz1uZXcgRGF0ZSgnMS8xLzIwMDAnKTtmPTE1O25lPTg7aWYoZGMuZ2V0RGF5KCkhPTZ8fGRjLmdldE1vbnRoKCkhPTApe3JldHVybidEYXRhIE5vdCBBdmFpbGFibGUnfWVsc2V7O3o9cGFyc2VJbnQoeik7aWYoeT09JzIwMDknKXtmPTg7bmU9MX07Z21hcj1uZXcgRGF0ZSgnMy8xLycreSk7ZHN0cz1mLWdtYXIuZ2V0RGF5KCk7Z25vdj1uZXcgRGF0ZSgnMTEvMS8nK3kpO2RzdGU9bmUtZ25vdi5nZXREYXkoKTtzcHI9bmV3IERhdGUoJzMvJytkc3RzKycvJyt5KTtmbD1uZXcgRGF0ZSgnMTEvJytkc3RlKycvJyt5KTtjZD1uZXcgRGF0ZSgpO2lmKGNkPnNwciYmY2Q8Zmwpe3o9eisxfWVsc2V7ej16fTt1dGM9Y2QuZ2V0VGltZSgpKyhjZC5nZXRUaW1lem9uZU9mZnNldCgpKjYwMDAwKTt0ej1uZXcgRGF0ZSh1dGMgKyAoMzYwMDAwMCp6KSk7dGhpc3k9dHouZ2V0RnVsbFllYXIoKTt2YXIgZGF5cz1bJ1N1bmRheScsJ01vbmRheScsJ1R1ZXNkYXknLCdXZWRuZXNkYXknLCdUaHVyc2RheScsJ0ZyaWRheScsJ1NhdHVyZGF5J107aWYodGhpc3khPXkpe3JldHVybidEYXRhIE5vdCBBdmFpbGFibGUnfWVsc2V7O3RoaXNoPXR6LmdldEhvdXJzKCk7dGhpc21pbj10ei5nZXRNaW51dGVzKCk7dGhpc2Q9dHouZ2V0RGF5KCk7dmFyIGRvdz1kYXlzW3RoaXNkXTt2YXIgYXA9J0FNJzt2YXIgZHQ9J1dlZWtkYXknO3ZhciBtaW50PScwMCc7aWYodGhpc21pbj4zMCl7bWludD0nMzAnfWlmKHRoaXNoPj0xMil7YXA9J1BNJzt0aGlzaD10aGlzaC0xMn07aWYgKHRoaXNoPT0wKXt0aGlzaD0xMn07aWYodGhpc2Q9PTZ8fHRoaXNkPT0wKXtkdD0nV2Vla2VuZCd9O3ZhciB0aW1lc3RyaW5nPXRoaXNoKyc6JyttaW50K2FwO3ZhciBkYXlzdHJpbmc9ZG93O3ZhciBlbmRzdHJpbmc9ZHQ7aWYodD09J2gnKXtyZXR1cm4gdGltZXN0cmluZ31pZih0PT0nZCcpe3JldHVybiBkYXlzdHJpbmd9O2lmKHQ9PSd3Jyl7cmV0dXJuIGVuZHN0cmluZ319fTsiKSxzLnNldHVwTGlua1RyYWNrPW5ldyBGdW5jdGlvbigidmwiLCJjIiwiZSIsInZhciBzPXRoaXM7dmFyIGN2PXMuY19yKGMpO2lmKHZsKXt2YXIgdmxhPXZsLnNwbGl0KCcsJyk7fWlmKGN2IT0nJyl7dmFyIGN2YT1zLnNwbGl0KGN2LCdeXicpO2lmKGN2YVsxXSE9Jycpe2Zvcih4IGluIHZsYSl7c1t2bGFbeF1dPWN2YVt4XTtpZihlKXtzLmV2ZW50cz1zLmFwbChzLmV2ZW50cyxlLCcsJywyKTt9fX19cy5jX3coYywnJywwKTtpZih0eXBlb2Ygcy5saW5rT2JqZWN0IT0ndW5kZWZpbmVkJyYmcy5oYnhfbHQhPSdtYW51YWwnKXtzLmx0YT1bXTtpZih0eXBlb2Ygcy5saW5rT2JqZWN0IT1udWxsKXtzbG89cy5saW5rT2JqZWN0O2lmKHMubGlua09iamVjdCE9MCl7aWYocy5saW5rT2JqZWN0LmdldEF0dHJpYnV0ZSgnbmFtZScpIT1udWxsKXt2YXIgYj1zLmxpbmtPYmplY3QuZ2V0QXR0cmlidXRlKCduYW1lJyk7aWYoYi5pbmRleE9mKCcmbHBvcz0nKT4tMSl7cy5sdGFbM109Yi5tYXRjaCgnJmxwb3M9KFteJl0qKScpWzFdO31pZihiLmluZGV4T2YoJyZsaWQ9Jyk+LTEpe3MubHRhWzFdPWIubWF0Y2goJyZsaWQ9KFteJl0qKScpWzFdO319fWlmKHR5cGVvZiBzLmx0YVsxXT09J3VuZGVmaW5lZCcpe2lmKHMubGlua05hbWUhPTApe3MubHRhWzFdPXMubGlua05hbWU7fWVsc2UgaWYocy5saW5rT2JqZWN0IT0wKXtpZihzLmxpbmtPYmplY3QuaW5uZXJIVE1MLmluZGV4T2YoJzxpbWcnKT4tMSl7cy5sdGFbMV09cy5saW5rT2JqZWN0LmlubmVySFRNTC5tYXRjaCgnc3JjPVwiKFteXCJdKiknKVsxXTt9ZWxzZXtzLmx0YVsxXT1zLmxpbmtPYmplY3QuaW5uZXJIVE1MO319ZWxzZSBpZihzLmxpbmtVUkwpe3MubHRhWzFdPXMubGlua1VSTDt9ZWxzZXtzLmx0YVsxXT1udWxsO319aWYocy5sdGFbMV0hPW51bGwpe2lmKHR5cGVvZiBzLnBhZ2VOYW1lIT0ndW5kZWZpbmVkJylzLmx0YVswXT1zLnBhZ2VOYW1lO3MubHRhWzJdPXMucGFnZU5hbWUrJyB8ICcrcy5sdGFbMV07fX1pZihzLmxpbmtUeXBlIT0wKXtmb3IodmFyIHg9MDt4PHZsYS5sZW5ndGg7eCsrKXtzW3ZsYVt4XV09cy5jbGVhblN0cihzLmx0YVt4XSk7aWYoZSl7cy5ldmVudHM9cy5hcGwocy5ldmVudHMsZSwnLCcsMik7cy5saW5rVHJhY2tWYXJzPXMuYXBsKHMubGlua1RyYWNrVmFycywnZXZlbnRzJywnLCcsMik7fX1zLmxpbmtUcmFja1ZhcnM9cy5hcGwocy5saW5rVHJhY2tWYXJzLHZsLCcsJywyKTt9ZWxzZXtpZihzLmx0YVsxXSl7dmFyIHRjdj0nJztmb3IodmFyIHg9MDt4PHMubHRhLmxlbmd0aDt4Kyspe3Rjdis9cy5jbGVhblN0cihzLmx0YVt4XSkrJ15eJzt9cy5jX3coYyx0Y3YpO319cy5sdGE9bnVsbDt9Iikscy5jbGVhblN0cj1mdW5jdGlvbihlKXtpZih2b2lkIDAhPT1lKXJldHVybiBlPShlPWUucmVwbGFjZSgvPFwvP1tePl0rKD58JCkvZywiIikpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0scy5zcGxpdD1uZXcgRnVuY3Rpb24oImwiLCJkIiwidmFyIGkseD0wLGE9bmV3IEFycmF5O3doaWxlKGwpe2k9bC5pbmRleE9mKGQpO2k9aT4tMT9pOmwubGVuZ3RoO2FbeCsrXT1sLnN1YnN0cmluZygwLGkpO2w9bC5zdWJzdHJpbmcoaStkLmxlbmd0aCk7fXJldHVybiBhIikscy5hcGw9bmV3IEZ1bmN0aW9uKCJMIiwidiIsImQiLCJ1IiwidmFyIHM9dGhpcyxtPTA7aWYoIUwpTD0nJztpZih1KXt2YXIgaSxuLGE9cy5zcGxpdChMLGQpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspe249YVtpXTttPW18fCh1PT0xPyhuPT12KToobi50b0xvd2VyQ2FzZSgpPT12LnRvTG93ZXJDYXNlKCkpKTt9fWlmKCFtKUw9TD9MK2Qrdjp2O3JldHVybiBMIikscy5yZmw9ZnVuY3Rpb24oZSx0LG4saSxyKXtpZighZXx8IXQpcmV0dXJuIiI7dmFyIGE9W10scz0iIjtpPWl8fG4scj0hIXIsbj0oZT1lLnNwbGl0KG58fCIsIikpLmxlbmd0aDtmb3IodmFyIG89MDtvPG47bysrKS0xPGVbb10uaW5kZXhPZigiOiIpJiYoKHM9ZVtvXS5zcGxpdCgiOiIpKVsxXT1zWzBdKyI6IitzWzFdLGVbb109c1swXSksLTE8ZVtvXS5pbmRleE9mKCI9IikmJigocz1lW29dLnNwbGl0KCI9IikpWzFdPXNbMF0rIj0iK3NbMV0sZVtvXT1zWzBdKSxlW29dIT09dCYmcz9hLnB1c2goc1sxXSk6ZVtvXSE9PXQ/YS5wdXNoKGVbb10pOmVbb109PT10JiZyJiYocz9hLnB1c2goc1sxXSk6YS5wdXNoKGVbb10pLHI9ITEpLHM9IiI7cmV0dXJuIGEuam9pbihpKX0scy5nZXRBbmRQZXJzaXN0VmFsdWU9bmV3IEZ1bmN0aW9uKCJ2IiwiYyIsImUiLCJ2YXIgcz10aGlzLGE9bmV3IERhdGU7ZT1lP2U6MDthLnNldFRpbWUoYS5nZXRUaW1lKCkrZSo4NjQwMDAwMCk7aWYodilzLmNfdyhjLHYsZT9hOjApO3JldHVybiBzLmNfcihjKTsiKSxzLmpvaW49bmV3IEZ1bmN0aW9uKCJ2IiwicCIsInZhciBzID0gdGhpczt2YXIgZixiLGQsdztpZihwKXtmPXAuZnJvbnQ/cC5mcm9udDonJztiPXAuYmFjaz9wLmJhY2s6Jyc7ZD1wLmRlbGltP3AuZGVsaW06Jyc7dz1wLndyYXA/cC53cmFwOicnO312YXIgc3RyPScnO2Zvcih2YXIgeD0wO3g8di5sZW5ndGg7eCsrKXtpZih0eXBlb2Yodlt4XSk9PSdvYmplY3QnIClzdHIrPXMuam9pbiggdlt4XSxwKTtlbHNlIHN0cis9dyt2W3hdK3c7aWYoeDx2Lmxlbmd0aC0xKXN0cis9ZDt9cmV0dXJuIGYrc3RyK2I7Iikscy5zb2NpYWxQbGF0Zm9ybXM9bmV3IEZ1bmN0aW9uKCJhIiwidmFyIHM9dGhpcyxnLEssRCxFLEYsaTtnPXMucmVmZXJyZXI/cy5yZWZlcnJlcjpkb2N1bWVudC5yZWZlcnJlcjtnPWcudG9Mb3dlckNhc2UoKTtLPXMuc3BsaXQocy5zb2NQbGF0TGlzdCwnfCcpO2ZvcihpPTA7aTxLLmxlbmd0aDtpKyspe0Q9cy5zcGxpdChLW2ldLCc+Jyk7aWYoZy5pbmRleE9mKERbMF0pIT0tMSl7cy5jb250ZXh0RGF0YVsnYS5zb2NpYWxjb250ZW50cHJvdmlkZXInXT1EWzFdO319Iikscy5zb2NQbGF0TGlzdD0iZmFjZWJvb2suY29tPkZhY2Vib29rfHR3aXR0ZXIuY29tPlR3aXR0ZXJ8dC5jby8+VHdpdHRlcnx5b3V0dWJlLmNvbT5Zb3V0dWJlfGNsaXBtYXJrcy5jb20+Q2xpcG1hcmtzfGRhaWx5bW90aW9uLmNvbT5EYWlseW1vdGlvbnxkZWxpY2lvdXMuY29tPkRlbGljaW91c3xkaWdnLmNvbT5EaWdnfGRpaWdvLmNvbT5EaWlnb3xmbGlja3IuY29tPkZsaWNrcnxmbGl4c3Rlci5jb20+RmxpeHN0ZXJ8Zm90b2xvZy5jb20+Rm90b2xvZ3xmcmllbmRmZWVkLmNvbT5GcmllbmRGZWVkfGdvb2dsZS5jb20vYnV6ej5Hb29nbGUgQnV6enxidXp6Lmdvb2dsZWFwaXMuY29tPkdvb2dsZSBCdXp6fHBsdXMuZ29vZ2xlLmNvbT5Hb29nbGUrfGh1bHUuY29tPkh1bHV8aWRlbnRpLmNhPmlkZW50aS5jYXxpbGlrZS5jb20+aUxpa2V8aW50ZW5zZWRlYmF0ZS5jb20+SW50ZW5zZURlYmF0ZXxteXNwYWNlLmNvbT5NeVNwYWNlfG5ld3NnYXRvci5jb20+TmV3c2dhdG9yfHBob3RvYnVja2V0LmNvbT5QaG90b2J1Y2tldHxwbHVyay5jb20+UGx1cmt8c2xpZGVzaGFyZS5uZXQ+U2xpZGVTaGFyZXxzbXVnbXVnLmNvbT5TbXVnTXVnfHN0dW1ibGV1cG9uLmNvbT5TdHVtYmxlVXBvbnx0dW1ibHIuY29tPlR1bWJscnx2aW1lby5jb20+VmltZW98d29yZHByZXNzLmNvbT5Xb3JkUHJlc3N8eGFuZ2EuY29tPlhhbmdhfG1ldGFjYWZlLmNvbT5NZXRhY2FmZXxwaW50ZXJlc3QuY29tPlBpbnRlcmVzdCIscy5zb2NpYWxBdXRob3JzPW5ldyBGdW5jdGlvbigiIiwidmFyIHM9dGhpcyxnO2c9cy5yZWZlcnJlcj9zLnJlZmVycmVyOmRvY3VtZW50LnJlZmVycmVyO2lmKGcuaW5kZXhPZignaHR0cDovL3QuY28vJyk9PT0wfHxnLmluZGV4T2YoJ2h0dHBzOi8vdC5jby8nKT09PTB8fGcuaW5kZXhPZigncGludGVyZXN0LmNvbS9waW4nKSE9PS0xfHxnLmluZGV4T2YoJ3R1bWJsci5jb20nKSE9PS0xfHxnLmluZGV4T2YoJ3lvdXR1YmUuY29tJykhPT0tMSl7cy5JbnRlZ3JhdGUuYWRkKCdTb2NpYWxBdXRob3InKTtzLkludGVncmF0ZS5Tb2NpYWxBdXRob3IuZ2V0KCdodHRwOi8vc2Etc2VydmljZXMuc29jaWFsLm9tbml0dXJlLmNvbS9hdXRob3IvbmFtZT92YXI9W1ZBUl0mY2FsbGJhY2s9cy5zb2NpYWxBdXRob3JTZWFyY2gmcnM9JytlbmNvZGVVUklDb21wb25lbnQocy5hY2NvdW50KSsnJnE9JytlbmNvZGVVUklDb21wb25lbnQoZykpO3MuSW50ZWdyYXRlLlNvY2lhbEF1dGhvci5kZWxheSgpO3MuSW50ZWdyYXRlLlNvY2lhbEF1dGhvci5zZXRWYXJzPWZ1bmN0aW9uKHMscCl7cy5jb250ZXh0RGF0YVsnYS5zb2NpYWxhdXRob3InXT1zLnVzZXI7fX0iKSxzLnNvY2lhbEF1dGhvclNlYXJjaD1uZXcgRnVuY3Rpb24oIm9iaiIsInZhciBzPXRoaXM7aWYodHlwZW9mIG9iaj09PSd1bmRlZmluZWQnfHx0eXBlb2Ygb2JqLmF1dGhvcj09PSd1bmRlZmluZWQnKXtzLnVzZXI9J05vdCBGb3VuZCc7fWVsc2V7cy51c2VyPW9iai5hdXRob3I7fXMuSW50ZWdyYXRlLlNvY2lhbEF1dGhvci5yZWFkeSgpOyIpLHMuX19jY3Vjcnx8KHMuY19ycj1zLmNfcixzLl9fY2N1Y3I9ITAscy5jX3JzcGVycz10LHMuY19yPWUpLHMuX19jY3Vjd3x8KHMuY193cj1zLmNfdyxzLl9fY2N1Y3c9ITAscy5jX3c9bikscy5wX2ZvPW5ldyBGdW5jdGlvbigibiIsInZhciBzPXRoaXM7aWYoIXMuX19mbyl7cy5fX2ZvPW5ldyBPYmplY3Q7fWlmKCFzLl9fZm9bbl0pe3MuX19mb1tuXT1uZXcgT2JqZWN0O3JldHVybiAxO31lbHNlIHtyZXR1cm4gMDt9Iikscy5yZXBsPW5ldyBGdW5jdGlvbigieCIsIm8iLCJuIiwidmFyIGk9eC5pbmRleE9mKG8pLGw9bi5sZW5ndGg7d2hpbGUoeCYmaT49MCl7eD14LnN1YnN0cmluZygwLGkpK24reC5zdWJzdHJpbmcoaStvLmxlbmd0aCk7aT14LmluZGV4T2YobyxpK2wpfXJldHVybiB4Iikscy5jbGlja1Bhc3Q9bmV3IEZ1bmN0aW9uKCJzY3AiLCJjdF9ldiIsImNwX2V2IiwiY3BjIiwidmFyIHM9dGhpcyxzY3AsY3RfZXYsY3BfZXYsY3BjLGV2LHRjdDtpZihzLnBfZm8oY3RfZXYpPT0xKXtpZighY3BjKXtjcGM9J3NfY3BjJzt9ZXY9cy5ldmVudHM/cy5ldmVudHMrJywnOicnO2lmKHNjcCl7cy5ldmVudHM9ZXYrY3RfZXY7cy5jX3coY3BjLDEsMCk7fWVsc2V7aWYocy5jX3IoY3BjKT49MSl7cy5ldmVudHM9ZXYrY3BfZXY7cy5jX3coY3BjLDAsMCk7fX19Iikscy5tYW5hZ2VRdWVyeVBhcmFtPW5ldyBGdW5jdGlvbigicCIsInciLCJlIiwidSIsInZhciBzPXRoaXMseCx5LGkscXMscXAscXYsZixiO3U9dT91OihzLnBhZ2VVUkw/cy5wYWdlVVJMOicnK3dpbmRvdy5sb2NhdGlvbik7eD11LmluZGV4T2YoJz8nKTtxcz14Pi0xP3Uuc3Vic3RyaW5nKHgsdS5sZW5ndGgpOicnO3U9eD4tMT91LnN1YnN0cmluZygwLHgpOnU7eD1xcy5pbmRleE9mKCc/JytwKyc9Jyk7aWYoeD4tMSl7eT1xcy5pbmRleE9mKCcmJyk7Zj0nJztpZih5Pi0xKXtxcD1xcy5zdWJzdHJpbmcoeCsxLHkpO2I9cXMuc3Vic3RyaW5nKHkrMSxxcy5sZW5ndGgpO31lbHNle3FwPXFzLnN1YnN0cmluZygxLHFzLmxlbmd0aCk7Yj0nJzt9fWVsc2V7eD1xcy5pbmRleE9mKCcmJytwKyc9Jyk7aWYoeD4tMSl7Zj1xcy5zdWJzdHJpbmcoMSx4KTtiPXFzLnN1YnN0cmluZyh4KzEscXMubGVuZ3RoKTt5PWIuaW5kZXhPZignJicpO2lmKHk+LTEpe3FwPWIuc3Vic3RyaW5nKDAseSk7Yj1iLnN1YnN0cmluZyh5LGIubGVuZ3RoKTt9ZWxzZXtxcD1iO2I9Jyc7fX19aWYoZSYmcXApe3k9cXAuaW5kZXhPZignPScpO3F2PXk+LTE/cXAuc3Vic3RyaW5nKHkrMSxxcC5sZW5ndGgpOicnO3ZhciBldWk9MDt3aGlsZShxdi5pbmRleE9mKCclMjUnKT4tMSl7cXY9dW5lc2NhcGUocXYpO2V1aSsrO2lmKGV1aT09MTApYnJlYWs7fXF2PXMucmVwbGFjZShxdiwnKycsJyAnKTtxdj1lc2NhcGUocXYpO3F2PXMucmVwbGFjZShxdiwnJTI1JywnJScpO3F2PXMucmVwbGFjZShxdiwnJTdDJywnfCcpO3F2PXMucmVwbGFjZShxdiwnJTdjJywnfCcpO3FwPXFwLnN1YnN0cmluZygwLHkrMSkrcXY7fWlmKHcmJnFwKXtpZihmKXFzPSc/JytxcCsnJicrZitiO2Vsc2UgaWYoYilxcz0nPycrcXArJyYnK2I7ZWxzZSBxcz0nPycrcXB9ZWxzZSBpZihmKXFzPSc/JytmKycmJytxcCtiO2Vsc2UgaWYoYilxcz0nPycrcXArJyYnK2I7ZWxzZSBpZihxcClxcz0nPycrcXA7cmV0dXJuIHUrcXM7Iikscy5oYW5kbGVQUFZldmVudHM9bmV3IEZ1bmN0aW9uKCIiLCJ2YXIgVz13aW5kb3cscz1XLnNfbmFtZSYmdHlwZW9mIFdbc19uYW1lXT09J29iamVjdCc/V1tzX25hbWVdOjA7aWYoIXN8fCFzLmdldFBQVmlkKXJldHVybjt2YXIgQj1kb2N1bWVudC5ib2R5LEU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LEQ9d2luZG93LmRvY3VtZW50O2Q9TWF0aC5tYXgoQi5zY3JvbGxIZWlnaHQsRS5zY3JvbGxIZWlnaHQsQi5vZmZzZXRIZWlnaHQsRS5vZmZzZXRIZWlnaHQsQi5jbGllbnRIZWlnaHQsRS5jbGllbnRIZWlnaHQpLHY9d2luZG93LmlubmVySGVpZ2h0fHxFLmNsaWVudEhlaWdodHx8Qi5jbGllbnRIZWlnaHQsdD13aW5kb3cucGFnZVlPZmZzZXR8fEQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8RC5ib2R5LnNjcm9sbFRvcCxoPXQrdixwPU1hdGgubWluKE1hdGgucm91bmQoaC9kKjEwMCksMTAwKSxjPXMuY19yKCdzX3BwdicpLGE9Yy5pbmRleE9mKCcsJyk+LTE/Yy5zcGxpdCgnLCcsNCk6W10sbD1hLmxlbmd0aCxuPWw+MD9hWzBdOmVzY2FwZShzLmdldFBQVmlkKSxQPWw+MT9wYXJzZUludChhWzFdKTowLGY9bD4yP3BhcnNlSW50KGFbMl0pOnAsSD1sPjM/cGFyc2VJbnQoYVszXSk6MCxjbj1wPjA/bisnLCcrKHA+UD9wOlApKycsJytmKycsJysoaD5IP2g6SCk6Jyc7cy5jX3coJ3NfcHB2JyxjbikiKSxzLmdldFBlcmNlbnRQYWdlVmlld2VkPW5ldyBGdW5jdGlvbigibiIsImlmKHR5cGVvZiB0aGlzLmxpbmtUeXBlIT0ndW5kZWZpbmVkJylyZXR1cm4nJzt2YXIgcz10aGlzLHc9d2luZG93LEY9ZmFsc2UsZT13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcnx8d2luZG93LmF0dGFjaEV2ZW50fHwnJztpPTMsdj1zLmNfcignc19wcHYnKSxhPXYuaW5kZXhPZignLCcpPi0xP3Yuc3BsaXQoJywnLDQpOltdO2lmKGEubGVuZ3RoPDQpe3doaWxlKGk+MClhW2ktLV09aTxhLmxlbmd0aD9hW2ktMV06Jyc7YVswXT0nJ31hWzBdPXVuZXNjYXBlKGFbMF0pO3MuZ2V0UFBWaWQ9bj1ufHxzLnBhZ2VOYW1lfHxkb2N1bWVudC5sb2NhdGlvbi5ocmVmO3MuY193KCdzX3BwdicsZXNjYXBlKG4pKTtpZighcy5nZXRQUFZldmVudHMpe3MuZ2V0UFBWZXZlbnRzPTE7aWYoIXcuc19uYW1lKXtmb3IoaSBpbiB3KWlmKHdbaV09PT1zKXtzX25hbWU9aTticmVha319Zm9yKGkgaW57J2xvYWQnOicnLCdzY3JvbGwnOicnLCdyZXNpemUnOicnfSllKCh3aW5kb3cuYXR0YWNoRXZlbnQ/J29uJzonJykraSxzLmhhbmRsZVBQVmV2ZW50cyxGKX1yZXR1cm4gYSIpLHMudHJhY2tUTlQ9bmV3IEZ1bmN0aW9uKCJ2IiwicCIsImIiLCJ2YXIgcz10aGlzLG49J3NfdG50JyxxPSdzX3RudHJlZicscD0ocCk/cDpuLHY9KHYpP3Y6bixyPScnLHBtPWZhbHNlLGI9KGIpP2I6dHJ1ZTtpZihzLlV0aWwuZ2V0UXVlcnlQYXJhbShxKSE9Jycpe3MucmVmZXJyZXI9cy5VdGlsLmdldFF1ZXJ5UGFyYW0ocSk7fWVsc2UgaWYocy5jX3IocSkhPScnKXtzLnJlZmVycmVyPXMuY19yKHEpO2RvY3VtZW50LmNvb2tpZT1xKyc9O3BhdGg9LztleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UOyc7fWVsc2UgaWYoKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKHEpIT0tMSYmcy5jX3IocSk9PScnKXx8KGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKHErJz0nKSE9LTEmJnMuVXRpbC5nZXRRdWVyeVBhcmFtKHEpPT0nJykpe3MucmVmZXJyZXI9J1R5cGVkL0Jvb2ttYXJrZWQnO2RvY3VtZW50LmNvb2tpZT1xKyc9O3BhdGg9LztleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UOyc7fWlmKHMuVXRpbC5nZXRRdWVyeVBhcmFtKHApIT0nJyl7cG09cy5VdGlsLmdldFF1ZXJ5UGFyYW0ocCk7fWVsc2UgaWYocy5jX3IocCkpe3BtPXMuY19yKHApO2RvY3VtZW50LmNvb2tpZT1wKyc9O3BhdGg9LztleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UOyc7fWVsc2UgaWYocy5jX3IocCk9PScnJiZzLlV0aWwuZ2V0UXVlcnlQYXJhbShwKT09Jycpe3BtPScnO31pZihwbSlyKz0ocG0rJywnKTtpZih3aW5kb3dbdl0hPXVuZGVmaW5lZClyKz13aW5kb3dbdl07aWYoYil3aW5kb3dbdl09Jyc7cmV0dXJuIHI7Iikscy5nZXRBYW1TZWdtZW50cz1uZXcgRnVuY3Rpb24oImEiLCJiIiwidmFyIHM9dGhpczt2YXIgYz1zLmNfcihhKTtpZihjKXtjPXMucmVwbChjLGIrJz0nLCcnKTt9cmV0dXJuIGMiKSxzLmFwbD1uZXcgRnVuY3Rpb24oIkwiLCJ2IiwiZCIsInUiLCJ2YXIgcz10aGlzLG09MDtpZighTClMPScnO2lmKHUpe3ZhciBpLG4sYT1zLnNwbGl0KEwsZCk7Zm9yKGk9MDtpPGEubGVuZ3RoO2krKyl7bj1hW2ldO209bXx8KHU9PTE/KG49PXYpOihuLnRvTG93ZXJDYXNlKCk9PXYudG9Mb3dlckNhc2UoKSkpO319aWYoIW0pTD1MP0wrZCt2OnY7cmV0dXJuIEwiKSx3aW5kb3cucyYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cucyYmKHMuVXRpbCwxKSYmIm9iamVjdCI9PXR5cGVvZiBzLlV0aWwmJih3aW5kb3cucy5VdGlsLmdldFF1ZXJ5UGFyYW09ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHI9d2luZG93O3JldHVybiB0fHwodD1zLnBhZ2VVUkw/cy5wYWdlVVJMOnIubG9jYXRpb24pLG58fChuPSImIiksZSYmdCYmKDA8PShpPSh0PSIiK3QpLmluZGV4T2YoIj8iKSkmJigwPD0oaT0odD1uK3Quc3Vic3RyaW5nKGkrMSkrbikudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobitlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSsiPSIpKSYmKDA8PShpPSh0PXQuc3Vic3RyaW5nKGkrbi5sZW5ndGgrZS5sZW5ndGgrMSkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKG4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkmJih0PXQuc3Vic3RyaW5nKDAsaSkpLDA8dC5sZW5ndGgpKSk/cy51bmVzY2FwZSh0KToiIn0pLHMub25jZVBlclBhZ2U9ZnVuY3Rpb24oZSl7aWYoZSl7Zm9yKHZhciB0PXMub3BwLnNwbGl0KCIsIiksbj0wO248dC5sZW5ndGg7bisrKXMuZXZlbnRzJiYodj1uZXcgUmVnRXhwKCIsKj8iK3Rbbl0rIlxcYiIpLG51bGwhPXMuZXZlbnRzLm1hdGNoKHYpJiYocy5ldmVudHM9cy5ldmVudHMucmVwbGFjZSh2LCIiKSwiLCI9PXMuZXZlbnRzLnN1YnN0cmluZygwLDEpJiYocy5ldmVudHM9cy5ldmVudHMuc3Vic3RyaW5nKDEscy5ldmVudHMubGVuZ3RoKSkpKTtmb3IodmFyIGk9ZS5zcGxpdCgiLCIpLHI9MDtyPGkubGVuZ3RoO3IrKylzLm9wcD1zLmFwbChzLm9wcCxpW3JdLCIsIiwyKX19LHMubG9hZE1vZHVsZSgiTWVkaWEiKSxzLk1lZGlhLmF1dG9UcmFjaz0hMCxzLk1lZGlhLnRyYWNrV2hpbGVQbGF5aW5nPSEwLHMuTWVkaWEudHJhY2tWYXJzPSJOb25lIixzLk1lZGlhLnRyYWNrRXZlbnRzPSJOb25lIiwidXMiPT1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpyZWdpb24iKS50b0xvd2VyQ2FzZSgpJiYtMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZmVkZXh0cmFjayIpJiYocy5jb250ZXh0RGF0YVsiY20uc3NmIl09MSk7dmFyIHI9IiIhPT1fc2F0ZWxsaXRlLmdldFZhcigiYWFtOnJlZ2lvbkZsYWciKSYmMCE9X3NhdGVsbGl0ZS5nZXRWYXIoImFhbTpyZWdpb25GbGFnIiksYT0iIiE9PV9zYXRlbGxpdGUuZ2V0VmFyKCJhYW06Y291bnRyeUZsYWciKSYmMCE9X3NhdGVsbGl0ZS5nZXRWYXIoImFhbTpjb3VudHJ5RmxhZyIpLG89ImZhbHNlIiE9PV9zYXRlbGxpdGUuZ2V0VmFyKCJhYW06SWRTeW5jRGlzYWJsZSIpLGM9X3NhdGVsbGl0ZS5nZXRWYXIoImFhbTpSZWdpb25Db250YWluZXJOU0lEIik7KHJ8fGEpJiYocy5sb2FkTW9kdWxlKCJBdWRpZW5jZU1hbmFnZW1lbnQiKSxzLkF1ZGllbmNlTWFuYWdlbWVudC5zZXR1cCh7cGFydG5lcjoiZmVkZXgiLGNvbnRhaW5lck5TSUQ6Yyx2aXNpdG9yU2VydmljZTp7bmFtZXNwYWNlOiIxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcifSxkaXNhYmxlRGVmYXVsdFJlcXVlc3Q6ITAsZGlzYWJsZVNjcmlwdEF0dGFjaG1lbnQ6ITAsZGlzYWJsZURlc3RpbmF0aW9uUHVibGlzaGluZ0lmcmFtZTpvfSkpO3ZhciBsPXtDU0lEOiIiLFNQT1RJRDoiNDE5MTI2MyIsdEV2YXI6ImVWYXI2MiIsZXJyb3JFdmFyOiJlVmFyNjMiLHRpbWVvdXRFdmVudDoiZXZlbnQ4MSIscmVxdWVzdFVSTDoiaHR0cDovL2Zscy5kb3VibGVjbGljay5uZXQvanNvbj9zcG90PVtTUE9USURdJnNyYz1bQ1NJRF0mdmFyPVtWQVJdJmhvc3Q9aW50ZWdyYXRlLjExMi4ybzcubmV0JTJGZGZhX2VjaG8lM0Z2YXIlM0RbVkFSXSUyNkFRRSUzRDElMjZBMlMlM0QxJm9yZD1bUkFORF0iLG1heERlbGF5OiI3NTAiLHZpc2l0Q29va2llOiJzX2RmYSIsY2xpY2tUaHJvdWdoUGFyYW06IkNJRCIsc2VhcmNoQ2VudGVyUGFyYW06dW5kZWZpbmVkLG5ld1JzaWRzUHJvcDp1bmRlZmluZWR9O3MubWF4RGVsYXk9bC5tYXhEZWxheSxzLmxvYWRNb2R1bGUoIkludGVncmF0ZSIpLHMuSW50ZWdyYXRlLm9uTG9hZD1mdW5jdGlvbihlKXtlLnNvY2lhbEF1dGhvcnMoKSxlLnBhcnRuZXJERkFDaGVjayhsKSYmKGUuSW50ZWdyYXRlLmFkZCgiREZBIiksZS5JbnRlZ3JhdGUuREZBLnRFdmFyPWwudEV2YXIsZS5JbnRlZ3JhdGUuREZBLmVycm9yRXZhcj1sLmVycm9yRXZhcixlLkludGVncmF0ZS5ERkEudGltZW91dEV2ZW50PWwudGltZW91dEV2ZW50LGUuSW50ZWdyYXRlLkRGQS5DU0lEPWwuQ1NJRCxlLkludGVncmF0ZS5ERkEuU1BPVElEPWwuU1BPVElELGUuSW50ZWdyYXRlLkRGQS5nZXQobC5yZXF1ZXN0VVJMKSxlLkludGVncmF0ZS5ERkEuc2V0VmFycz1mdW5jdGlvbihlLHQpe3dpbmRvd1t0LlZBUl0/dC5lYz90LmVycm9yRXZhciYmKGVbdC5lcnJvckV2YXJdPXQuZWMpOmVbdC50RXZhcl09IkRGQS0iKyh0Lmxpcz90LmxpczowKSsiLSIrKHQubGlwP3QubGlwOjApKyItIisodC5sYXN0aW1wP3QubGFzdGltcDowKSsiLSIrKHQubGFzdGltcHRpbWU/dC5sYXN0aW1wdGltZTowKSsiLSIrKHQubGNzP3QubGNzOjApKyItIisodC5sY3A/dC5sY3A6MCkrIi0iKyh0Lmxhc3RjbGs/dC5sYXN0Y2xrOjApKyItIisodC5sYXN0Y2xrdGltZT90Lmxhc3RjbGt0aW1lOjApOnQudGltZW91dEV2ZW50JiYoZS5ldmVudHM9KGUuZXZlbnRzJiYiIiE9ZS5ldmVudHM/ZS5ldmVudHMrIiwiOiIiKSt0LnRpbWVvdXRFdmVudCl9KX19ZnVuY3Rpb24gJF9fX3Zhcl84NDU5NTZhNThmMDQ4MWQ4KHMpe3ZhciBvPXRoaXM7by5zPXM7dmFyIGM9d2luZG93O2Muc19jX2lufHwoYy5zX2NfaWw9W10sYy5zX2NfaW49MCksby5faWw9Yy5zX2NfaWwsby5faW49Yy5zX2NfaW4sby5faWxbby5faW5dPW8sYy5zX2NfaW4rKyxvLl9jPSJzX20iLG8ubGlzdD1bXSxvLmFkZD1mdW5jdGlvbihlLHQpe3ZhciBhO3R8fCh0PSJzX0ludGVncmF0ZV8iK2UpLGNbdF18fChjW3RdPXt9KSwoYT1vW2VdPWNbdF0pLmE9ZSxhLmU9byxhLl9jPTAsYS5fZD0wLG51bGw9PWEuZGlzYWJsZSYmKGEuZGlzYWJsZT0wKSxhLmdldD1mdW5jdGlvbihlLHQpe3ZhciBuLGk9ZG9jdW1lbnQscj1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJIRUFEIik7aWYoIWEuZGlzYWJsZSYmKHR8fCh2PSJzXyIrby5faW4rIl9JbnRlZ3JhdGVfIithLmErIl9nZXRfIithLl9jKSxhLl9jKyssYS5WQVI9dixhLkNBTExCQUNLPSJzX2NfaWxbIitvLl9pbisiXS4iK2EuYSsiLmNhbGxiYWNrIixhLmRlbGF5KCkscj1yJiYwPHIubGVuZ3RoP3JbMF06aS5ib2R5KSl0cnl7KG49aS5jcmVhdGVFbGVtZW50KCJTQ1JJUFQiKSkudHlwZT0idGV4dC9qYXZhc2NyaXB0IixuLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpLG4uc3JjPW8uYyhhLGUpLGUuaW5kZXhPZigiW0NBTExCQUNLXSIpPDAmJihuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2EuY2FsbGJhY2soY1t2XSl9KSxyLmZpcnN0Q2hpbGQ/ci5pbnNlcnRCZWZvcmUobixyLmZpcnN0Q2hpbGQpOnIuYXBwZW5kQ2hpbGQobil9Y2F0Y2gocyl7fX0sYS5jYWxsYmFjaz1mdW5jdGlvbihlKXt2YXIgdDtpZihlKWZvcih0IGluIGUpT2JqZWN0LnByb3RvdHlwZVt0XXx8KGFbdF09ZVt0XSk7YS5yZWFkeSgpfSxhLmJlYWNvbj1mdW5jdGlvbihlKXt2YXIgdD0ic19pXyIrby5faW4rIl9JbnRlZ3JhdGVfIithLmErIl8iK2EuX2M7YS5kaXNhYmxlfHwoYS5fYysrLCh0PWNbdF09bmV3IEltYWdlKS5zcmM9by5jKGEsZSkpfSxhLnNjcmlwdD1mdW5jdGlvbihlKXthLmdldChlLDEpfSxhLmRlbGF5PWZ1bmN0aW9uKCl7YS5fZCsrfSxhLnJlYWR5PWZ1bmN0aW9uKCl7YS5fZC0tLGEuZGlzYWJsZXx8cy5kZWxheVJlYWR5KCl9LG8ubGlzdC5wdXNoKGUpfSxvLl9nPWZ1bmN0aW9uKGUpe3ZhciB0LG49KGU/InVzZSI6InNldCIpKyJWYXJzIjtmb3IoZT0wO2U8by5saXN0Lmxlbmd0aDtlKyspaWYoKHQ9b1tvLmxpc3RbZV1dKSYmIXQuZGlzYWJsZSYmdFtuXSl0cnl7dFtuXShzLHQpfWNhdGNoKGMpe319LG8uX3Q9ZnVuY3Rpb24oKXtvLl9nKDEpfSxvLl9kPWZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoZT0wO2U8by5saXN0Lmxlbmd0aDtlKyspaWYoKHQ9b1tvLmxpc3RbZV1dKSYmIXQuZGlzYWJsZSYmMDx0Ll9kKXJldHVybiAxO3JldHVybiAwfSxvLmM9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLHIsYTtmb3IoImh0dHAiIT10LnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDAsNCkmJih0PSJodHRwOi8vIit0KSxzLnNzbCYmKHQ9cy5yZXBsYWNlKHQsImh0dHA6IiwiaHR0cHM6IikpLGUuUkFORD1NYXRoLmZsb29yKDFlMTMqTWF0aC5yYW5kb20oKSksbj0wOzA8PW47KTA8PShuPXQuaW5kZXhPZigiWyIsbikpJiYobjwoaT10LmluZGV4T2YoIl0iLG4pKSYmKDI8KHI9dC5zdWJzdHJpbmcobisxLGkpKS5sZW5ndGgmJiJzLiI9PXIuc3Vic3RyaW5nKDAsMik/KGE9c1tyLnN1YnN0cmluZygyKV0pfHwoYT0iIik6KGE9IiIrZVtyXSkhPWVbcl0mJnBhcnNlRmxvYXQoYSkhPWVbcl0mJihyPTApLHImJih0PXQuc3Vic3RyaW5nKDAsbikrZW5jb2RlVVJJQ29tcG9uZW50KGEpK3Quc3Vic3RyaW5nKGkrMSkpLG49aSkpO3JldHVybiB0fX1mdW5jdGlvbiAkX19fdmFyX2ZkY2IyYjVmZjg4Y2RkOTYoZSl7dmFyIHQ9dGhpczt0LnM9ZTt2YXIgbj13aW5kb3c7bi5zX2NfaW58fChuLnNfY19pbD1bXSxuLnNfY19pbj0wKSx0Ll9pbD1uLnNfY19pbCx0Ll9pbj1uLnNfY19pbix0Ll9pbFt0Ll9pbl09dCxuLnNfY19pbisrLHQuX2M9InNfbSIsdC5zZXR1cD1mdW5jdGlvbihlKXtuLkRJTCYmZSYmKGUuZGlzYWJsZURlZmF1bHRSZXF1ZXN0PSEwLGUuZGlzYWJsZUNPUlM9ITAsZS5zZWN1cmVEYXRhQ29sbGVjdGlvbj0hMSx0Lmluc3RhbmNlPW4uRElMLmNyZWF0ZShlKSx0LnRvb2xzPW4uRElMLnRvb2xzKX0sdC5pc1JlYWR5PWZ1bmN0aW9uKCl7cmV0dXJuISF0Lmluc3RhbmNlfSx0LmdldEV2ZW50Q2FsbENvbmZpZ1BhcmFtcz1mdW5jdGlvbigpe3JldHVybiB0Lmluc3RhbmNlJiZ0Lmluc3RhbmNlLmFwaSYmdC5pbnN0YW5jZS5hcGkuZ2V0RXZlbnRDYWxsQ29uZmlnUGFyYW1zP3QuaW5zdGFuY2UuYXBpLmdldEV2ZW50Q2FsbENvbmZpZ1BhcmFtcygpOnt9fSx0LnBhc3NEYXRhPWZ1bmN0aW9uKGUpe3QuaW5zdGFuY2UmJnQuaW5zdGFuY2UuYXBpJiZ0Lmluc3RhbmNlLmFwaS5wYXNzRGF0YSYmdC5pbnN0YW5jZS5hcGkucGFzc0RhdGEoZSl9fWZ1bmN0aW9uICRfX192YXJfMTM4MjJhNDNlZWRkYWZhYyhjKXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5wYWdlWU9mZnNldCsodC5pbm5lckhlaWdodHx8MCk7ZSYmK3A8ZSYmKHA9ZSl9ZnVuY3Rpb24gbigpe2lmKGQuc2Nyb2xsUmVhY2hTZWxlY3Rvcil7dmFyIHQ9Yy5kLnF1ZXJ5U2VsZWN0b3ImJmMuZC5xdWVyeVNlbGVjdG9yKGQuc2Nyb2xsUmVhY2hTZWxlY3Rvcik7dD8ocD10LnNjcm9sbFRvcHx8MCx0LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXt2YXIgZTsoZT10JiZ0LnNjcm9sbFRvcCt0LmNsaWVudEhlaWdodHx8MCk+cCYmKHA9ZSl9KSk6MDxyLS0mJnNldFRpbWVvdXQobiwxZTMpfX1mdW5jdGlvbiBhKGUsdCl7dmFyIG4saSxyO2lmKGUmJnQmJihuPWQuY1t0XXx8KGQuY1t0XT10LnNwbGl0KCIsIikpKSlmb3Iocj0wO3I8bi5sZW5ndGgmJihpPW5bcisrXSk7KWlmKC0xPGUuaW5kZXhPZihpKSlyZXR1cm4gbnVsbDtyZXR1cm4gZX1mdW5jdGlvbiBzKGUsdCxuLGkscil7dmFyIGEscztpZihlLmRhdGFzZXQmJihzPWUuZGF0YXNldFt0XSk/YT1zOmUuZ2V0QXR0cmlidXRlJiYoKHM9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtIituKSk/YT1zOihzPWUuZ2V0QXR0cmlidXRlKG4pKSYmKGE9cykpLCFhJiZjLnVzZUZvcmNlZExpbmtUcmFja2luZyYmcil7dmFyIG87aWYoZT1lLm9uY2xpY2s/IiIrZS5vbmNsaWNrOiIiLHZhclZhbHVlPSIiLGkmJmUmJjA8PSh0PWUuaW5kZXhPZihpKSkpe2Zvcih0Kz1pLmxlbmd0aDt0PGUubGVuZ3RoOylpZihuPWUuY2hhckF0KHQrKyksMDw9IidcIiIuaW5kZXhPZihuKSl7bz1uO2JyZWFrfWZvcihzPSExO3Q8ZS5sZW5ndGgmJm8mJihuPWUuY2hhckF0KHQpLHN8fG4hPT1vKTspIlxcIj09PW4/cz0hMDoodmFyVmFsdWUrPW4scz0hMSksdCsrfShvPXZhclZhbHVlKSYmKGMud1tpXT1vKX1yZXR1cm4gYXx8ciYmYy53W2ldfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBpO3JldHVybihpPWRbdF0oZSxuKSkmJmEodShpKSxkW3QrIkV4Y2x1c2lvbnMiXSl9ZnVuY3Rpb24gbChlLHQsbil7dmFyIGk7aWYoZSYmISgxPT09KGk9ZS5ub2RlVHlwZSkmJihpPWUubm9kZU5hbWUpJiYoaT1pLnRvVXBwZXJDYXNlKCkpJiZmW2ldKSYmKDE9PT1lLm5vZGVUeXBlJiYoaT1lLm5vZGVWYWx1ZSkmJih0W3QubGVuZ3RoXT1pKSxuLmF8fG4udHx8bi5zfHwhZS5nZXRBdHRyaWJ1dGV8fCgoaT1lLmdldEF0dHJpYnV0ZSgiYWx0IikpP24uYT1pOihpPWUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKT9uLnQ9aToiSU1HIj09KCIiK2Uubm9kZU5hbWUpLnRvVXBwZXJDYXNlKCkmJihpPWUuZ2V0QXR0cmlidXRlKCJzcmMiKXx8ZS5zcmMpJiYobi5zPWkpKSwoaT1lLmNoaWxkTm9kZXMpJiZpLmxlbmd0aCkpZm9yKGU9MDtlPGkubGVuZ3RoO2UrKylsKGlbZV0sdCxuKX1mdW5jdGlvbiB1KGUpe2lmKG51bGw9PWV8fG51bGw9PWUpcmV0dXJuIGU7dHJ5e3JldHVybiBlLnJlcGxhY2UoUmVnRXhwKCJeW1xcc1xcblxcZlxcclxcdFx0LVxyIMKg4ZqA4aCO4oCALeKAilx1MjAyOFx1MjAyOeKBn+OAgFx1ZmVmZl0rIiwibWciKSwiIikucmVwbGFjZShSZWdFeHAoIltcXHNcXG5cXGZcXHJcXHRcdC1cciDCoOGagOGgjuKAgC3igIpcdTIwMjhcdTIwMjnigZ/jgIBcdWZlZmZdKyQiLCJtZyIpLCIiKS5yZXBsYWNlKFJlZ0V4cCgiW1xcc1xcblxcZlxcclxcdFx0LVxyIMKg4ZqA4aCO4oCALeKAilx1MjAyOFx1MjAyOeKBn+OAgFx1ZmVmZl17MSx9IiwibWciKSwiICIpLnN1YnN0cmluZygwLDI1NCl9Y2F0Y2godCl7fX12YXIgZD10aGlzO2Qucz1jO3ZhciB0PXdpbmRvdzt0LnNfY19pbnx8KHQuc19jX2lsPVtdLHQuc19jX2luPTApLGQuX2lsPXQuc19jX2lsLGQuX2luPXQuc19jX2luLGQuX2lsW2QuX2luXT1kLHQuc19jX2luKyssZC5fYz0ic19tIjt2YXIgaSxwPTAscj02MDtkLmM9e307dmFyIGY9e1NDUklQVDoxLFNUWUxFOjEsTElOSzoxLENBTlZBUzoxfTtkLl9nPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLGk9Yy5jb250ZXh0RGF0YSxyPWMubGlua09iamVjdDsoZT1jLnBhZ2VOYW1lfHxjLnBhZ2VVUkwpJiYodD1vKHIsImxpbmsiLGMubGlua05hbWUpKSYmKG49byhyLCJyZWdpb24iKSkmJihpWyJhLmFjdGl2aXR5bWFwLnBhZ2UiXT1lLnN1YnN0cmluZygwLDI1NSksaVsiYS5hY3Rpdml0eW1hcC5saW5rIl09MTI4PHQubGVuZ3RoP3Quc3Vic3RyaW5nKDAsMTI4KTp0LGlbImEuYWN0aXZpdHltYXAucmVnaW9uIl09MTI3PG4ubGVuZ3RoP24uc3Vic3RyaW5nKDAsMTI3KTpuLDA8cCYmKGlbImEuYWN0aXZpdHltYXAueHkiXT0xMCpNYXRoLmZsb29yKHAvMTApKSxpWyJhLmFjdGl2aXR5bWFwLnBhZ2VJRFR5cGUiXT1jLnBhZ2VOYW1lPzE6MCl9LGQuX2Q9ZnVuY3Rpb24oKXtkLnRyYWNrU2Nyb2xsUmVhY2gmJiFpJiYoZC5zY3JvbGxSZWFjaFNlbGVjdG9yP24oKTooZSgpLHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGUsITEpKSxpPSEwKX0sZC5saW5rPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodCluPWEodSh0KSxkLmxpbmtFeGNsdXNpb25zKTtlbHNlIGlmKChuPWUpJiYhKG49cyhlLCJzT2JqZWN0SWQiLCJzLW9iamVjdC1pZCIsInNfb2JqZWN0SUQiLDEpKSl7dmFyIGkscjsocj1hKHUoZS5pbm5lclRleHR8fGUudGV4dENvbnRlbnQpLGQubGlua0V4Y2x1c2lvbnMpKXx8KGwoZSxpPVtdLG49e2E6dm9pZCAwLHQ6dm9pZCAwLHM6dm9pZCAwfSksKHI9YSh1KGkuam9pbigiIikpKSl8fChyPWEodShuLmE/bi5hOm4udD9uLnQ6bi5zP24uczp2b2lkIDApKSl8fCEoaT0oaT1lLnRhZ05hbWUpJiZpLnRvVXBwZXJDYXNlP2kudG9VcHBlckNhc2UoKToiIil8fCgiSU5QVVQiPT1pfHwiU1VCTUlUIj09aSYmZS52YWx1ZT9yPWEodShlLnZhbHVlKSk6IklNQUdFIj09aSYmZS5zcmMmJihyPWEodShlLnNyYykpKSkpLG49cn1yZXR1cm4gbn0sZC5yZWdpb249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZC5yZWdpb25JREF0dHJpYnV0ZXx8ImlkIjtlJiYoZT1lLnBhcmVudE5vZGUpOyl7aWYodD1zKGUsbixuLG4pKXJldHVybiB0O2lmKCJCT0RZIj09ZS5ub2RlTmFtZSlyZXR1cm4iQk9EWSJ9fX1mdW5jdGlvbiAkX19fdmFyXzJkZjgwMDUzODQzOWI4MTEoZCl7dmFyIGY9dGhpcztmLnZlcnNpb249IjIuMjIuMCI7dmFyIHA9d2luZG93O3Auc19jX2lufHwocC5zX2NfaWw9W10scC5zX2NfaW49MCksZi5faWw9cC5zX2NfaWwsZi5faW49cC5zX2NfaW4sZi5faWxbZi5faW5dPWYscC5zX2NfaW4rKyxmLl9jPSJzX2MiO3ZhciBnPXAuQXBwTWVhc3VyZW1lbnQuaWM7Z3x8KGc9bnVsbCk7dmFyIGwsaCxtLGI9cDt0cnl7Zm9yKGw9Yi5wYXJlbnQsaD1iLmxvY2F0aW9uO2wmJmwubG9jYXRpb24mJmgmJiIiK2wubG9jYXRpb24hPSIiK2gmJmIubG9jYXRpb24mJiIiK2wubG9jYXRpb24hPSIiK2IubG9jYXRpb24mJmwubG9jYXRpb24uaG9zdD09PWguaG9zdDspbD0oYj1sKS5wYXJlbnR9Y2F0Y2goZSl7fWYuQz1mdW5jdGlvbihlKXt0cnl7Y29uc29sZS5sb2coZSl9Y2F0Y2godCl7fX0sZi5SYT1mdW5jdGlvbihlKXtyZXR1cm4iIitwYXJzZUludChlKT09IiIrZX0sZi5yZXBsYWNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hZXx8ZS5pbmRleE9mKHQpPDA/ZTplLnNwbGl0KHQpLmpvaW4obil9LGYuZXNjYXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWUpcmV0dXJuIGU7Zm9yKGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpLHQ9MDt0PDc7dCsrKW49Iit+ISooKSciLnN1YnN0cmluZyh0LHQrMSksMDw9ZS5pbmRleE9mKG4pJiYoZT1mLnJlcGxhY2UoZSxuLCIlIituLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpKTtyZXR1cm4gZX0sZi51bmVzY2FwZT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gZTtlPTA8PWUuaW5kZXhPZigiKyIpP2YucmVwbGFjZShlLCIrIiwiICIpOmU7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7fXJldHVybiB1bmVzY2FwZShlKX0sZi5OYj1mdW5jdGlvbigpe3ZhciBlLHQ9cC5sb2NhdGlvbi5ob3N0bmFtZSxuPWYuZnBDb29raWVEb21haW5QZXJpb2RzO2lmKG58fChuPWYuY29va2llRG9tYWluUGVyaW9kcyksdCYmIWYuS2EmJiEvXlswLTkuXSskLy50ZXN0KHQpJiYobj0yPChuPW4/cGFyc2VJbnQobik6Mik/bjoyLDA8PShlPXQubGFzdEluZGV4T2YoIi4iKSkpKXtmb3IoOzA8PWUmJjE8bjspZT10Lmxhc3RJbmRleE9mKCIuIixlLTEpLG4tLTtmLkthPTA8ZT90LnN1YnN0cmluZyhlKTp0fXJldHVybiBmLkthfSxmLmNfcj1mLmNvb2tpZVJlYWQ9ZnVuY3Rpb24oZSl7ZT1mLmVzY2FwZShlKTt2YXIgdD0iICIrZi5kLmNvb2tpZSxuPXQuaW5kZXhPZigiICIrZSsiPSIpLGk9bjwwP246dC5pbmRleE9mKCI7IixuKTtyZXR1cm4iW1tCXV0iIT0oZT1uPDA/IiI6Zi51bmVzY2FwZSh0LnN1YnN0cmluZyhuKzIrZS5sZW5ndGgsaTwwP3QubGVuZ3RoOmkpKSk/ZToiIn0sZi5jX3c9Zi5jb29raWVXcml0ZT1mdW5jdGlvbihlLHQsbil7dmFyIGkscj1mLk5iKCksYT1mLmNvb2tpZUxpZmV0aW1lO3JldHVybiB0PSIiK3QsYT1hPygiIithKS50b1VwcGVyQ2FzZSgpOiIiLG4mJiJTRVNTSU9OIiE9YSYmIk5PTkUiIT1hJiYoKGk9IiIhPXQ/cGFyc2VJbnQoYXx8MCk6LTYwKT8obj1uZXcgRGF0ZSkuc2V0VGltZShuLmdldFRpbWUoKSsxZTMqaSk6MT09PW4mJihpPShuPW5ldyBEYXRlKS5nZXRZZWFyKCksbi5zZXRZZWFyKGkrMisoaTwxOTAwPzE5MDA6MCkpKSksZSYmIk5PTkUiIT1hPyhmLmQuY29va2llPWYuZXNjYXBlKGUpKyI9IitmLmVzY2FwZSgiIiE9dD90OiJbW0JdXSIpKyI7IHBhdGg9LzsiKyhuJiYiU0VTU0lPTiIhPWE/IiBleHBpcmVzPSIrbi50b1VUQ1N0cmluZygpKyI7IjoiIikrKHI/IiBkb21haW49IityKyI7IjoiIikrKGYud3JpdGVTZWN1cmVDb29raWVzPyIgc2VjdXJlOyI6IiIpLGYuY29va2llUmVhZChlKT09dCk6MH0sZi5LYj1mdW5jdGlvbigpe3ZhciBlPWYuVXRpbC5nZXRJZVZlcnNpb24oKTsibnVtYmVyIj09dHlwZW9mIGUmJmU8MTAmJihmLnVuc3VwcG9ydGVkQnJvd3Nlcj0hMCxmLnhiKGYsZnVuY3Rpb24oKXt9KSl9LGYueWE9ZnVuY3Rpb24oKXt2YXIgZT1uYXZpZ2F0b3IudXNlckFnZW50O3JldHVybiJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiPT09bmF2aWdhdG9yLmFwcE5hbWV8fDA8PWUuaW5kZXhPZigiTVNJRSAiKXx8MDw9ZS5pbmRleE9mKCJUcmlkZW50LyIpJiYwPD1lLmluZGV4T2YoIldpbmRvd3MgTlQgNiIpfSxmLnhiPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dJiYoZVtuXT10KX0sZi5LPVtdLGYuZmE9ZnVuY3Rpb24oZSx0LG4pe2lmKGYuTGEpcmV0dXJuIDA7Zi5tYXhEZWxheXx8KGYubWF4RGVsYXk9MjUwKTt2YXIgaT0wLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCkrZi5tYXhEZWxheSxhPWYuZC52aXNpYmlsaXR5U3RhdGUscz1bIndlYmtpdHZpc2liaWxpdHljaGFuZ2UiLCJ2aXNpYmlsaXR5Y2hhbmdlIl07aWYoYXx8KGE9Zi5kLndlYmtpdFZpc2liaWxpdHlTdGF0ZSksYSYmInByZXJlbmRlciI9PWEpe2lmKCFmLmdhKWZvcihmLmdhPTEsbj0wO248cy5sZW5ndGg7bisrKWYuZC5hZGRFdmVudExpc3RlbmVyKHNbbl0sZnVuY3Rpb24oKXt2YXIgZT1mLmQudmlzaWJpbGl0eVN0YXRlO2V8fChlPWYuZC53ZWJraXRWaXNpYmlsaXR5U3RhdGUpLCJ2aXNpYmxlIj09ZSYmKGYuZ2E9MCxmLmRlbGF5UmVhZHkoKSl9KTtpPTEscj0wfWVsc2Ugbnx8Zi51KCJfZCIpJiYoaT0xKTtyZXR1cm4gaSYmKGYuSy5wdXNoKHttOmUsYTp0LHQ6cn0pLGYuZ2F8fHNldFRpbWVvdXQoZi5kZWxheVJlYWR5LGYubWF4RGVsYXkpKSxpfSxmLmRlbGF5UmVhZHk9ZnVuY3Rpb24oKXt2YXIgZSx0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLG49MDtmb3IoZi51KCJfZCIpP249MTpmLkFhKCk7MDxmLksubGVuZ3RoOyl7aWYoZT1mLksuc2hpZnQoKSxuJiYhZS50JiZlLnQ+dCl7Zi5LLnVuc2hpZnQoZSksc2V0VGltZW91dChmLmRlbGF5UmVhZHkscGFyc2VJbnQoZi5tYXhEZWxheS8yKSk7YnJlYWt9Zi5MYT0xLGZbZS5tXS5hcHBseShmLGUuYSksZi5MYT0wfX0sZi5zZXRBY2NvdW50PWYuc2E9ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighZi5mYSgic2V0QWNjb3VudCIsYXJndW1lbnRzKSlpZihmLmFjY291bnQ9ZSxmLmFsbEFjY291bnRzKWZvcih0PWYuYWxsQWNjb3VudHMuY29uY2F0KGUuc3BsaXQoIiwiKSksZi5hbGxBY2NvdW50cz1bXSx0LnNvcnQoKSxuPTA7bjx0Lmxlbmd0aDtuKyspMCE9biYmdFtuLTFdPT10W25dfHxmLmFsbEFjY291bnRzLnB1c2godFtuXSk7ZWxzZSBmLmFsbEFjY291bnRzPWUuc3BsaXQoIiwiKX0sZi5mb3JlYWNoVmFyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxyLGEscz0iIjtmb3Iocj1pPSIiLGYubGlnaHRQcm9maWxlSUQ/KG49Zi5PLChzPWYubGlnaHRUcmFja1ZhcnMpJiYocz0iLCIrcysiLCIrZi5sYS5qb2luKCIsIikrIiwiKSk6KG49Zi5nLChmLnBlfHxmLmxpbmtUeXBlKSYmKHM9Zi5saW5rVHJhY2tWYXJzLGk9Zi5saW5rVHJhY2tFdmVudHMsZi5wZSYmKHI9Zi5wZS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2YucGUuc3Vic3RyaW5nKDEpLGZbcl0mJihzPWZbcl0uZWMsaT1mW3JdLmNjKSkpLHMmJihzPSIsIitzKyIsIitmLkYuam9pbigiLCIpKyIsIiksaSYmcyYmKHMrPSIsZXZlbnRzLCIpKSx0JiYodD0iLCIrdCsiLCIpLGk9MDtpPG4ubGVuZ3RoO2krKylyPW5baV0sKGE9ZltyXSkmJighc3x8MDw9cy5pbmRleE9mKCIsIityKyIsIikpJiYoIXR8fDA8PXQuaW5kZXhPZigiLCIrcisiLCIpKSYmZShyLGEpfSxmLm89ZnVuY3Rpb24oZSx0LG4saSxyKXt2YXIgYSxzLG8sYyxsPSIiLHU9MDtpZigiY29udGV4dERhdGEiPT1lJiYoZT0iYyIpLHQpe2ZvcihhIGluIHQpaWYoIShPYmplY3QucHJvdG90eXBlW2FdfHxyJiZhLnN1YnN0cmluZygwLHIubGVuZ3RoKSE9cikmJnRbYV0mJighbnx8MDw9bi5pbmRleE9mKCIsIisoaT9pKyIuIjoiIikrYSsiLCIpKSl7aWYobz0hMSx1KWZvcihzPTA7czx1Lmxlbmd0aDtzKyspaWYoYS5zdWJzdHJpbmcoMCx1W3NdLmxlbmd0aCk9PXVbc10pe289ITA7YnJlYWt9aWYoIW8mJigiIj09bCYmKGwrPSImIitlKyIuIikscz10W2FdLHImJihhPWEuc3Vic3RyaW5nKHIubGVuZ3RoKSksMDxhLmxlbmd0aCkpaWYoMDwobz1hLmluZGV4T2YoIi4iKSkpbz0ocnx8IiIpKyhzPWEuc3Vic3RyaW5nKDAsbykpKyIuIix1fHwodT1bXSksdS5wdXNoKG8pLGwrPWYubyhzLHQsbixpLG8pO2Vsc2UgaWYoImJvb2xlYW4iPT10eXBlb2YgcyYmKHM9cz8idHJ1ZSI6ImZhbHNlIikscyl7aWYoInJldHJpZXZlTGlnaHREYXRhIj09aSYmci5pbmRleE9mKCIuY29udGV4dERhdGEuIik8MClzd2l0Y2gobz1hLnN1YnN0cmluZygwLDQpLGM9YS5zdWJzdHJpbmcoNCksYSl7Y2FzZSJ0cmFuc2FjdGlvbklEIjphPSJ4YWN0IjticmVhaztjYXNlImNoYW5uZWwiOmE9ImNoIjticmVhaztjYXNlImNhbXBhaWduIjphPSJ2MCI7YnJlYWs7ZGVmYXVsdDpmLlJhKGMpJiYoInByb3AiPT1vP2E9ImMiK2M6ImVWYXIiPT1vP2E9InYiK2M6Imxpc3QiPT1vP2E9ImwiK2M6ImhpZXIiPT1vJiYoYT0iaCIrYyxzPXMuc3Vic3RyaW5nKDAsMjU1KSkpfWwrPSImIitmLmVzY2FwZShhKSsiPSIrZi5lc2NhcGUocyl9fSIiIT1sJiYobCs9IiYuIitlKX1yZXR1cm4gbH0sZi51c2VQb3N0YmFja3M9MCxmLlFiPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLGkscixhLHMsbyxjPSIiLGw9IiIsdT0iIixkPWk9IiIscD1mLlQoKTtpZihmLmxpZ2h0UHJvZmlsZUlEPyhlPWYuTywobD1mLmxpZ2h0VHJhY2tWYXJzKSYmKGw9IiwiK2wrIiwiK2YubGEuam9pbigiLCIpKyIsIikpOihlPWYuZywoZi5wZXx8Zi5saW5rVHlwZSkmJihsPWYubGlua1RyYWNrVmFycyx1PWYubGlua1RyYWNrRXZlbnRzLGYucGUmJihpPWYucGUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKStmLnBlLnN1YnN0cmluZygxKSxmW2ldJiYobD1mW2ldLmVjLHU9ZltpXS5jYykpKSxsJiYobD0iLCIrbCsiLCIrZi5GLmpvaW4oIiwiKSsiLCIpLHUmJih1PSIsIit1KyIsIixsJiYobCs9IixldmVudHMsIikpLGYuZXZlbnRzMiYmKGQrPSgiIiE9ZD8iLCI6IiIpK2YuZXZlbnRzMikpLHAmJnAuZ2V0Q3VzdG9tZXJJRHMpe2lmKGk9ZyxyPXAuZ2V0Q3VzdG9tZXJJRHMoKSlmb3IodCBpbiByKU9iamVjdC5wcm90b3R5cGVbdF18fCJvYmplY3QiPT10eXBlb2Yobj1yW3RdKSYmKGl8fChpPXt9KSxuLmlkJiYoaVt0KyIuaWQiXT1uLmlkKSxuLmF1dGhTdGF0ZSYmKGlbdCsiLmFzIl09bi5hdXRoU3RhdGUpKTtpJiYoYys9Zi5vKCJjaWQiLGkpKX1mb3IoZi5BdWRpZW5jZU1hbmFnZW1lbnQmJmYuQXVkaWVuY2VNYW5hZ2VtZW50LmlzUmVhZHkoKSYmKGMrPWYubygiZCIsZi5BdWRpZW5jZU1hbmFnZW1lbnQuZ2V0RXZlbnRDYWxsQ29uZmlnUGFyYW1zKCkpKSx0PTA7dDxlLmxlbmd0aDt0Kyspe2lmKGk9ZVt0XSxyPWZbaV0sbj1pLnN1YnN0cmluZygwLDQpLGE9aS5zdWJzdHJpbmcoNCkscnx8KCJldmVudHMiPT1pJiZkPyhyPWQsZD0iIik6Im1hcmtldGluZ0Nsb3VkT3JnSUQiPT1pJiZwJiZmLlYoIkVDSUQiKSYmKHI9cC5tYXJrZXRpbmdDbG91ZE9yZ0lEKSksciYmKCFsfHwwPD1sLmluZGV4T2YoIiwiK2krIiwiKSkpe3N3aXRjaChpKXtjYXNlImN1c3RvbWVyUGVyc3BlY3RpdmUiOmk9ImNwIjticmVhaztjYXNlIm1hcmtldGluZ0Nsb3VkT3JnSUQiOmk9Im1jb3JnaWQiO2JyZWFrO2Nhc2Uic3VwcGxlbWVudGFsRGF0YUlEIjppPSJzZGlkIjticmVhaztjYXNlInRpbWVzdGFtcCI6aT0idHMiO2JyZWFrO2Nhc2UiZHluYW1pY1ZhcmlhYmxlUHJlZml4IjppPSJEIjticmVhaztjYXNlInZpc2l0b3JJRCI6aT0idmlkIjticmVhaztjYXNlIm1hcmtldGluZ0Nsb3VkVmlzaXRvcklEIjppPSJtaWQiO2JyZWFrO2Nhc2UiYW5hbHl0aWNzVmlzaXRvcklEIjppPSJhaWQiO2JyZWFrO2Nhc2UiYXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50IjppPSJhYW1saCI7YnJlYWs7Y2FzZSJhdWRpZW5jZU1hbmFnZXJCbG9iIjppPSJhYW1iIjticmVhaztjYXNlImF1dGhTdGF0ZSI6aT0iYXMiO2JyZWFrO2Nhc2UicGFnZVVSTCI6aT0iZyIsMjU1PHIubGVuZ3RoJiYoZi5wYWdlVVJMUmVzdD1yLnN1YnN0cmluZygyNTUpLHI9ci5zdWJzdHJpbmcoMCwyNTUpKTticmVhaztjYXNlInBhZ2VVUkxSZXN0IjppPSItZyI7YnJlYWs7Y2FzZSJyZWZlcnJlciI6aT0iciI7YnJlYWs7Y2FzZSJ2bWsiOmNhc2UidmlzaXRvck1pZ3JhdGlvbktleSI6aT0idm10IjticmVhaztjYXNlInZpc2l0b3JNaWdyYXRpb25TZXJ2ZXIiOmk9InZtZiIsZi5zc2wmJmYudmlzaXRvck1pZ3JhdGlvblNlcnZlclNlY3VyZSYmKHI9IiIpO2JyZWFrO2Nhc2UidmlzaXRvck1pZ3JhdGlvblNlcnZlclNlY3VyZSI6aT0idm1mIiwhZi5zc2wmJmYudmlzaXRvck1pZ3JhdGlvblNlcnZlciYmKHI9IiIpO2JyZWFrO2Nhc2UiY2hhclNldCI6aT0iY2UiO2JyZWFrO2Nhc2UidmlzaXRvck5hbWVzcGFjZSI6aT0ibnMiO2JyZWFrO2Nhc2UiY29va2llRG9tYWluUGVyaW9kcyI6aT0iY2RwIjticmVhaztjYXNlImNvb2tpZUxpZmV0aW1lIjppPSJjbCI7YnJlYWs7Y2FzZSJ2YXJpYWJsZVByb3ZpZGVyIjppPSJ2dnAiO2JyZWFrO2Nhc2UiY3VycmVuY3lDb2RlIjppPSJjYyI7YnJlYWs7Y2FzZSJjaGFubmVsIjppPSJjaCI7YnJlYWs7Y2FzZSJ0cmFuc2FjdGlvbklEIjppPSJ4YWN0IjticmVhaztjYXNlImNhbXBhaWduIjppPSJ2MCI7YnJlYWs7Y2FzZSJsYXRpdHVkZSI6aT0ibGF0IjticmVhaztjYXNlImxvbmdpdHVkZSI6aT0ibG9uIjticmVhaztjYXNlInJlc29sdXRpb24iOmk9InMiO2JyZWFrO2Nhc2UiY29sb3JEZXB0aCI6aT0iYyI7YnJlYWs7Y2FzZSJqYXZhc2NyaXB0VmVyc2lvbiI6aT0iaiI7YnJlYWs7Y2FzZSJqYXZhRW5hYmxlZCI6aT0idiI7YnJlYWs7Y2FzZSJjb29raWVzRW5hYmxlZCI6aT0iayI7YnJlYWs7Y2FzZSJicm93c2VyV2lkdGgiOmk9ImJ3IjticmVhaztjYXNlImJyb3dzZXJIZWlnaHQiOmk9ImJoIjticmVhaztjYXNlImNvbm5lY3Rpb25UeXBlIjppPSJjdCI7YnJlYWs7Y2FzZSJob21lcGFnZSI6aT0iaHAiO2JyZWFrO2Nhc2UiZXZlbnRzIjppZihkJiYocis9KCIiIT1yPyIsIjoiIikrZCksdSlmb3IoYT1yLnNwbGl0KCIsIikscj0iIixuPTA7bjxhLmxlbmd0aDtuKyspMDw9KG89KHM9YVtuXSkuaW5kZXhPZigiPSIpKSYmKHM9cy5zdWJzdHJpbmcoMCxvKSksMDw9KG89cy5pbmRleE9mKCI6IikpJiYocz1zLnN1YnN0cmluZygwLG8pKSwwPD11LmluZGV4T2YoIiwiK3MrIiwiKSYmKHIrPShyPyIsIjoiIikrYVtuXSk7YnJlYWs7Y2FzZSJldmVudHMyIjpyPSIiO2JyZWFrO2Nhc2UiY29udGV4dERhdGEiOmMrPWYubygiYyIsZltpXSxsLGkpLHI9IiI7YnJlYWs7Y2FzZSJsaWdodFByb2ZpbGVJRCI6aT0ibXRwIjticmVhaztjYXNlImxpZ2h0U3RvcmVGb3JTZWNvbmRzIjppPSJtdHNzIixmLmxpZ2h0UHJvZmlsZUlEfHwocj0iIik7YnJlYWs7Y2FzZSJsaWdodEluY3JlbWVudEJ5IjppPSJtdGkiLGYubGlnaHRQcm9maWxlSUR8fChyPSIiKTticmVhaztjYXNlInJldHJpZXZlTGlnaHRQcm9maWxlcyI6aT0ibXRzciI7YnJlYWs7Y2FzZSJkZWxldGVMaWdodFByb2ZpbGVzIjppPSJtdHNkIjticmVhaztjYXNlInJldHJpZXZlTGlnaHREYXRhIjpmLnJldHJpZXZlTGlnaHRQcm9maWxlcyYmKGMrPWYubygibXRzIixmW2ldLGwsaSkpLHI9IiI7YnJlYWs7ZGVmYXVsdDpmLlJhKGEpJiYoInByb3AiPT1uP2k9ImMiK2E6ImVWYXIiPT1uP2k9InYiK2E6Imxpc3QiPT1uP2k9ImwiK2E6ImhpZXIiPT1uJiYoaT0iaCIrYSxyPXIuc3Vic3RyaW5nKDAsMjU1KSkpfXImJihjKz0iJiIraSsiPSIrKCJwZXYiIT1pLnN1YnN0cmluZygwLDMpP2YuZXNjYXBlKHIpOnIpKX0icGV2MyI9PWkmJmYuZSYmKGMrPWYuZSl9cmV0dXJuIGYua2EmJihjKz0iJmxydD0iK2Yua2EsZi5rYT1udWxsKSxjfSxmLkI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWdOYW1lO3JldHVybiJ1bmRlZmluZWQiIT0iIitlLmxjfHwidW5kZWZpbmVkIiE9IiIrZS5aYiYmIkhUTUwiIT0oIiIrZS5aYikudG9VcHBlckNhc2UoKT8iIjooIlNIQVBFIj09KHQ9dCYmdC50b1VwcGVyQ2FzZT90LnRvVXBwZXJDYXNlKCk6IiIpJiYodD0iIiksdCYmKCgiSU5QVVQiPT10fHwiQlVUVE9OIj09dCkmJmUudHlwZSYmZS50eXBlLnRvVXBwZXJDYXNlP3Q9ZS50eXBlLnRvVXBwZXJDYXNlKCk6IXQmJmUuaHJlZiYmKHQ9IkEiKSksdCl9LGYuTmE9ZnVuY3Rpb24oZSl7dmFyIHQsbixpLHI9cC5sb2NhdGlvbixhPWUuaHJlZj9lLmhyZWY6IiI7cmV0dXJuIHQ9YS5pbmRleE9mKCI6Iiksbj1hLmluZGV4T2YoIj8iKSxpPWEuaW5kZXhPZigiLyIpLGEmJih0PDB8fDA8PW4mJm48dHx8MDw9aSYmaTx0KSYmKG49ZS5wcm90b2NvbCYmMTxlLnByb3RvY29sLmxlbmd0aD9lLnByb3RvY29sOnIucHJvdG9jb2w/ci5wcm90b2NvbDoiIix0PXIucGF0aG5hbWUubGFzdEluZGV4T2YoIi8iKSxhPShuP24rIi8vIjoiIikrKGUuaG9zdD9lLmhvc3Q6ci5ob3N0P3IuaG9zdDoiIikrKCIvIiE9YS5zdWJzdHJpbmcoMCwxKT9yLnBhdGhuYW1lLnN1YnN0cmluZygwLHQ8MD8wOnQpKyIvIjoiIikrYSksYX0sZi5MPWZ1bmN0aW9uKGUpe3ZhciB0LG4saT1mLkIoZSkscj0iIixhPTA7cmV0dXJuIGkmJih0PWUucHJvdG9jb2wsbj1lLm9uY2xpY2ssIWUuaHJlZnx8IkEiIT1pJiYiQVJFQSIhPWl8fG4mJnQmJiEodC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImphdmFzY3JpcHQiKTwwKT9uPyhyPWYucmVwbGFjZShmLnJlcGxhY2UoZi5yZXBsYWNlKGYucmVwbGFjZSgiIituLCJcciIsIiIpLCJcbiIsIiIpLCJcdCIsIiIpLCIgIiwiIiksYT0yKToiSU5QVVQiPT1pfHwiU1VCTUlUIj09aT8oZS52YWx1ZT9yPWUudmFsdWU6ZS5pbm5lclRleHQ/cj1lLmlubmVyVGV4dDplLnRleHRDb250ZW50JiYocj1lLnRleHRDb250ZW50KSxhPTMpOiJJTUFHRSI9PWkmJmUuc3JjJiYocj1lLnNyYyk6cj1mLk5hKGUpLHIpP3tpZDpyLnN1YnN0cmluZygwLDEwMCksdHlwZTphfTowfSxmLmpjPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1mLkIoZSksbj1mLkwoZSk7ZSYmIW4mJiJCT0RZIiE9dDspKGU9ZS5wYXJlbnRFbGVtZW50P2UucGFyZW50RWxlbWVudDplLnBhcmVudE5vZGUpJiYodD1mLkIoZSksbj1mLkwoZSkpO3JldHVybiBuJiYiQk9EWSIhPXR8fChlPTApLGUmJigwPD0odD1lLm9uY2xpY2s/IiIrZS5vbmNsaWNrOiIiKS5pbmRleE9mKCIudGwoIil8fDA8PXQuaW5kZXhPZigiLnRyYWNrTGluaygiKSkmJihlPTApLGV9LGYuWWI9ZnVuY3Rpb24oKXt2YXIgZSx0LG4saSxyPWYubGlua09iamVjdCxhPWYubGlua1R5cGUscz1mLmxpbmtVUkw7aWYoZi5tYT0xLHJ8fChmLm1hPTAscj1mLmNsaWNrT2JqZWN0KSxyKXtmb3IoZT1mLkIociksdD1mLkwocik7ciYmIXQmJiJCT0RZIiE9ZTspKHI9ci5wYXJlbnRFbGVtZW50P3IucGFyZW50RWxlbWVudDpyLnBhcmVudE5vZGUpJiYoZT1mLkIociksdD1mLkwocikpO2lmKHQmJiJCT0RZIiE9ZXx8KHI9MCksciYmIWYubGlua09iamVjdCl7dmFyIG89ci5vbmNsaWNrPyIiK3Iub25jbGljazoiIjsoMDw9by5pbmRleE9mKCIudGwoIil8fDA8PW8uaW5kZXhPZigiLnRyYWNrTGluaygiKSkmJihyPTApfX1lbHNlIGYubWE9MTtpZighcyYmciYmKHM9Zi5OYShyKSkscyYmIWYubGlua0xlYXZlUXVlcnlTdHJpbmcmJigwPD0obj1zLmluZGV4T2YoIj8iKSkmJihzPXMuc3Vic3RyaW5nKDAsbikpKSwhYSYmcyl7dmFyIGMsbD0wLHU9MDtpZihmLnRyYWNrRG93bmxvYWRMaW5rcyYmZi5saW5rRG93bmxvYWRGaWxlVHlwZXMpZm9yKG49KG89cy50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCI/IiksaT1vLmluZGV4T2YoIiMiKSwwPD1uPzA8PWkmJmk8biYmKG49aSk6bj1pLDA8PW4mJihvPW8uc3Vic3RyaW5nKDAsbikpLG49Zi5saW5rRG93bmxvYWRGaWxlVHlwZXMudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpLGk9MDtpPG4ubGVuZ3RoO2krKykoYz1uW2ldKSYmby5zdWJzdHJpbmcoby5sZW5ndGgtKGMubGVuZ3RoKzEpKT09Ii4iK2MmJihhPSJkIik7aWYoZi50cmFja0V4dGVybmFsTGlua3MmJiFhJiYobz1zLnRvTG93ZXJDYXNlKCksZi5RYShvKSYmKGYubGlua0ludGVybmFsRmlsdGVyc3x8KGYubGlua0ludGVybmFsRmlsdGVycz1wLmxvY2F0aW9uLmhvc3RuYW1lKSxuPTAsZi5saW5rRXh0ZXJuYWxGaWx0ZXJzPyhuPWYubGlua0V4dGVybmFsRmlsdGVycy50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIiksbD0xKTpmLmxpbmtJbnRlcm5hbEZpbHRlcnMmJihuPWYubGlua0ludGVybmFsRmlsdGVycy50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIikpLG4pKSl7Zm9yKGk9MDtpPG4ubGVuZ3RoO2krKyljPW5baV0sMDw9by5pbmRleE9mKGMpJiYodT0xKTt1P2wmJihhPSJlIik6bHx8KGE9ImUiKX19Zi5saW5rT2JqZWN0PXIsZi5saW5rVVJMPXMsZi5saW5rVHlwZT1hLChmLnRyYWNrQ2xpY2tNYXB8fGYudHJhY2tJbmxpbmVTdGF0cykmJihmLmU9IiIsciYmKGE9Zi5wYWdlTmFtZSxzPTEscj1yLnNvdXJjZUluZGV4LGF8fChhPWYucGFnZVVSTCxzPTApLHAuc19vYmplY3RJRCYmKHQuaWQ9cC5zX29iamVjdElELHI9dC50eXBlPTEpLGEmJnQmJnQuaWQmJmUmJihmLmU9IiZwaWQ9IitmLmVzY2FwZShhLnN1YnN0cmluZygwLDI1NSkpKyhzPyImcGlkdD0iK3M6IiIpKyImb2lkPSIrZi5lc2NhcGUodC5pZC5zdWJzdHJpbmcoMCwxMDApKSsodC50eXBlPyImb2lkdD0iK3QudHlwZToiIikrIiZvdD0iK2UrKHI/IiZvaT0iK3I6IiIpKSkpfSxmLlJiPWZ1bmN0aW9uKCl7dmFyIGU9Zi5tYSx0PWYubGlua1R5cGUsbj1mLmxpbmtVUkwsaT1mLmxpbmtOYW1lO2lmKHQmJihufHxpKSYmKCJkIiE9KHQ9dC50b0xvd2VyQ2FzZSgpKSYmImUiIT10JiYodD0ibyIpLGYucGU9Imxua18iK3QsZi5wZXYxPW4/Zi5lc2NhcGUobik6IiIsZi5wZXYyPWk/Zi5lc2NhcGUoaSk6IiIsZT0xKSxmLmFib3J0JiYoZT0wKSxmLnRyYWNrQ2xpY2tNYXB8fGYudHJhY2tJbmxpbmVTdGF0c3x8Zi5VYigpKXt0PXt9LG49MDt2YXIgcixhLHMsbz0oYz1mLnJiKCkpP2Muc3BsaXQoIiYiKTowLGM9MDtpZihvKWZvcihyPTA7cjxvLmxlbmd0aDtyKyspYT1vW3JdLnNwbGl0KCI9IiksaT1mLnVuZXNjYXBlKGFbMF0pLnNwbGl0KCIsIiksdFthPWYudW5lc2NhcGUoYVsxXSldPWk7Zm9yKHMgaW4gaT1mLmFjY291bnQuc3BsaXQoIiwiKSxyPXt9LGYuY29udGV4dERhdGEpcyYmIU9iamVjdC5wcm90b3R5cGVbc10mJiJhLmFjdGl2aXR5bWFwLiI9PXMuc3Vic3RyaW5nKDAsMTQpJiYocltzXT1mLmNvbnRleHREYXRhW3NdLGYuY29udGV4dERhdGFbc109IiIpO2lmKGYuZT1mLm8oImMiLHIpKyhmLmU/Zi5lOiIiKSxlfHxmLmUpe2ZvcihhIGluIGUmJiFmLmUmJihjPTEpLHQpaWYoIU9iamVjdC5wcm90b3R5cGVbYV0pZm9yKHM9MDtzPGkubGVuZ3RoO3MrKylmb3IoYyYmKChvPXRbYV0uam9pbigiLCIpKT09Zi5hY2NvdW50JiYoZi5lKz0oIiYiIT1hLmNoYXJBdCgwKT8iJiI6IiIpK2EsdFthXT1bXSxuPTEpKSxyPTA7cjx0W2FdLmxlbmd0aDtyKyspKG89dFthXVtyXSk9PWlbc10mJihjJiYoZi5lKz0iJnU9IitmLmVzY2FwZShvKSsoIiYiIT1hLmNoYXJBdCgwKT8iJiI6IiIpK2ErIiZ1PTAiKSx0W2FdLnNwbGljZShyLDEpLG49MSk7aWYoZXx8KG49MSksbil7Zm9yKGEgaW4gYz0iIixyPTIsIWUmJmYuZSYmKGM9Zi5lc2NhcGUoaS5qb2luKCIsIikpKyI9IitmLmVzY2FwZShmLmUpLHI9MSksdCkhT2JqZWN0LnByb3RvdHlwZVthXSYmMDxyJiYwPHRbYV0ubGVuZ3RoJiYoYys9KGM/IiYiOiIiKStmLmVzY2FwZSh0W2FdLmpvaW4oIiwiKSkrIj0iK2YuZXNjYXBlKGEpLHItLSk7Zi56YihjKX19fXJldHVybiBlfSxmLnJiPWZ1bmN0aW9uKCl7cmV0dXJuIGYudXNlTGlua1RyYWNrU2Vzc2lvblN0b3JhZ2U/Zi5FYSgpP3Auc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShmLlApOnZvaWQgMDpmLmNvb2tpZVJlYWQoZi5QKX0sZi5FYT1mdW5jdGlvbigpe3JldHVybiEhcC5zZXNzaW9uU3RvcmFnZX0sZi56Yj1mdW5jdGlvbihlKXtmLnVzZUxpbmtUcmFja1Nlc3Npb25TdG9yYWdlP2YuRWEoKSYmcC5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGYuUCxlKTpmLmNvb2tpZVdyaXRlKGYuUCxlKX0sZi5TYj1mdW5jdGlvbigpe2lmKCFmLmJjKXt2YXIgZSx0LG49bmV3IERhdGUsaT1iLmxvY2F0aW9uLHI9dD1lPSIiLGE9IiIscz0iIixvPSIxLjIiLGM9Zi5jb29raWVXcml0ZSgic19jYyIsInRydWUiLDApPyJZIjoiTiIsbD0iIix1PSIiO2lmKG4uc2V0VVRDRGF0ZSYmKG89IjEuMyIsMC4udG9QcmVjaXNpb24mJihvPSIxLjUiLChuPVtdKS5mb3JFYWNoKSkpe289IjEuNiIsdD0wLGU9e307dHJ5eyh0PW5ldyBJdGVyYXRvcihlKSkubmV4dCYmKG89IjEuNyIsbi5yZWR1Y2UmJigobz0iMS44IikudHJpbSYmKG89IjEuOC4xIixEYXRlLnBhcnNlJiYobz0iMS44LjIiLE9iamVjdC5jcmVhdGUmJihvPSIxLjguNSIpKSkpKX1jYXRjaChkKXt9fWU9c2NyZWVuLndpZHRoKyJ4IitzY3JlZW4uaGVpZ2h0LHI9bmF2aWdhdG9yLmphdmFFbmFibGVkKCk/IlkiOiJOIix0PXNjcmVlbi5waXhlbERlcHRoP3NjcmVlbi5waXhlbERlcHRoOnNjcmVlbi5jb2xvckRlcHRoLGE9Zi53LmlubmVyV2lkdGg/Zi53LmlubmVyV2lkdGg6Zi5kLmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCxzPWYudy5pbm5lckhlaWdodD9mLncuaW5uZXJIZWlnaHQ6Zi5kLmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7dHJ5e2YuYi5hZGRCZWhhdmlvcigiI2RlZmF1bHQjaG9tZVBhZ2UiKSxsPWYuYi5rYyhpKT8iWSI6Ik4ifWNhdGNoKGgpe310cnl7Zi5iLmFkZEJlaGF2aW9yKCIjZGVmYXVsdCNjbGllbnRDYXBzIiksdT1mLmIuY29ubmVjdGlvblR5cGV9Y2F0Y2gobSl7fWYucmVzb2x1dGlvbj1lLGYuY29sb3JEZXB0aD10LGYuamF2YXNjcmlwdFZlcnNpb249byxmLmphdmFFbmFibGVkPXIsZi5jb29raWVzRW5hYmxlZD1jLGYuYnJvd3NlcldpZHRoPWEsZi5icm93c2VySGVpZ2h0PXMsZi5jb25uZWN0aW9uVHlwZT11LGYuaG9tZXBhZ2U9bCxmLmJjPTF9fSxmLlE9e30sZi5sb2FkTW9kdWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49Zi5RW3RdO2lmKCFuKXtuPXBbIkFwcE1lYXN1cmVtZW50X01vZHVsZV8iK3RdP25ldyBwWyJBcHBNZWFzdXJlbWVudF9Nb2R1bGVfIit0XShmKTp7fSxmLlFbdF09Zlt0XT1uLG4ua2I9ZnVuY3Rpb24oKXtyZXR1cm4gbi51Yn0sbi5BYj1mdW5jdGlvbihlKXsobi51Yj1lKSYmKGZbdCsiX29uTG9hZCJdPWUsZi5mYSh0KyJfb25Mb2FkIixbZixuXSwxKXx8ZShmLG4pKX07dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eT9PYmplY3QuZGVmaW5lUHJvcGVydHkobiwib25Mb2FkIix7Z2V0Om4ua2Isc2V0Om4uQWJ9KTpuLl9vbGM9MX1jYXRjaChpKXtuLl9vbGM9MX19ZSYmKGZbdCsiX29uTG9hZCJdPWUsZi5mYSh0KyJfb25Mb2FkIixbZixuXSwxKXx8ZShmLG4pKX0sZi51PWZ1bmN0aW9uKGUpe3ZhciB0LG47Zm9yKHQgaW4gZi5RKWlmKCFPYmplY3QucHJvdG90eXBlW3RdJiYobj1mLlFbdF0pJiYobi5fb2xjJiZuLm9uTG9hZCYmKG4uX29sYz0wLG4ub25Mb2FkKGYsbikpLG5bZV0mJm5bZV0oKSkpcmV0dXJuIDE7cmV0dXJuIDB9LGYuVWI9ZnVuY3Rpb24oKXtyZXR1cm4hKCFmLkFjdGl2aXR5TWFwfHwhZi5BY3Rpdml0eU1hcC5fYyl9LGYuVmI9ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLmZsb29yKDFlMTMqTWF0aC5yYW5kb20oKSksdD1mLnZpc2l0b3JTYW1wbGluZyxuPWYudmlzaXRvclNhbXBsaW5nR3JvdXAsaT0obj0ic192c25fIisoZi52aXNpdG9yTmFtZXNwYWNlP2YudmlzaXRvck5hbWVzcGFjZTpmLmFjY291bnQpKyhuPyJfIituOiIiKSxmLmNvb2tpZVJlYWQobikpO2lmKHQpe2lmKHQqPTEwMCxpJiYoaT1wYXJzZUludChpKSksIWkpe2lmKCFmLmNvb2tpZVdyaXRlKG4sZSkpcmV0dXJuIDA7aT1lfWlmKHQ8aSUxZTQpcmV0dXJuIDB9cmV0dXJuIDF9LGYuUz1mdW5jdGlvbihlLHQpe3ZhciBuLGkscixhLHMsbyxjO2ZvcihjPXt9LG49MDtuPDI7bisrKWZvcihpPTA8bj9mLkdhOmYuZyxyPTA7cjxpLmxlbmd0aDtyKyspaWYoKHM9ZVthPWlbcl1dKXx8ZVsiISIrYV0pe2lmKHMmJiF0JiYoImNvbnRleHREYXRhIj09YXx8InJldHJpZXZlTGlnaHREYXRhIj09YSkmJmZbYV0pZm9yKG8gaW4gZlthXSlzW29dfHwoc1tvXT1mW2FdW29dKTtmW2FdfHwoY1siISIrYV09MSksY1thXT1mW2FdLGZbYV09c31yZXR1cm4gY30sZi5oYz1mdW5jdGlvbihlKXt2YXIgdCxuLGkscjtmb3IodD0wO3Q8Mjt0KyspZm9yKG49MDx0P2YuR2E6Zi5nLGk9MDtpPG4ubGVuZ3RoO2krKyllW3I9bltpXV09ZltyXSxlW3JdfHwicHJvcCIhPT1yLnN1YnN0cmluZygwLDQpJiYiZVZhciIhPT1yLnN1YnN0cmluZygwLDQpJiYiaGllciIhPT1yLnN1YnN0cmluZygwLDQpJiYibGlzdCIhPT1yLnN1YnN0cmluZygwLDQpJiYiY2hhbm5lbCIhPT1yJiYiZXZlbnRzIiE9PXImJiJldmVudExpc3QiIT09ciYmInByb2R1Y3RzIiE9PXImJiJwcm9kdWN0TGlzdCIhPT1yJiYicHVyY2hhc2VJRCIhPT1yJiYidHJhbnNhY3Rpb25JRCIhPT1yJiYic3RhdGUiIT09ciYmInppcCIhPT1yJiYiY2FtcGFpZ24iIT09ciYmImV2ZW50czIiIT09ciYmImxhdGl0dWRlIiE9PXImJiJsb25naXR1ZGUiIT09ciYmIm1zX2EiIT09ciYmImNvbnRleHREYXRhIiE9PXImJiJzdXBwbGVtZW50YWxEYXRhSUQiIT09ciYmInRudCIhPT1yJiYidGltZXN0YW1wIiE9PXImJiJhYm9ydCIhPT1yJiYidXNlQmVhY29uIiE9PXImJiJsaW5rT2JqZWN0IiE9PXImJiJjbGlja09iamVjdCIhPT1yJiYibGlua1R5cGUiIT09ciYmImxpbmtOYW1lIiE9PXImJiJsaW5rVVJMIiE9PXImJiJib2R5Q2xpY2tUYXJnZXQiIT09ciYmImJvZHlDbGlja0Z1bmN0aW9uIiE9PXJ8fChlWyIhIityXT0xKX0sZi5NYj1mdW5jdGlvbihlKXt2YXIgdCxuLGkscixhLHMsbz0wLGM9IiIsbD0iIjtpZihlJiYyNTU8ZS5sZW5ndGgmJigwPChuPSh0PSIiK2UpLmluZGV4T2YoIj8iKSkmJihzPXQuc3Vic3RyaW5nKG4rMSksaT0wLCJodHRwOi8vIj09KHI9KHQ9dC5zdWJzdHJpbmcoMCxuKSkudG9Mb3dlckNhc2UoKSkuc3Vic3RyaW5nKDAsNyk/aSs9NzoiaHR0cHM6Ly8iPT1yLnN1YnN0cmluZygwLDgpJiYoaSs9OCksMDwobj1yLmluZGV4T2YoIi8iLGkpKSYmKHI9ci5zdWJzdHJpbmcoaSxuKSxhPXQuc3Vic3RyaW5nKG4pLHQ9dC5zdWJzdHJpbmcoMCxuKSwwPD1yLmluZGV4T2YoImdvb2dsZSIpP289IixxLGllLHN0YXJ0LHNlYXJjaF9rZXksd29yZCxrdyxjZCwiOjA8PXIuaW5kZXhPZigieWFob28uY28iKT9vPSIscCxlaSwiOjA8PXIuaW5kZXhPZigiYmFpZHUuIikmJihvPSIsd2Qsd29yZCwiKSxvJiZzKSkpKXtpZigoZT1zLnNwbGl0KCImIikpJiYxPGUubGVuZ3RoKXtmb3IoaT0wO2k8ZS5sZW5ndGg7aSsrKTA8KG49KHI9ZVtpXSkuaW5kZXhPZigiPSIpKSYmMDw9by5pbmRleE9mKCIsIityLnN1YnN0cmluZygwLG4pKyIsIik/Yys9KGM/IiYiOiIiKStyOmwrPShsPyImIjoiIikrcjtjJiZsP3M9YysiJiIrbDpsPSIifWU9dCsoMDwobj0yNTMtKHMubGVuZ3RoLWwubGVuZ3RoKS10Lmxlbmd0aCk/YS5zdWJzdHJpbmcoMCxuKToiIikrIj8iK3N9cmV0dXJuIGV9LGYuZWI9ZnVuY3Rpb24odCl7dmFyIGU9Zi5kLnZpc2liaWxpdHlTdGF0ZSxuPVsid2Via2l0dmlzaWJpbGl0eWNoYW5nZSIsInZpc2liaWxpdHljaGFuZ2UiXTtpZihlfHwoZT1mLmQud2Via2l0VmlzaWJpbGl0eVN0YXRlKSxlJiYicHJlcmVuZGVyIj09ZSl7aWYodClmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKWYuZC5hZGRFdmVudExpc3RlbmVyKG5bZV0sZnVuY3Rpb24oKXt2YXIgZT1mLmQudmlzaWJpbGl0eVN0YXRlO2V8fChlPWYuZC53ZWJraXRWaXNpYmlsaXR5U3RhdGUpLCJ2aXNpYmxlIj09ZSYmdCgpfSk7cmV0dXJuITF9cmV0dXJuITB9LGYuY2E9ITEsZi5IPSExLGYuQ2I9ZnVuY3Rpb24oKXtmLkg9ITAsZi5wKCl9LGYuST0hMSxmLkRiPWZ1bmN0aW9uKGUpe2YubWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQ9ZS5NQ01JRCxmLnZpc2l0b3JPcHRlZE91dD1lLk1DT1BUT1VULGYuYW5hbHl0aWNzVmlzaXRvcklEPWUuTUNBSUQsZi5hdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQ9ZS5NQ0FBTUxILGYuYXVkaWVuY2VNYW5hZ2VyQmxvYj1lLk1DQUFNQixmLkk9ITEsZi5wKCl9LGYuY2I9ZnVuY3Rpb24oZSl7cmV0dXJuIGYubWF4RGVsYXl8fChmLm1heERlbGF5PTI1MCksIWYudSgiX2QiKXx8KGUmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LGYubWF4RGVsYXkpLCExKX0sZi5hYT0hMSxmLkc9ITEsZi5BYT1mdW5jdGlvbigpe2YuRz0hMCxmLnAoKX0sZi5pc1JlYWR5VG9UcmFjaz1mdW5jdGlvbigpe3ZhciBlPSEwO3JldHVybiEoIWYub2IoKXx8IWYubWIoKSkmJihmLnFiKCl8fChlPSExKSxmLnRiKCl8fChlPSExKSxlKX0sZi5vYj1mdW5jdGlvbigpe3JldHVybiBmLmNhfHxmLkh8fChmLmViKGYuQ2IpP2YuSD0hMDpmLmNhPSEwKSwhKGYuY2EmJiFmLkgpfSxmLm1iPWZ1bmN0aW9uKCl7dmFyIGU9Zi53YSgpO2lmKGUpe2lmKCFmLnRhJiYhZi5iYSlyZXR1cm4gZS5mZXRjaFBlcm1pc3Npb25zKGYudmIsITApLCEoZi5iYT0hMCk7aWYoIWYudGEpcmV0dXJuITE7aWYoIWUuaXNBcHByb3ZlZChlLkNhdGVnb3JpZXMuQU5BTFlUSUNTKSlyZXR1cm4hMX1yZXR1cm4hMH0sZi5WPWZ1bmN0aW9uKGUpe3ZhciB0PWYud2EoKTtyZXR1cm4hKHQmJiF0LmlzQXBwcm92ZWQodC5DYXRlZ29yaWVzW2VdKSl9LGYud2E9ZnVuY3Rpb24oKXtyZXR1cm4gcC5hZG9iZSYmcC5hZG9iZS5vcHRJbj9wLmFkb2JlLm9wdEluOm51bGx9LGYuWT0hMCxmLnFiPWZ1bmN0aW9uKCl7dmFyIGU9Zi5UKCk7cmV0dXJuIWV8fCFlLmdldFZpc2l0b3JWYWx1ZXN8fChmLlkmJihmLlk9ITEsZi5JfHwoZi5JPSEwLGUuZ2V0VmlzaXRvclZhbHVlcyhmLkRiKSkpLCFmLkkpfSxmLlQ9ZnVuY3Rpb24oKXt2YXIgZT1mLnZpc2l0b3I7cmV0dXJuIGUmJiFlLmlzQWxsb3dlZCgpJiYoZT1udWxsKSxlfSxmLnRiPWZ1bmN0aW9uKCl7cmV0dXJuIGYuYWF8fGYuR3x8KGYuY2IoZi5BYSk/Zi5HPSEwOmYuYWE9ITApLCEoZi5hYSYmIWYuRyl9LGYuYmE9ITEsZi52Yj1mdW5jdGlvbigpe2YuYmE9ITEsZi50YT0hMH0sZi5qPWcsZi5xPTAsZi5jYWxsYmFja1doZW5SZWFkeVRvVHJhY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpOyhpPXt9KS5IYj1lLGkuR2I9dCxpLkViPW4sZi5qPT1nJiYoZi5qPVtdKSxmLmoucHVzaChpKSwwPT1mLnEmJihmLnE9c2V0SW50ZXJ2YWwoZi5wLDEwMCkpfSxmLnA9ZnVuY3Rpb24oKXt2YXIgZTtpZihmLmlzUmVhZHlUb1RyYWNrKCkmJihmLkJiKCksZi5qIT1nKSlmb3IoOzA8Zi5qLmxlbmd0aDspKGU9Zi5qLnNoaWZ0KCkpLkdiLmFwcGx5KGUuSGIsZS5FYil9LGYuQmI9ZnVuY3Rpb24oKXtmLnEmJihjbGVhckludGVydmFsKGYucSksZi5xPTApfSxmLnVhPWZ1bmN0aW9uKGUpe3ZhciB0LG49e307aWYoZi5oYyhuKSxlIT1nKWZvcih0IGluIGUpblt0XT1lW3RdO2YuY2FsbGJhY2tXaGVuUmVhZHlUb1RyYWNrKGYsZi5GYSxbbl0pLGYuRGEoKX0sZi5PYj1mdW5jdGlvbigpe3ZhciBlLHQ9Zi5jb29raWVSZWFkKCJzX2ZpZCIpLG49IiIsaT0iIjtlPTg7dmFyIHI9NDtpZighdHx8dC5pbmRleE9mKCItIik8MCl7Zm9yKHQ9MDt0PDE2O3QrKyllPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplKSxuKz0iMDEyMzQ1Njc4OUFCQ0RFRiIuc3Vic3RyaW5nKGUsZSsxKSxlPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpyKSxpKz0iMDEyMzQ1Njc4OUFCQ0RFRiIuc3Vic3RyaW5nKGUsZSsxKSxlPXI9MTY7dD1uKyItIitpfXJldHVybiBmLmNvb2tpZVdyaXRlKCJzX2ZpZCIsdCwxKXx8KHQ9MCksdH0sZi5GYT1mdW5jdGlvbihlKXt2YXIgdCxuPW5ldyBEYXRlLGk9InMiK01hdGguZmxvb3Iobi5nZXRUaW1lKCkvMTA4ZTUpJTEwK01hdGguZmxvb3IoMWUxMypNYXRoLnJhbmRvbSgpKSxyPW4uZ2V0WWVhcigpLGE9KHI9InQ9IitmLmVzY2FwZShuLmdldERhdGUoKSsiLyIrbi5nZXRNb250aCgpKyIvIisocjwxOTAwP3IrMTkwMDpyKSsiICIrbi5nZXRIb3VycygpKyI6IituLmdldE1pbnV0ZXMoKSsiOiIrbi5nZXRTZWNvbmRzKCkrIiAiK24uZ2V0RGF5KCkrIiAiK24uZ2V0VGltZXpvbmVPZmZzZXQoKSksZi5UKCkpO2UmJih0PWYuUyhlLDEpKSxmLlZiKCkmJiFmLnZpc2l0b3JPcHRlZE91dCYmKGYueGEoKXx8KGYuZmlkPWYuT2IoKSksZi5ZYigpLGYudXNlUGx1Z2lucyYmZi5kb1BsdWdpbnMmJmYuZG9QbHVnaW5zKGYpLGYuYWNjb3VudCYmKGYuYWJvcnR8fChmLnRyYWNrT2ZmbGluZSYmIWYudGltZXN0YW1wJiYoZi50aW1lc3RhbXA9TWF0aC5mbG9vcihuLmdldFRpbWUoKS8xZTMpKSxlPXAubG9jYXRpb24sZi5wYWdlVVJMfHwoZi5wYWdlVVJMPWUuaHJlZj9lLmhyZWY6ZSksZi5yZWZlcnJlcnx8Zi4kYXx8KGU9Zi5VdGlsLmdldFF1ZXJ5UGFyYW0oImFkb2JlX21jX3JlZiIsbnVsbCxudWxsLCEwKSxmLnJlZmVycmVyPWV8fHZvaWQgMD09PWU/dm9pZCAwPT09ZT8iIjplOmIuZG9jdW1lbnQucmVmZXJyZXIpLGYuJGE9MSwhZi5yZWZlcnJlciYmZi5aJiYoZi5yZWZlcnJlcj1mLlopLGYuWj0wLGYucmVmZXJyZXI9Zi5NYihmLnJlZmVycmVyKSxmLnUoIl9nIikpLGYuUmIoKSYmIWYuYWJvcnQmJihhJiZmLlYoIlRBUkdFVCIpJiYhZi5zdXBwbGVtZW50YWxEYXRhSUQmJmEuZ2V0U3VwcGxlbWVudGFsRGF0YUlEJiYoZi5zdXBwbGVtZW50YWxEYXRhSUQ9YS5nZXRTdXBwbGVtZW50YWxEYXRhSUQoIkFwcE1lYXN1cmVtZW50OiIrZi5faW4sIWYuZXhwZWN0U3VwcGxlbWVudGFsRGF0YSkpLGYuVigiQUFNIil8fChmLmNvbnRleHREYXRhWyJjbS5zc2YiXT0xKSxmLlNiKCksZi53YigpLHIrPWYuUWIoKSxmLnNiKGksciksZi51KCJfdCIpLGYucmVmZXJyZXI9IiIpKSksZi5yZWZlcnJlciYmKGYuWj1mLnJlZmVycmVyKSxmLkRhKCksdCYmZi5TKHQsMSl9LGYudD1mLnRyYWNrPWZ1bmN0aW9uKGUsdCl7dCYmZi5TKHQpLGYuWT0hMCxmLmlzUmVhZHlUb1RyYWNrKCk/bnVsbCE9Zi5qJiYwPGYuai5sZW5ndGg/KGYudWEoZSksZi5wKCkpOmYuRmEoZSk6Zi51YShlKX0sZi53Yj1mdW5jdGlvbigpe2Yud3JpdGVTZWN1cmVDb29raWVzJiYhZi5zc2wmJmYuYWIoKX0sZi5hYj1mdW5jdGlvbigpe2YuY29udGV4dERhdGEuZXhjQ29kZXM9Zi5jb250ZXh0RGF0YS5leGNDb2Rlcz9mLmNvbnRleHREYXRhLmV4Y0NvZGVzOltdLGYuY29udGV4dERhdGEuZXhjQ29kZXMucHVzaCgxKX0sZi5EYT1mdW5jdGlvbigpe2YuYWJvcnQ9Zi5zdXBwbGVtZW50YWxEYXRhSUQ9Zi50aW1lc3RhbXA9Zi5wYWdlVVJMUmVzdD1mLmxpbmtPYmplY3Q9Zi5jbGlja09iamVjdD1mLmxpbmtVUkw9Zi5saW5rTmFtZT1mLmxpbmtUeXBlPXAuc19vYmplY3RJRD1mLnBlPWYucGV2MT1mLnBldjI9Zi5wZXYzPWYuZT1mLmxpZ2h0UHJvZmlsZUlEPWYudXNlQmVhY29uPWYucmVmZXJyZXI9MCxmLmNvbnRleHREYXRhJiZmLmNvbnRleHREYXRhLmV4Y0NvZGVzJiYoZi5jb250ZXh0RGF0YS5leGNDb2Rlcz0wKX0sZi5DYT1bXSxmLnJlZ2lzdGVyUHJlVHJhY2tDYWxsYmFjaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGFyZ3VtZW50c1tuXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGU/Zi5DYS5wdXNoKFtlLHRdKTpmLmRlYnVnVHJhY2tpbmcmJmYuQygiREVCVUc6IE5vbiBmdW5jdGlvbiB0eXBlIHBhc3NlZCB0byByZWdpc3RlclByZVRyYWNrQ2FsbGJhY2siKX0sZi5oYj1mdW5jdGlvbihlKXtmLnZhKGYuQ2EsZSl9LGYuQmE9W10sZi5yZWdpc3RlclBvc3RUcmFja0NhbGxiYWNrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYXJndW1lbnRzW25dKTsiZnVuY3Rpb24iPT10eXBlb2YgZT9mLkJhLnB1c2goW2UsdF0pOmYuZGVidWdUcmFja2luZyYmZi5DKCJERUJVRzogTm9uIGZ1bmN0aW9uIHR5cGUgcGFzc2VkIHRvIHJlZ2lzdGVyUG9zdFRyYWNrQ2FsbGJhY2siKX0sZi5nYj1mdW5jdGlvbihlKXtmLnZhKGYuQmEsZSl9LGYudmE9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0Ij09dHlwZW9mIGUpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl1bMF0scj1lW25dWzFdLnNsaWNlKCk7aWYoci51bnNoaWZ0KHQpLCJmdW5jdGlvbiI9PXR5cGVvZiBpKXRyeXtpLmFwcGx5KG51bGwscil9Y2F0Y2goYSl7Zi5kZWJ1Z1RyYWNraW5nJiZmLkMoYS5tZXNzYWdlKX19fSxmLnRsPWYudHJhY2tMaW5rPWZ1bmN0aW9uKGUsdCxuLGkscil7cmV0dXJuIGYubGlua09iamVjdD1lLGYubGlua1R5cGU9dCxmLmxpbmtOYW1lPW4sciYmKGYuYm9keUNsaWNrVGFyZ2V0PWUsZi5ib2R5Q2xpY2tGdW5jdGlvbj1yKSxmLnRyYWNrKGkpfSxmLnRyYWNrTGlnaHQ9ZnVuY3Rpb24oZSx0LG4saSl7cmV0dXJuIGYubGlnaHRQcm9maWxlSUQ9ZSxmLmxpZ2h0U3RvcmVGb3JTZWNvbmRzPXQsZi5saWdodEluY3JlbWVudEJ5PW4sZi50cmFjayhpKX0sZi5jbGVhclZhcnM9ZnVuY3Rpb24oKXt2YXIgZSx0O2ZvcihlPTA7ZTxmLmcubGVuZ3RoO2UrKykoInByb3AiPT0odD1mLmdbZV0pLnN1YnN0cmluZygwLDQpfHwiZVZhciI9PXQuc3Vic3RyaW5nKDAsNCl8fCJoaWVyIj09dC5zdWJzdHJpbmcoMCw0KXx8Imxpc3QiPT10LnN1YnN0cmluZygwLDQpfHwiY2hhbm5lbCI9PXR8fCJldmVudHMiPT10fHwiZXZlbnRMaXN0Ij09dHx8InByb2R1Y3RzIj09dHx8InByb2R1Y3RMaXN0Ij09dHx8InB1cmNoYXNlSUQiPT10fHwidHJhbnNhY3Rpb25JRCI9PXR8fCJzdGF0ZSI9PXR8fCJ6aXAiPT10fHwiY2FtcGFpZ24iPT10KSYmKGZbdF09dm9pZCAwKX0sZi50YWdDb250YWluZXJNYXJrZXI9IiIsZi5zYj1mdW5jdGlvbihlLHQpe3ZhciBuPWYuaWIoKSsiLyIrZSsiP0FRQj0xJm5kaD0xJnBmPTEmIisoZi56YSgpPyJjYWxsYmFjaz1zX2NfaWxbIitmLl9pbisiXS5kb1Bvc3RiYWNrcyZldD0xJiI6IiIpK3QrIiZBUUU9MSI7Zi5oYihuKSxmLmZiKG4pLGYuVSgpfSxmLmliPWZ1bmN0aW9uKCl7dmFyIGU9Zi5qYigpO3JldHVybiJodHRwIisoZi5zc2w/InMiOiIiKSsiOi8vIitlKyIvYi9zcy8iK2YuYWNjb3VudCsiLyIrKGYubW9iaWxlPyI1LiI6IiIpKyhmLnphKCk/IjEwIjoiMSIpKyIvSlMtIitmLnZlcnNpb24rKGYuYWM/IlQiOiIiKSsoZi50YWdDb250YWluZXJNYXJrZXI/Ii0iK2YudGFnQ29udGFpbmVyTWFya2VyOiIiKX0sZi56YT1mdW5jdGlvbigpe3JldHVybiBmLkF1ZGllbmNlTWFuYWdlbWVudCYmZi5BdWRpZW5jZU1hbmFnZW1lbnQuaXNSZWFkeSgpfHwwIT1mLnVzZVBvc3RiYWNrc30sZi5qYj1mdW5jdGlvbigpe3ZhciBlPWYuZGMsdD1mLnRyYWNraW5nU2VydmVyO3JldHVybiB0P2YudHJhY2tpbmdTZXJ2ZXJTZWN1cmUmJmYuc3NsJiYodD1mLnRyYWNraW5nU2VydmVyU2VjdXJlKTooImQxIj09KGU9ZT8oIiIrZSkudG9Mb3dlckNhc2UoKToiZDEiKT9lPSIxMTIiOiJkMiI9PWUmJihlPSIxMjIiKSx0PWYubGIoKSsiLiIrZSsiLjJvNy5uZXQiKSx0fSxmLmxiPWZ1bmN0aW9uKCl7dmFyIGU9Zi52aXNpdG9yTmFtZXNwYWNlO3JldHVybiBlfHwoZT0oZT1mLmFjY291bnQuc3BsaXQoIiwiKVswXSkucmVwbGFjZSgvW14wLTlhLXpdL2dpLCIiKSksZX0sZi5aYT0veyglPykoLio/KSglPyl9LyxmLmdjPVJlZ0V4cChmLlphLnNvdXJjZSwiZyIpLGYuTGI9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlLmRlc3RzKWZvcih2YXIgdD0wO3Q8ZS5kZXN0cy5sZW5ndGg7Kyt0KXt2YXIgbj1lLmRlc3RzW3RdO2lmKCJzdHJpbmciPT10eXBlb2Ygbi5jJiYiYWEuIj09bi5pZC5zdWJzdHIoMCwzKSlmb3IodmFyIGk9bi5jLm1hdGNoKGYuZ2MpLHI9MDtyPGkubGVuZ3RoOysrcil7dmFyIGE9aVtyXSxzPWEubWF0Y2goZi5aYSksbz0iIjsiJSI9PXNbMV0mJiJ0aW1lem9uZV9vZmZzZXQiPT1zWzJdP289KG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpOiIlIj09c1sxXSYmInRpbWVzdGFtcHoiPT1zWzJdJiYobz1mLlBiKCkpLG4uYz1uLmMucmVwbGFjZShhLGYuZXNjYXBlKG8pKX19fSxmLlBiPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IERhdGUsdD1uZXcgRGF0ZSg2ZTQqTWF0aC5hYnMoZS5nZXRUaW1lem9uZU9mZnNldCgpKSk7cmV0dXJuIGYuayg0LGUuZ2V0RnVsbFllYXIoKSkrIi0iK2YuaygyLGUuZ2V0TW9udGgoKSsxKSsiLSIrZi5rKDIsZS5nZXREYXRlKCkpKyJUIitmLmsoMixlLmdldEhvdXJzKCkpKyI6IitmLmsoMixlLmdldE1pbnV0ZXMoKSkrIjoiK2YuaygyLGUuZ2V0U2Vjb25kcygpKSsoMDxlLmdldFRpbWV6b25lT2Zmc2V0KCk/Ii0iOiIrIikrZi5rKDIsdC5nZXRVVENIb3VycygpKSsiOiIrZi5rKDIsdC5nZXRVVENNaW51dGVzKCkpfSxmLms9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oQXJyYXkoZSsxKS5qb2luKDApK3QpLnNsaWNlKC1lKX0sZi5xYT17fSxmLmRvUG9zdGJhY2tzPWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZSlpZihmLkxiKGUpLCJvYmplY3QiPT10eXBlb2YgZi5BdWRpZW5jZU1hbmFnZW1lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLkF1ZGllbmNlTWFuYWdlbWVudC5pc1JlYWR5JiZmLkF1ZGllbmNlTWFuYWdlbWVudC5pc1JlYWR5KCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLkF1ZGllbmNlTWFuYWdlbWVudC5wYXNzRGF0YSlmLkF1ZGllbmNlTWFuYWdlbWVudC5wYXNzRGF0YShlKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSYmIm9iamVjdCI9PXR5cGVvZiBlLmRlc3RzKWZvcih2YXIgdD0wO3Q8ZS5kZXN0cy5sZW5ndGg7Kyt0KXt2YXIgbj1lLmRlc3RzW3RdOyJvYmplY3QiPT10eXBlb2YgbiYmInN0cmluZyI9PXR5cGVvZiBuLmMmJiJzdHJpbmciPT10eXBlb2Ygbi5pZCYmImFhLiI9PW4uaWQuc3Vic3RyKDAsMykmJihmLnFhW24uaWRdPW5ldyBJbWFnZSxmLnFhW24uaWRdLmFsdD0iIixmLnFhW24uaWRdLnNyYz1uLmMpfX0sZi5mYj1mdW5jdGlvbihlKXtmLml8fGYuVGIoKSxmLmkucHVzaChlKSxmLmphPWYuQSgpLGYuWWEoKX0sZi5UYj1mdW5jdGlvbigpe2YuaT1mLldiKCksZi5pfHwoZi5pPVtdKX0sZi5XYj1mdW5jdGlvbigpe3ZhciBlLHQ7aWYoZi5wYSgpKXt0cnl7KHQ9cC5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShmLm5hKCkpKSYmKGU9cC5KU09OLnBhcnNlKHQpKX1jYXRjaChuKXt9cmV0dXJuIGV9fSxmLnBhPWZ1bmN0aW9uKCl7dmFyIGU9ITA7cmV0dXJuIGYudHJhY2tPZmZsaW5lJiZmLm9mZmxpbmVGaWxlbmFtZSYmcC5sb2NhbFN0b3JhZ2UmJnAuSlNPTnx8KGU9ITEpLGV9LGYuT2E9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmLmkmJihlPWYuaS5sZW5ndGgpLGYubCYmZSsrLGV9LGYuVT1mdW5jdGlvbigpe2lmKCFmLmx8fChmLnYmJmYudi5jb21wbGV0ZSYmZi52LkQmJmYudi5SKCksIWYubCkpaWYoZi5QYT1nLGYub2EpZi5qYT5mLk4mJmYuV2EoZi5pKSxmLnJhKDUwMCk7ZWxzZXt2YXIgZT1mLkZiKCk7MDxlP2YucmEoZSk6KGU9Zi5NYSgpKSYmKGYubD0xLGYuWGIoZSksZi4kYihlKSl9fSxmLnJhPWZ1bmN0aW9uKGUpe2YuUGF8fChlfHwoZT0wKSxmLlBhPXNldFRpbWVvdXQoZi5VLGUpKX0sZi5GYj1mdW5jdGlvbigpe3ZhciBlO3JldHVybiFmLnRyYWNrT2ZmbGluZXx8Zi5vZmZsaW5lVGhyb3R0bGVEZWxheTw9MD8wOihlPWYuQSgpLWYuVWEsZi5vZmZsaW5lVGhyb3R0bGVEZWxheTxlPzA6Zi5vZmZsaW5lVGhyb3R0bGVEZWxheS1lKX0sZi5NYT1mdW5jdGlvbigpe2lmKDA8Zi5pLmxlbmd0aClyZXR1cm4gZi5pLnNoaWZ0KCl9LGYuWGI9ZnVuY3Rpb24oZSl7aWYoZi5kZWJ1Z1RyYWNraW5nKXt2YXIgdCxuPSJBcHBNZWFzdXJlbWVudCBEZWJ1ZzogIitlO2ZvcihlPWUuc3BsaXQoIiYiKSx0PTA7dDxlLmxlbmd0aDt0Kyspbis9IlxuXHQiK2YudW5lc2NhcGUoZVt0XSk7Zi5DKG4pfX0sZi54YT1mdW5jdGlvbigpe3JldHVybiBmLm1hcmtldGluZ0Nsb3VkVmlzaXRvcklEfHxmLmFuYWx5dGljc1Zpc2l0b3JJRH0sZi5YPSExO3RyeXttPUpTT04ucGFyc2UoJ3sieCI6InkifScpfWNhdGNoKHYpe209bnVsbH1mb3IobSYmInkiPT1tLng/KGYuWD0hMCxmLlc9ZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04ucGFyc2UoZSl9KTpwLiQmJnAuJC5wYXJzZUpTT04/KGYuVz1mdW5jdGlvbihlKXtyZXR1cm4gcC4kLnBhcnNlSlNPTihlKX0sZi5YPSEwKTpmLlc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZi4kYj1mdW5jdGlvbihlKXt2YXIgdCxuLGk7aWYoZi5uYihlKSYmKG49MSx0PXtzZW5kOmZ1bmN0aW9uKGUpe2YudXNlQmVhY29uPSExLG5hdmlnYXRvci5zZW5kQmVhY29uKGUpP3QuUigpOnQuaGEoKX19KSwhdCYmZi54YSgpJiYyMDQ3PGUubGVuZ3RoJiYoZi5iYigpJiYobj0yLHQ9bmV3IFhNTEh0dHBSZXF1ZXN0KSx0JiYoZi5BdWRpZW5jZU1hbmFnZW1lbnQmJmYuQXVkaWVuY2VNYW5hZ2VtZW50LmlzUmVhZHkoKXx8MCE9Zi51c2VQb3N0YmFja3MpJiYoZi5YP3QuSGE9ITA6dD0wKSksIXQmJmYuZmMmJihlPWUuc3Vic3RyaW5nKDAsMjA0NykpLCF0JiZmLmQuY3JlYXRlRWxlbWVudCYmKDAhPWYudXNlUG9zdGJhY2tzfHxmLkF1ZGllbmNlTWFuYWdlbWVudCYmZi5BdWRpZW5jZU1hbmFnZW1lbnQuaXNSZWFkeSgpKSYmKHQ9Zi5kLmNyZWF0ZUVsZW1lbnQoIlNDUklQVCIpKSYmImFzeW5jImluIHQmJigoaT0oaT1mLmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkhFQUQiKSkmJmlbMF0/aVswXTpmLmQuYm9keSk/KHQudHlwZT0idGV4dC9qYXZhc2NyaXB0Iix0LnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpLG49Myk6dD0wKSx0fHwoKHQ9bmV3IEltYWdlKS5hbHQ9IiIsdC5hYm9ydHx8InVuZGVmaW5lZCI9PXR5cGVvZiBwLkluc3RhbGxUcmlnZ2VyfHwodC5hYm9ydD1mdW5jdGlvbigpe3Quc3JjPWd9KSksdC5WYT1EYXRlLm5vdygpLHQuSmE9ZnVuY3Rpb24oKXt0cnl7dC5EJiYoY2xlYXJUaW1lb3V0KHQuRCksdC5EPTApfWNhdGNoKGYpe319LHQub25sb2FkPXQuUj1mdW5jdGlvbigpe2lmKHQuVmEmJihmLmthPURhdGUubm93KCktdC5WYSksZi5nYihlKSx0LkphKCksZi5KYigpLGYuZGEoKSxmLmw9MCxmLlUoKSx0LkhhKXt0LkhhPSExO3RyeXtmLmRvUG9zdGJhY2tzKGYuVyh0LnJlc3BvbnNlVGV4dCkpfWNhdGNoKG4pe319fSx0Lm9uYWJvcnQ9dC5vbmVycm9yPXQuaGE9ZnVuY3Rpb24oKXt0LkphKCksKGYudHJhY2tPZmZsaW5lfHxmLm9hKSYmZi5sJiZmLmkudW5zaGlmdChmLkliKSxmLmw9MCxmLmphPmYuTiYmZi5XYShmLmkpLGYuZGEoKSxmLnJhKDUwMCl9LHQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09dC5yZWFkeVN0YXRlJiYoMjAwPT10LnN0YXR1cz90LlIoKTp0LmhhKCkpfSxmLlVhPWYuQSgpLDE9PT1uKXQuc2VuZChlKTtlbHNlIGlmKDI9PT1uKWk9ZS5pbmRleE9mKCI/Iiksbj1lLnN1YnN0cmluZygwLGkpLGk9KGk9ZS5zdWJzdHJpbmcoaSsxKSkucmVwbGFjZSgvJmNhbGxiYWNrPVthLXpBLVowLTlfLlxbXF1dKy8sIiIpLHQub3BlbigiUE9TVCIsbiwhMCksdC53aXRoQ3JlZGVudGlhbHM9ITAsdC5zZW5kKGkpO2Vsc2UgaWYodC5zcmM9ZSwzPT09bil7aWYoZi5TYSl0cnl7aS5yZW1vdmVDaGlsZChmLlNhKX1jYXRjaChyKXt9aS5maXJzdENoaWxkP2kuaW5zZXJ0QmVmb3JlKHQsaS5maXJzdENoaWxkKTppLmFwcGVuZENoaWxkKHQpLGYuU2E9Zi52fXQuRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5EJiYodC5jb21wbGV0ZT90LlIoKTooZi50cmFja09mZmxpbmUmJnQuYWJvcnQmJnQuYWJvcnQoKSx0LmhhKCkpKX0sNWUzKSxmLkliPWUsZi52PXBbInNfaV8iK2YucmVwbGFjZShmLmFjY291bnQsIiwiLCJfIildPXQsKGYudXNlRm9yY2VkTGlua1RyYWNraW5nJiZmLkp8fGYuYm9keUNsaWNrRnVuY3Rpb24pJiYoZi5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0fHwoZi5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0PTI1MCksZi5lYT1zZXRUaW1lb3V0KGYuZGEsZi5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0KSl9LGYubmI9ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIG5hdmlnYXRvci5zZW5kQmVhY29uJiYoZi5wYihlKT90PSEwOmYudXNlQmVhY29uJiYodD0hMCkpLGYueWIoZSkmJih0PSExKSx0fSxmLnBiPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJjA8ZS5pbmRleE9mKCJwZT1sbmtfZSIpKX0sZi55Yj1mdW5jdGlvbihlKXtyZXR1cm4gNjRlMzw9ZS5sZW5ndGh9LGYuYmI9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0JiYid2l0aENyZWRlbnRpYWxzImluIG5ldyBYTUxIdHRwUmVxdWVzdH0sZi5KYj1mdW5jdGlvbigpe2lmKGYucGEoKSYmIShmLlRhPmYuTikpdHJ5e3AubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZi5uYSgpKSxmLlRhPWYuQSgpfWNhdGNoKGUpe319LGYuV2E9ZnVuY3Rpb24oZSl7aWYoZi5wYSgpKXtmLllhKCk7dHJ5e3AubG9jYWxTdG9yYWdlLnNldEl0ZW0oZi5uYSgpLHAuSlNPTi5zdHJpbmdpZnkoZSkpLGYuTj1mLkEoKX1jYXRjaCh0KXt9fX0sZi5ZYT1mdW5jdGlvbigpe2lmKGYudHJhY2tPZmZsaW5lKWZvcigoIWYub2ZmbGluZUxpbWl0fHxmLm9mZmxpbmVMaW1pdDw9MCkmJihmLm9mZmxpbmVMaW1pdD0xMCk7Zi5pLmxlbmd0aD5mLm9mZmxpbmVMaW1pdDspZi5NYSgpfSxmLmZvcmNlT2ZmbGluZT1mdW5jdGlvbigpe2Yub2E9ITB9LGYuZm9yY2VPbmxpbmU9ZnVuY3Rpb24oKXtmLm9hPSExfSxmLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIGYub2ZmbGluZUZpbGVuYW1lKyItIitmLnZpc2l0b3JOYW1lc3BhY2UrZi5hY2NvdW50fSxmLkE9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sZi5RYT1mdW5jdGlvbihlKXtyZXR1cm4gMCE9KGU9ZS50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCIjIikmJjAhPWUuaW5kZXhPZigiYWJvdXQ6IikmJjAhPWUuaW5kZXhPZigib3BlcmE6IikmJjAhPWUuaW5kZXhPZigiamF2YXNjcmlwdDoiKX0sZi5zZXRUYWdDb250YWluZXI9ZnVuY3Rpb24oZSl7dmFyIHQsbixpO2ZvcihmLmFjPWUsdD0wO3Q8Zi5faWwubGVuZ3RoO3QrKylpZigobj1mLl9pbFt0XSkmJiJzX2wiPT1uLl9jJiZuLnRhZ0NvbnRhaW5lck5hbWU9PWUpe2lmKGYuUyhuKSxuLmxtcSlmb3IodD0wO3Q8bi5sbXEubGVuZ3RoO3QrKylpPW4ubG1xW3RdLGYubG9hZE1vZHVsZShpLm4pO2lmKG4ubWwpZm9yKGkgaW4gbi5tbClpZihmW2ldKWZvcih0IGluIGU9ZltpXSxpPW4ubWxbaV0pIU9iamVjdC5wcm90b3R5cGVbdF0mJigiZnVuY3Rpb24iIT10eXBlb2YgaVt0XXx8KCIiK2lbdF0pLmluZGV4T2YoInNfY19pbCIpPDApJiYoZVt0XT1pW3RdKTtpZihuLm1tcSlmb3IodD0wO3Q8bi5tbXEubGVuZ3RoO3QrKylpPW4ubW1xW3RdLGZbaS5tXSYmKChlPWZbaS5tXSlbaS5mXSYmImZ1bmN0aW9uIj09dHlwZW9mIGVbaS5mXSYmKGkuYT9lW2kuZl0uYXBwbHkoZSxpLmEpOmVbaS5mXS5hcHBseShlKSkpO2lmKG4udHEpZm9yKHQ9MDt0PG4udHEubGVuZ3RoO3QrKylmLnRyYWNrKG4udHFbdF0pO24ucz1mO2JyZWFrfX0sZi5VdGlsPXt1cmxFbmNvZGU6Zi5lc2NhcGUsdXJsRGVjb2RlOmYudW5lc2NhcGUsY29va2llUmVhZDpmLmNvb2tpZVJlYWQsY29va2llV3JpdGU6Zi5jb29raWVXcml0ZSxnZXRRdWVyeVBhcmFtOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByLGE9IiI7cmV0dXJuIHR8fCh0PWYucGFnZVVSTD9mLnBhZ2VVUkw6cC5sb2NhdGlvbiksbj1ufHwiJiIsZSYmdD8ocj0odD0iIit0KS5pbmRleE9mKCI/IikpPDA/YToodD1uK3Quc3Vic3RyaW5nKHIrMSkrbixpJiYoMDw9dC5pbmRleE9mKG4rZStuKXx8MDw9dC5pbmRleE9mKG4rZSsiPSIrbikpP3ZvaWQgMDooMDw9KHI9dC5pbmRleE9mKCIjIikpJiYodD10LnN1YnN0cigwLHIpK24pLChyPXQuaW5kZXhPZihuK2UrIj0iKSk8MHx8KDA8PShyPSh0PXQuc3Vic3RyaW5nKHIrbi5sZW5ndGgrZS5sZW5ndGgrMSkpLmluZGV4T2YobikpJiYodD10LnN1YnN0cmluZygwLHIpKSwwPHQubGVuZ3RoJiYoYT1mLnVuZXNjYXBlKHQpKSksYSkpOmF9LGdldEllVmVyc2lvbjpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGU/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOmYueWEoKT83Om51bGx9fSxmLkY9InN1cHBsZW1lbnRhbERhdGFJRCB0aW1lc3RhbXAgZHluYW1pY1ZhcmlhYmxlUHJlZml4IHZpc2l0b3JJRCBtYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCBhbmFseXRpY3NWaXNpdG9ySUQgYXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50IGF1dGhTdGF0ZSBmaWQgdm1rIHZpc2l0b3JNaWdyYXRpb25LZXkgdmlzaXRvck1pZ3JhdGlvblNlcnZlciB2aXNpdG9yTWlncmF0aW9uU2VydmVyU2VjdXJlIGNoYXJTZXQgdmlzaXRvck5hbWVzcGFjZSBjb29raWVEb21haW5QZXJpb2RzIGZwQ29va2llRG9tYWluUGVyaW9kcyBjb29raWVMaWZldGltZSBwYWdlTmFtZSBwYWdlVVJMIGN1c3RvbWVyUGVyc3BlY3RpdmUgcmVmZXJyZXIgY29udGV4dERhdGEgY3VycmVuY3lDb2RlIGxpZ2h0UHJvZmlsZUlEIGxpZ2h0U3RvcmVGb3JTZWNvbmRzIGxpZ2h0SW5jcmVtZW50QnkgcmV0cmlldmVMaWdodFByb2ZpbGVzIGRlbGV0ZUxpZ2h0UHJvZmlsZXMgcmV0cmlldmVMaWdodERhdGEiLnNwbGl0KCIgIiksZi5nPWYuRi5jb25jYXQoInB1cmNoYXNlSUQgdmFyaWFibGVQcm92aWRlciBjaGFubmVsIHNlcnZlciBwYWdlVHlwZSB0cmFuc2FjdGlvbklEIGNhbXBhaWduIHN0YXRlIHppcCBldmVudHMgZXZlbnRzMiBwcm9kdWN0cyBhdWRpZW5jZU1hbmFnZXJCbG9iIHRudCIuc3BsaXQoIiAiKSksZi5sYT0idGltZXN0YW1wIGNoYXJTZXQgdmlzaXRvck5hbWVzcGFjZSBjb29raWVEb21haW5QZXJpb2RzIGNvb2tpZUxpZmV0aW1lIGNvbnRleHREYXRhIGxpZ2h0UHJvZmlsZUlEIGxpZ2h0U3RvcmVGb3JTZWNvbmRzIGxpZ2h0SW5jcmVtZW50QnkiLnNwbGl0KCIgIiksZi5PPWYubGEuc2xpY2UoMCksZi5HYT0iYWNjb3VudCBhbGxBY2NvdW50cyBkZWJ1Z1RyYWNraW5nIHZpc2l0b3IgdmlzaXRvck9wdGVkT3V0IHRyYWNrT2ZmbGluZSBvZmZsaW5lTGltaXQgb2ZmbGluZVRocm90dGxlRGVsYXkgb2ZmbGluZUZpbGVuYW1lIHVzZVBsdWdpbnMgZG9QbHVnaW5zIGNvbmZpZ1VSTCB2aXNpdG9yU2FtcGxpbmcgdmlzaXRvclNhbXBsaW5nR3JvdXAgbGlua09iamVjdCBjbGlja09iamVjdCBsaW5rVVJMIGxpbmtOYW1lIGxpbmtUeXBlIHRyYWNrRG93bmxvYWRMaW5rcyB0cmFja0V4dGVybmFsTGlua3MgdHJhY2tDbGlja01hcCB0cmFja0lubGluZVN0YXRzIGxpbmtMZWF2ZVF1ZXJ5U3RyaW5nIGxpbmtUcmFja1ZhcnMgbGlua1RyYWNrRXZlbnRzIGxpbmtEb3dubG9hZEZpbGVUeXBlcyBsaW5rRXh0ZXJuYWxGaWx0ZXJzIGxpbmtJbnRlcm5hbEZpbHRlcnMgdXNlRm9yY2VkTGlua1RyYWNraW5nIGZvcmNlZExpbmtUcmFja2luZ1RpbWVvdXQgd3JpdGVTZWN1cmVDb29raWVzIHVzZUxpbmtUcmFja1Nlc3Npb25TdG9yYWdlIHRyYWNraW5nU2VydmVyIHRyYWNraW5nU2VydmVyU2VjdXJlIHNzbCBhYm9ydCBtb2JpbGUgZGMgbGlnaHRUcmFja1ZhcnMgbWF4RGVsYXkgZXhwZWN0U3VwcGxlbWVudGFsRGF0YSB1c2VCZWFjb24gdXNlUG9zdGJhY2tzIHJlZ2lzdGVyUHJlVHJhY2tDYWxsYmFjayByZWdpc3RlclBvc3RUcmFja0NhbGxiYWNrIGJvZHlDbGlja1RhcmdldCBib2R5Q2xpY2tGdW5jdGlvbiBBdWRpZW5jZU1hbmFnZW1lbnQiLnNwbGl0KCIgIiksbD0wO2w8PTI1MDtsKyspbDw3NiYmKGYuZy5wdXNoKCJwcm9wIitsKSxmLk8ucHVzaCgicHJvcCIrbCkpLGYuZy5wdXNoKCJlVmFyIitsKSxmLk8ucHVzaCgiZVZhciIrbCksbDw2JiZmLmcucHVzaCgiaGllciIrbCksbDw0JiZmLmcucHVzaCgibGlzdCIrbCk7bD0icGUgcGV2MSBwZXYyIHBldjMgbGF0aXR1ZGUgbG9uZ2l0dWRlIHJlc29sdXRpb24gY29sb3JEZXB0aCBqYXZhc2NyaXB0VmVyc2lvbiBqYXZhRW5hYmxlZCBjb29raWVzRW5hYmxlZCBicm93c2VyV2lkdGggYnJvd3NlckhlaWdodCBjb25uZWN0aW9uVHlwZSBob21lcGFnZSBwYWdlVVJMUmVzdCBtYXJrZXRpbmdDbG91ZE9yZ0lEIG1zX2EiLnNwbGl0KCIgIiksZi5nPWYuZy5jb25jYXQobCksZi5GPWYuRi5jb25jYXQobCksZi5zc2w9MDw9cC5sb2NhdGlvbi5wcm90b2NvbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzIiksZi5jaGFyU2V0PSJVVEYtOCIsZi5jb250ZXh0RGF0YT17fSxmLndyaXRlU2VjdXJlQ29va2llcz0hMSxmLm9mZmxpbmVUaHJvdHRsZURlbGF5PTAsZi5vZmZsaW5lRmlsZW5hbWU9IkFwcE1lYXN1cmVtZW50Lm9mZmxpbmUiLGYuUD0ic19zcSIsZi5VYT0wLGYuamE9MCxmLk49MCxmLlRhPTAsZi5saW5rRG93bmxvYWRGaWxlVHlwZXM9ImV4ZSx6aXAsd2F2LG1wMyxtb3YsbXBnLGF2aSx3bXYscGRmLGRvYyxkb2N4LHhscyx4bHN4LHBwdCxwcHR4IixmLnc9cCxmLmQ9cC5kb2N1bWVudCxmLmRhPWZ1bmN0aW9uKCl7Zi5lYSYmKHAuY2xlYXJUaW1lb3V0KGYuZWEpLGYuZWE9ZyksZi5ib2R5Q2xpY2tUYXJnZXQmJmYuSiYmZi5ib2R5Q2xpY2tUYXJnZXQuZGlzcGF0Y2hFdmVudChmLkopLGYuYm9keUNsaWNrRnVuY3Rpb24mJigiZnVuY3Rpb24iPT10eXBlb2YgZi5ib2R5Q2xpY2tGdW5jdGlvbj9mLmJvZHlDbGlja0Z1bmN0aW9uKCk6Zi5ib2R5Q2xpY2tUYXJnZXQmJmYuYm9keUNsaWNrVGFyZ2V0LmhyZWYmJihmLmQubG9jYXRpb249Zi5ib2R5Q2xpY2tUYXJnZXQuaHJlZikpLGYuYm9keUNsaWNrVGFyZ2V0PWYuSj1mLmJvZHlDbGlja0Z1bmN0aW9uPTB9LGYuWGE9ZnVuY3Rpb24oKXtmLmI9Zi5kLmJvZHksZi5iPyhmLnI9ZnVuY3Rpb24oZSl7dmFyIHQsbixpLHIsYTtpZighKGYuZCYmZi5kLmdldEVsZW1lbnRCeUlkKCJjcHBYWWN0bnIiKXx8ZSYmZVsic19mZV8iK2YuX2luXSkpe2lmKGYuSWEpe2lmKCFmLnVzZUZvcmNlZExpbmtUcmFja2luZylyZXR1cm4gZi5iLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixmLnIsITApLHZvaWQoZi5JYT1mLnVzZUZvcmNlZExpbmtUcmFja2luZz0wKTtmLmIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYuciwhMSl9ZWxzZSBmLnVzZUZvcmNlZExpbmtUcmFja2luZz0wO2YuY2xpY2tPYmplY3Q9ZS5zcmNFbGVtZW50P2Uuc3JjRWxlbWVudDplLnRhcmdldDt0cnl7aWYoIWYuY2xpY2tPYmplY3R8fGYuTSYmZi5NPT1mLmNsaWNrT2JqZWN0fHwhKGYuY2xpY2tPYmplY3QudGFnTmFtZXx8Zi5jbGlja09iamVjdC5wYXJlbnRFbGVtZW50fHxmLmNsaWNrT2JqZWN0LnBhcmVudE5vZGUpKWYuY2xpY2tPYmplY3Q9MDtlbHNle3ZhciBzPWYuTT1mLmNsaWNrT2JqZWN0O2lmKGYuaWEmJihjbGVhclRpbWVvdXQoZi5pYSksZi5pYT0wKSxmLmlhPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLk09PXMmJihmLk09MCl9LDFlNCksaT1mLk9hKCksZi50cmFjaygpLGk8Zi5PYSgpJiZmLnVzZUZvcmNlZExpbmtUcmFja2luZyYmZS50YXJnZXQpe2ZvcihyPWUudGFyZ2V0O3ImJnIhPWYuYiYmIkEiIT1yLnRhZ05hbWUudG9VcHBlckNhc2UoKSYmIkFSRUEiIT1yLnRhZ05hbWUudG9VcHBlckNhc2UoKTspcj1yLnBhcmVudE5vZGU7aWYociYmKGE9ci5ocmVmLGYuUWEoYSl8fChhPTApLG49ci50YXJnZXQsZS50YXJnZXQuZGlzcGF0Y2hFdmVudCYmYSYmKCFufHwiX3NlbGYiPT1ufHwiX3RvcCI9PW58fCJfcGFyZW50Ij09bnx8cC5uYW1lJiZuPT1wLm5hbWUpKSl7dHJ5e3Q9Zi5kLmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpfWNhdGNoKG8pe3Q9bmV3IHAuTW91c2VFdmVudH1pZih0KXt0cnl7dC5pbml0TW91c2VFdmVudCgiY2xpY2siLGUuYnViYmxlcyxlLmNhbmNlbGFibGUsZS52aWV3LGUuZGV0YWlsLGUuc2NyZWVuWCxlLnNjcmVlblksZS5jbGllbnRYLGUuY2xpZW50WSxlLmN0cmxLZXksZS5hbHRLZXksZS5zaGlmdEtleSxlLm1ldGFLZXksZS5idXR0b24sZS5yZWxhdGVkVGFyZ2V0KX1jYXRjaChsKXt0PTB9dCYmKHRbInNfZmVfIitmLl9pbl09dC5zX2ZlPTEsZS5zdG9wUHJvcGFnYXRpb24oKSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksZi5ib2R5Q2xpY2tUYXJnZXQ9ZS50YXJnZXQsZi5KPXQpfX19fX1jYXRjaChjKXtmLmNsaWNrT2JqZWN0PTB9fX0sZi5iJiZmLmIuYXR0YWNoRXZlbnQ/Zi5iLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmLnIpOmYuYiYmZi5iLmFkZEV2ZW50TGlzdGVuZXImJihuYXZpZ2F0b3ImJigwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIldlYktpdCIpJiZmLmQuY3JlYXRlRXZlbnR8fDA8PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveC8yIikmJnAuTW91c2VFdmVudCkmJihmLklhPTEsZi51c2VGb3JjZWRMaW5rVHJhY2tpbmc9MSxmLmIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYuciwhMCkpLGYuYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZi5yLCExKSkpOnNldFRpbWVvdXQoZi5YYSwzMCl9LGYuZmM9Zi55YSgpLGYuS2IoKSxmLm1jfHwoZD9mLnNldEFjY291bnQoZCk6Zi5DKCJFcnJvciwgbWlzc2luZyBSZXBvcnQgU3VpdGUgSUQgaW4gQXBwTWVhc3VyZW1lbnQgaW5pdGlhbGl6YXRpb24iKSxmLlhhKCksZi5sb2FkTW9kdWxlKCJBY3Rpdml0eU1hcCIpKX1mdW5jdGlvbiAkX19fdmFyXzE0MTFiY2U5ZTJiYzZiODUoZSl7dmFyIHQsbixpLHIsYSxzPXdpbmRvdy5zX2NfaWwsbz1lLnNwbGl0KCIsIiksYz0wO2lmKHMpZm9yKG49MDshYyYmbjxzLmxlbmd0aDspe2lmKCJzX2MiPT0odD1zW25dKS5fYyYmKHQuYWNjb3VudHx8dC5vdW4pKWlmKHQuYWNjb3VudCYmdC5hY2NvdW50PT1lKWM9MTtlbHNlIGZvcihpPXQuYWNjb3VudD90LmFjY291bnQ6dC5vdW4saT10LmFsbEFjY291bnRzP3QuYWxsQWNjb3VudHM6aS5zcGxpdCgiLCIpLHI9MDtyPG8ubGVuZ3RoO3IrKylmb3IoYT0wO2E8aS5sZW5ndGg7YSsrKW9bcl09PWlbYV0mJihjPTEpO24rK31yZXR1cm4gYz90LnNldEFjY291bnQmJnQuc2V0QWNjb3VudChlKTp0PW5ldyBBcHBNZWFzdXJlbWVudChlKSx0fWZ1bmN0aW9uICRfX192YXJfMzg1MTg5ZGM3ZTU1OGViMCgpe3ZhciBlLHQsbixpPXdpbmRvdyxyPWkuc19naXE7aWYocilmb3IoZT0wO2U8ci5sZW5ndGg7ZSsrKShuPXNfZ2koKHQ9cltlXSkub3VuKSkuc2V0QWNjb3VudCh0LnVuKSxuLnNldFRhZ0NvbnRhaW5lcih0LnRhZ0NvbnRhaW5lck5hbWUpO2kuc19naXE9MH1mdW5jdGlvbiAkX19fdmFyXzhiZjFhYjdlZDI5N2IyYzgoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHBnTHZsKXtmZHhfZ2V0TGlua1ZpZXcoKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBzLnBhZ2VOYW1lfHwiIj09cy5wYWdlTmFtZSkmJihfc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpwYWdlIG5hbWUiKSwxKSYmX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cGFnZSBuYW1lIikmJihzLnBhZ2VOYW1lPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnBhZ2UgbmFtZSIpKSxzLnBhZ2VOYW1lPXMucGFnZU5hbWUudG9Mb3dlckNhc2UoKSwidW5kZWZpbmVkIiE9dHlwZW9mIHMuZVZhcjQzJiYiIiE9cy5lVmFyNDN8fChzLmVWYXI0Mz0iUDoiK3MucGFnZU5hbWUpLHMucHJvcDQzPSJEPXY0MyI7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYnJpZ2h0Y292ZS1jb250YWluZXIiKTtzLmVWYXIzMT1lLmxlbmd0aDtmb3IodmFyIHQ9IiIsbj0wO248ZS5sZW5ndGg7bisrKXMuZVZhcjMxKz0ifCIrZVtuXS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8taWQiKSx0PSJldmVudDIwMiI7cy5saW5rVHJhY2tFdmVudHM9cy5ldmVudHM9cy5hcGwocy5ldmVudHMsdCwiLCIsMik7dmFyIGk9ZmR4X2dldENvb2tpZSgieGFjYyIpLnRvTG93ZXJDYXNlKCkscj1mZHhfZ2V0Q29va2llKCJmZHhfbG9jYWxlIikudG9Mb3dlckNhc2UoKS5zcGxpdCgiXyIpLGE9ZmR4X2dldENvb2tpZSgiZmR4X2dlb19zZWxlY3QiKTtmZHhfZ2V0Q29va2llKCJmZHhfZ2VvX2hpZGUiKSE9PXJbMV0mJmkhPT1yWzFdJiZhIT09clsxXSYmKHMubGlua1RyYWNrRXZlbnRzPXMuZXZlbnRzPSJldmVudDkwNCIpO3RyeXt2YXIgbz1mZHhfZ2V0Q29va2llKCJmZHhfZGVidWciKTtpZih2b2lkIDAhPT1vKXtmb3Iobj0wO248by5zcGxpdCgiLCIpLmxlbmd0aDtuKyspe3ZhciBjPSJEQkdfIitvLnNwbGl0KCIsIilbbl07Yz0oYz1jLnNwbGl0KCJ8Iikuc2xpY2UoMSkuam9pbigifCIpKS5zdWJzdHJpbmcoMCxNYXRoLm1pbigyNTUsYy5sZW5ndGgpKX1zLmV2ZW50cz1zLmFwbChzLmV2ZW50cywiZXZlbnQxMDAiLCIsIiwyKSxmZHhfc2V0Q29va2llKCJmZHhfZGVidWciLCIiLC0xLCIvIiwiLmZlZGV4LmNvbSIpfX1jYXRjaChmKXtmZHhfZGVidWcoZiwiU0MiLCJmZHhfcnVuU0NvZGU6bG9nIGRlYnVnIGVycm9ycyIpfXMuZVZhcjYwPXMuVXRpbC5nZXRRdWVyeVBhcmFtKCJldF9yaWQiKSxzLmVWYXI2MD1zLmdldFZhbE9uY2Uocy5lVmFyNjAsInNfZXRyaWQiLDApO3ZhciBsPXMuY19yKCJzX2V0cmlkIik7d2luZG93LnNjX3NfZXRyaWQ9IiIsbnVsbCE9bCYmIiIhPT1sPyhzLmdldEFuZFBlcnNpc3RWYWx1ZShsLCJzY19zX2V0cmlkIiw5MCksd2luZG93LnNjX3NfZXRyaWQ9bCk6d2luZG93LnNjX3NfZXRyaWQ9cy5jX3IoInNjX3NfZXRyaWQiKSxzLmVWYXI4MD1zLlV0aWwuZ2V0UXVlcnlQYXJhbSgiZXRfY2lkIikscy5lVmFyODA9cy5nZXRWYWxPbmNlKHMuZVZhcjgwLCJzX2V0Y2lkIiwwKTt2YXIgdT1zLmNfcigic19hY3hyaWQiKTt3aW5kb3cuc2Nfc19hY3hyaWQ9IiIsbnVsbCE9dSYmIiIhPT11PyhzLmdldEFuZFBlcnNpc3RWYWx1ZSh1LCJzY19zX2FjeHJpZCIsOTApLHdpbmRvdy5zY19zX2FjeHJpZD11KTp3aW5kb3cuc2Nfc19hY3hyaWQ9cy5jX3IoInNjX3NfYWN4cmlkIik7dmFyIGQ9ZmR4X2dldENvb2tpZSgiZmNsX3V1aWQiKTt3aW5kb3cuc2NfZmNsX3V1aWQ9IiI7dmFyIHA9bmV3IE9iamVjdDtpZih2b2lkIDA9PT1kfHxudWxsPT1kKXtpZih3aW5kb3cuc2NfZmNsX3V1aWQ9cy5jX3IoInNjX2ZjbF91dWlkIiksIiIhPT13aW5kb3cuc2NfZmNsX3V1aWQpd2luZG93LnNjX2ZjbF91dWlkLmluZGV4T2YoIkAiKTwwJiYocy5lVmFyNj13aW5kb3cuc2NfZmNsX3V1aWQscy5wcm9wNj0iRD12NiIscC5mZWRleGN1c3RpZD17aWQ6cy5lVmFyNixhdXRoU3RhdGU6VmlzaXRvci5BdXRoU3RhdGUuTE9HR0VEX09VVH0scC5GM2VEeD17aWQ6cy5lVmFyNixhdXRoU3RhdGU6VmlzaXRvci5BdXRoU3RhdGUuTE9HR0VEX09VVH0pO3dpbmRvdy5zY19zX2V0cmlkJiYocC5ldF9yaWQ9e2lkOndpbmRvdy5zY19zX2V0cmlkLGF1dGhTdGF0ZTpWaXNpdG9yLkF1dGhTdGF0ZS5MT0dHRURfT1VUfSl9ZWxzZSBkLmluZGV4T2YoIkAiKTwwJiYocy5lVmFyNj1kLHMucHJvcDY9IkQ9djYiLHMuZ2V0QW5kUGVyc2lzdFZhbHVlKGQsInNjX2ZjbF91dWlkIiw5MCksd2luZG93LnNjX2ZjbF91dWlkPWQscC5mZWRleGN1c3RpZD17aWQ6cy5lVmFyNixhdXRoU3RhdGU6VmlzaXRvci5BdXRoU3RhdGUuQVVUSEVOVElDQVRFRH0scC5GM2VEeD17aWQ6cy5lVmFyNixhdXRoU3RhdGU6VmlzaXRvci5BdXRoU3RhdGUuQVVUSEVOVElDQVRFRH0pLHdpbmRvdy5zY19zX2V0cmlkJiYocC5ldF9yaWQ9e2lkOndpbmRvdy5zY19zX2V0cmlkLGF1dGhTdGF0ZTpWaXNpdG9yLkF1dGhTdGF0ZS5BVVRIRU5USUNBVEVEfSk7dHJ5eyJ1bmRlZmluZWQiIT10eXBlb2Ygcy52aXNpdG9yfHwocy52aXNpdG9yPVZpc2l0b3IuZ2V0SW5zdGFuY2UoX3NhdGVsbGl0ZS5nZXRWYXIoIm1jb3JnSUQiKSkpLHMudmlzaXRvci5zZXRDdXN0b21lcklEcyhwKSxzLnZpc2l0b3IuX3NldEZpZWxkRXhwaXJlKCJNQ0FBTUIiLC0xKSxzLnZpc2l0b3IuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYigpfWNhdGNoKGYpe2ZkeF9kZWJ1ZyhmLCJTQyIsImZkeF9ydW5TQ29kZTpJRCBzeW5jIGZvciBBQU0gIil9fX1mdW5jdGlvbiAkX19fdmFyXzliMmE0YzJmNzZlNzNhMTYoKXt0cnl7ZmR4X2luaXRTQ1ZhcnMoKSxmZHhfaW5pdFBsdWdpbnMoKSxmZHhfcnVuU0NvZGUoKX1jYXRjaChlKXtmZHhfZGVidWcoZSwiU0MiLCJmZHhfaW5pdFNDb2RlIil9fXZhciAkX19fdmFyXzY2YmU3ZDQzYjI4ZjAxNjI9ZmR4X2NyZWF0ZUN1c3RvbUV2ZW50fHxmdW5jdGlvbihlKXt0cnl7dmFyIHQ7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUV2ZW50Pyh0PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5pbml0RXZlbnQoZSwhMSwhMSk6dD1lLHR9Y2F0Y2gobil7ZmR4X2RlYnVnKG4sIkNJTSIsImZkeF9jcmVhdGVDdXN0b21FdmVudCIpfX0sJF9fX3Zhcl9jZWY5YjdhNDhiNDEyM2RhPWZkeF9kaXNwYXRjaEN1c3RvbUV2ZW50fHxmdW5jdGlvbihlKXt0cnl7ZG9jdW1lbnQuY3JlYXRlRXZlbnQ/ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChlKToidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtlXT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV0rKzpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV09MH1jYXRjaCh0KXtmZHhfZGVidWcodCwiQ0lNIiwiZmR4X2Rpc3BhdGNoQ3VzdG9tRXZlbnQiKX19LCRfX192YXJfMGU5YzM5YzJhNWJiMWJlMz1mZHhfZmlyZUN1c3RvbUV2ZW50fHxmdW5jdGlvbihlKXt0cnl7dmFyIHQ9ZmR4X2NyZWF0ZUN1c3RvbUV2ZW50KGUpO2ZkeF9kaXNwYXRjaEN1c3RvbUV2ZW50KHQpfWNhdGNoKG4pe2ZkeF9kZWJ1ZyhuLCJDSU0iLCJmZHhfZmlyZUN1c3RvbUV2ZW50Iil9fSwkX19fdmFyX2RiZmEzMzRiM2ZhNzIzMjc9eyJtYWdzLWFkZHJlc3MiOlsiZVZhcjE1MSIsImV2ZW50MjExIl0sIm1hZ3MtcGFja2FnZSI6WyJlVmFyMTUyIiwiZXZlbnQyMTIiXSwibWFncy1jdXN0b20iOlsiZVZhcjE1NSIsImV2ZW50MjE0Il0sIm1hZ3MtcmF0ZXNkaXNwbGF5IjpbImVWYXIxNTMiLCJldmVudDIxNiJdLCJtYWdzLXBheW1lbnQiOlsiZVZhcjE1NCIsImV2ZW50MjE4Il19O2ZkeF9jcmVhdGVDdXN0b21FdmVudD0kX19fdmFyXzY2YmU3ZDQzYjI4ZjAxNjI7ZmR4X2Rpc3BhdGNoQ3VzdG9tRXZlbnQ9JF9fX3Zhcl9jZWY5YjdhNDhiNDEyM2RhO2ZkeF9maXJlQ3VzdG9tRXZlbnQ9JF9fX3Zhcl8wZTljMzljMmE1YmIxYmUzO01BR1NFdmFyTWFwcGluZz0kX19fdmFyX2RiZmEzMzRiM2ZhNzIzMjc7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBhLHMsbzsiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LkRJTCYmKHdpbmRvdy5ESUw9ZnVuY3Rpb24obixlKXtjb25zdCAkX19fb2xkX2UzMzVlMGM4N2ZhNzVjYzk9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiKSwkX19fb2xkXzEzN2JhZThlNDcxMmVmZTI9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiKTt0cnl7aWYoJF9fX29sZF9lMzM1ZTBjODdmYTc1Y2M5KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCk7aWYoJF9fX29sZF8xMzdiYWU4ZTQ3MTJlZmUyKSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCk7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gdm9pZCAwPT09ZXx8ITA9PT1lfWZ1bmN0aW9uIGkoKXtXfHwoVz0hMCxQLnJlZ2lzdGVyUmVxdWVzdCgpLFkoKSl9dmFyIHUscixtLGEsbCxnLHMsbyxjLGQscCxmLGIsdixoLF8sayx5LHcseCxELEk9W10sQz17fTtuIT09T2JqZWN0KG4pJiYobj17fSksbT1uLnBhcnRuZXIsYT1uLmNvbnRhaW5lck5TSUQsbD1uLm1hcHBpbmdzLGc9bi51dWlkQ29va2llLHM9ITA9PT1uLmVuYWJsZUVycm9yUmVwb3J0aW5nLG89bi52aXNpdG9yU2VydmljZSxjPW4uZGVjbGFyZWRJZCxkPSEwPT09bi5kZWxheUFsbFVudGlsV2luZG93TG9hZCxwPXQobi5zZWN1cmVEYXRhQ29sbGVjdGlvbiksZj0iYm9vbGVhbiI9PXR5cGVvZiBuLmlzQ29vcFNhZmU/bi5pc0Nvb3BTYWZlOm51bGwsYj10KG4uZW5hYmxlSHJlZmVyZXJQYXJhbSksdj10KG4uZW5hYmxlTG9nZ2luZyksaD10KG4uZW5hYmxlVXJsRGVzdGluYXRpb25zKSxfPXQobi5lbmFibGVDb29raWVEZXN0aW5hdGlvbnMpLGs9ITA9PT1uLmRpc2FibGVEZWZhdWx0UmVxdWVzdCx5PW4uYWZ0ZXJSZXN1bHRGb3JEZWZhdWx0UmVxdWVzdCx3PW4udmlzaXRvckNvbnN0cnVjdG9yLHg9ITA9PT1uLmRpc2FibGVDT1JTLEQ9ITA9PT1uLmlnbm9yZUhhcmREZXBlbmRlbmN5T25WaXNpdG9yQVBJLHMmJkRJTC5lcnJvck1vZHVsZS5hY3RpdmF0ZSgpLEQmJkkucHVzaCgiV2FybmluZzogdGhpcyBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIGlnbm9yZSB0aGUgaGFyZCBkZXBlbmRlbmN5IG9uIHRoZSBWaXNpdG9yQVBJIHNlcnZpY2UuIFRoaXMgbWVhbnMgdGhhdCBubyBVUkwgZGVzdGluYXRpb25zIHdpbGwgYmUgZmlyZWQgaWYgdGhlIGluc3RhbmNlIGhhcyBubyBjb25uZWN0aW9uIHRvIFZpc2l0b3JBUEkuIElmIHRoZSBWaXNpdG9yQVBJIHNlcnZpY2UgaXMgbm90IGluc3RhbnRpYXRlZCwgSUQgc3luY3Mgd2lsbCBub3QgYmUgZmlyZWQgZWl0aGVyLiIpO3ZhciBPPSEwPT09d2luZG93Ll9kaWxfdW5pdF90ZXN0cztpZigodT1lKSYmSS5wdXNoKHUrIiIpLCFtfHwic3RyaW5nIiE9dHlwZW9mIG0pe3ZhciBTPXtuYW1lOiJlcnJvciIsbWVzc2FnZTp1PSJESUwgcGFydG5lciBpcyBpbnZhbGlkIG9yIG5vdCBzcGVjaWZpZWQgaW4gaW5pdENvbmZpZyIsZmlsZW5hbWU6ImRpbC5qcyJ9O3JldHVybiBESUwuZXJyb3JNb2R1bGUuaGFuZGxlRXJyb3IoUyksbmV3IEVycm9yKHUpfWlmKHU9IkRJTCBjb250YWluZXJOU0lEIGlzIGludmFsaWQgb3Igbm90IHNwZWNpZmllZCBpbiBpbml0Q29uZmlnLCBzZXR0aW5nIHRvIGRlZmF1bHQgb2YgMCIsIWEmJiJudW1iZXIiIT10eXBlb2YgYXx8KGE9cGFyc2VJbnQoYSwxMCksIWlzTmFOKGEpJiYwPD1hJiYodT0iIikpLHUmJihhPTAsSS5wdXNoKHUpLHU9IiIpLChyPURJTC5nZXREaWwobSxhKSlpbnN0YW5jZW9mIERJTCYmci5hcGkuZ2V0UGFydG5lcigpPT09bSYmci5hcGkuZ2V0Q29udGFpbmVyTlNJRCgpPT09YSlyZXR1cm4gcjtpZighKHRoaXMgaW5zdGFuY2VvZiBESUwpKXJldHVybiBuZXcgRElMKG4sIkRJTCB3YXMgbm90IGluc3RhbnRpYXRlZCB3aXRoIHRoZSAnbmV3JyBvcGVyYXRvciwgcmV0dXJuaW5nIGEgdmFsaWQgaW5zdGFuY2Ugd2l0aCBwYXJ0bmVyID0gIittKyIgYW5kIGNvbnRhaW5lck5TSUQgPSAiK2EpO0RJTC5yZWdpc3RlckRpbCh0aGlzLG0sYSk7dmFyIFQ9e2RvZXNDb25zb2xlTG9nRXhpc3Q6d2luZG93LmNvbnNvbGU9PT1PYmplY3Qod2luZG93LmNvbnNvbGUpJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LmNvbnNvbGUubG9nLGxvZ01lbW86e30sbG9nOmZ1bmN0aW9uKGUpe0kucHVzaChlKSx2JiZ0aGlzLmRvZXNDb25zb2xlTG9nRXhpc3QmJkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwod2luZG93LmNvbnNvbGUubG9nLHdpbmRvdy5jb25zb2xlKS5hcHBseSh3aW5kb3cuY29uc29sZSxhcmd1bWVudHMpfSxsb2dPbmNlOmZ1bmN0aW9uKGUpe3RoaXMubG9nTWVtb1tlXXx8KHRoaXMubG9nTWVtb1tlXT0hMCxULmxvZyhlKSl9fSxWPXtJU19IVFRQUzpwfHwiaHR0cHM6Ij09PWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sLFNJWF9NT05USFNfSU5fTUlOVVRFUzoyNTkyMDAsSUVfVkVSU0lPTjpmdW5jdGlvbigpe2lmKGRvY3VtZW50LmRvY3VtZW50TW9kZSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO2Zvcih2YXIgZT03OzQ8ZTtlLS0pe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKHQuaW5uZXJIVE1MPSJceDNjIS0tW2lmIElFICIrZSsiXT48c3Bhbj48L3NwYW4+PCFbZW5kaWZdLS1ceDNlIix0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIikubGVuZ3RoKXJldHVybiB0PW51bGwsZX1yZXR1cm4gbnVsbH0oKX07Vi5JU19JRV9MRVNTX1RIQU5fMTA9Im51bWJlciI9PXR5cGVvZiBWLklFX1ZFUlNJT04mJlYuSUVfVkVSU0lPTjwxMDt2YXIgTD17c3R1ZmZlZDp7fX0sQT17fSxQPXtmaXJpbmdRdWV1ZTpbXSxmaXJlZDpbXSxmaXJpbmc6ITEsc2VudDpbXSxlcnJvcmVkOltdLHJlc2VydmVkS2V5czp7c2lkczohMCxwZGF0YTohMCxsb2dkYXRhOiEwLGNhbGxiYWNrOiEwLHBvc3RDYWxsYmFja0ZuOiEwLHVzZUltYWdlUmVxdWVzdDohMH0sZmlyc3RSZXF1ZXN0SGFzRmlyZWQ6ITEsYWJvcnRSZXF1ZXN0czohMSxudW1fb2ZfY29yc19yZXNwb25zZXM6MCxudW1fb2ZfY29yc19lcnJvcnM6MCxjb3JzRXJyb3JTb3VyY2VzOltdLG51bV9vZl9pbWdfcmVzcG9uc2VzOjAsbnVtX29mX2ltZ19lcnJvcnM6MCxwbGF0Zm9ybVBhcmFtczp7ZF9uc2lkOmErIiIsZF9ydGJkOiJqc29uIixkX2pzb252OkRJTC5qc29uVmVyc2lvbisiIixkX2RzdDoiMSJ9LG5vbk1vZFN0YXRzUGFyYW1zOntkX3J0YmQ6ITAsZF9kc3Q6ITAsZF9jdHM6ITAsZF9yczohMH0sbW9kU3RhdHNQYXJhbXM6bnVsbCxhZG1zOntUSU1FX1RPX0NBVENIX0FMTF9SRVFVRVNUU19SRUxFQVNFOjNlNCxjYWxsZWRCYWNrOiExLG1pZDpudWxsLG5vVmlzaXRvckFQSTpudWxsLFZpc2l0b3JBUEk6bnVsbCxpbnN0YW5jZTpudWxsLHJlbGVhc2VUeXBlOiJubyBWaXNpdG9yQVBJIixpc09wdGVkT3V0OiEwLGlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZDohMSxhZG1zUHJvY2Vzc2luZ1N0YXJ0ZWQ6ITEscHJvY2VzczpmdW5jdGlvbihlKXt0cnl7aWYodGhpcy5hZG1zUHJvY2Vzc2luZ1N0YXJ0ZWQpcmV0dXJuO3RoaXMuYWRtc1Byb2Nlc3NpbmdTdGFydGVkPSEwO3ZhciB0LG4saSxyPW87aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmdldEluc3RhbmNlKXRocm93IHRoaXMubm9WaXNpdG9yQVBJPSEwLG5ldyBFcnJvcigiVmlzaXRvciBkb2VzIG5vdCBleGlzdC4iKTtpZihyIT09T2JqZWN0KHIpfHwhKHQ9ci5uYW1lc3BhY2UpfHwic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgdGhpcy5yZWxlYXNlVHlwZT0ibm8gbmFtZXNwYWNlIixuZXcgRXJyb3IoIkRJTC5jcmVhdGUoKSBuZWVkcyB0aGUgaW5pdENvbmZpZyBwcm9wZXJ0eSBgdmlzaXRvclNlcnZpY2VgOntuYW1lc3BhY2U6JzxFeHBlcmllbmNlIENsb3VkIE9yZyBJRD4nfSIpO2lmKChuPWUuZ2V0SW5zdGFuY2UodCx7aWRTeW5jQ29udGFpbmVySUQ6YX0pKSE9PU9iamVjdChuKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIG4uaXNBbGxvd2VkfHwiZnVuY3Rpb24iIT10eXBlb2Ygbi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRHx8ImZ1bmN0aW9uIiE9dHlwZW9mIG4uZ2V0Q3VzdG9tZXJJRHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBuLmlzT3B0ZWRPdXR8fCJmdW5jdGlvbiIhPXR5cGVvZiBuLnB1Ymxpc2hEZXN0aW5hdGlvbnMpdGhyb3cgdGhpcy5yZWxlYXNlVHlwZT0iaW52YWxpZCBpbnN0YW5jZSIsaT0iSW52YWxpZCBWaXNpdG9yIGluc3RhbmNlLiIsbj09PU9iamVjdChuKSYmImZ1bmN0aW9uIiE9dHlwZW9mIG4ucHVibGlzaERlc3RpbmF0aW9ucyYmKGkrPSIgSW4gcGFydGljdWxhciwgdmlzaXRvckluc3RhbmNlLnB1Ymxpc2hEZXN0aW5hdGlvbnMgaXMgbm90IGEgZnVuY3Rpb24uIFRoaXMgaXMgbmVlZGVkIHRvIGZpcmUgVVJMIGRlc3RpbmF0aW9ucyBpbiBESUwgdjguMCsgYW5kIHNob3VsZCBiZSBwcmVzZW50IGluIFZpc2l0b3IgdjMuMy4wKyAuIiksbmV3IEVycm9yKGkpO2lmKHRoaXMuVmlzaXRvckFQST1lLCFuLmlzQWxsb3dlZCgpKXJldHVybiB0aGlzLnJlbGVhc2VUeXBlPSJWaXNpdG9yQVBJIGlzIG5vdCBhbGxvd2VkIHRvIHdyaXRlIGNvb2tpZXMiLHZvaWQgdGhpcy5yZWxlYXNlUmVxdWVzdHMoKTt0aGlzLmluc3RhbmNlPW4sdGhpcy53YWl0Rm9yTWlkVG9SZWxlYXNlUmVxdWVzdHMoKX1jYXRjaChlKXtpZighRCl0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGluIHByb2Nlc3NpbmcgVmlzaXRvciBBUEksIHdoaWNoIGlzIGEgaGFyZCBkZXBlbmRlbmN5IGZvciBESUwgdjguMCs6ICIrZS5tZXNzYWdlKTt0aGlzLnJlbGVhc2VSZXF1ZXN0cygpfX0sd2FpdEZvck1pZFRvUmVsZWFzZVJlcXVlc3RzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmluc3RhbmNlJiYodGhpcy5pbnN0YW5jZS5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbihlKXt0Lm1pZD1lLHQucmVsZWFzZVR5cGU9IlZpc2l0b3JBUEkiLHQucmVsZWFzZVJlcXVlc3RzKCl9LCEwKSwoIVUuZXhpc3RzfHwhVS5pc0lhYkNvbnRleHQmJlUuaXNBcHByb3ZlZCgpfHxVLmlzSWFiQ29udGV4dCYmei5oYXNHb1NpZ25hbCgpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyJWaXNpdG9yQVBJIiE9PXQucmVsZWFzZVR5cGUmJih0LnJlbGVhc2VUeXBlPSJ0aW1lb3V0Iix0LnJlbGVhc2VSZXF1ZXN0cygpKX0sdGhpcy5nZXRMb2FkVGltZW91dCgpKSl9LHJlbGVhc2VSZXF1ZXN0czpmdW5jdGlvbigpe3RoaXMuY2FsbGVkQmFjaz0hMCxQLnJlZ2lzdGVyUmVxdWVzdCgpfSxnZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc3RhbmNlP3RoaXMuaW5zdGFuY2UuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKTpudWxsfSxnZXRNSURRdWVyeVN0cmluZzpmdW5jdGlvbigpe3ZhciBlPU4uaXNQb3B1bGF0ZWRTdHJpbmcsdD10aGlzLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCk7cmV0dXJuIGUodGhpcy5taWQpJiZ0aGlzLm1pZD09PXR8fCh0aGlzLm1pZD10KSxlKHRoaXMubWlkKT8iZF9taWQ9Iit0aGlzLm1pZCsiJiI6IiJ9LGdldEN1c3RvbWVySURzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2U/dGhpcy5pbnN0YW5jZS5nZXRDdXN0b21lcklEcygpOm51bGx9LGdldEN1c3RvbWVySURzUXVlcnlTdHJpbmc6ZnVuY3Rpb24oZSl7aWYoZSE9PU9iamVjdChlKSlyZXR1cm4iIjt2YXIgdCxuLGkscixhPSIiLHM9W10sbz1bXTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihuPWVbb1swXT10XSk9PT1PYmplY3QobikmJihvWzFdPW4uaWR8fCIiLG9bMl09bi5hdXRoU3RhdGV8fDAscy5wdXNoKG8pLG89W10pO2lmKHI9cy5sZW5ndGgpZm9yKGk9MDtpPHI7aSsrKWErPSImZF9jaWRfaWM9IitGLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChzW2ldLCIlMDEiKTtyZXR1cm4gYX0sZ2V0SXNPcHRlZE91dDpmdW5jdGlvbigpe3RoaXMuaW5zdGFuY2U/dGhpcy5pbnN0YW5jZS5pc09wdGVkT3V0KFt0aGlzLHRoaXMuaXNPcHRlZE91dENhbGxiYWNrXSx0aGlzLlZpc2l0b3JBUEkuT3B0T3V0LkdMT0JBTCwhMCk6KHRoaXMuaXNPcHRlZE91dD0hMSx0aGlzLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZD0hMCl9LGlzT3B0ZWRPdXRDYWxsYmFjazpmdW5jdGlvbihlKXt0aGlzLmlzT3B0ZWRPdXQ9ZSx0aGlzLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZD0hMCxQLnJlZ2lzdGVyUmVxdWVzdCgpLFUuaXNJYWJDb250ZXh0KCkmJnouY2hlY2tRdWVyeVN0cmluZ09iamVjdCgpfSxnZXRMb2FkVGltZW91dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5zdGFuY2U7aWYoZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0TG9hZFRpbWVvdXQpcmV0dXJuIGUuZ2V0TG9hZFRpbWVvdXQoKTtpZih2b2lkIDAhPT1lLmxvYWRUaW1lb3V0KXJldHVybiBlLmxvYWRUaW1lb3V0fXJldHVybiB0aGlzLlRJTUVfVE9fQ0FUQ0hfQUxMX1JFUVVFU1RTX1JFTEVBU0V9fSxkZWNsYXJlZElkOntkZWNsYXJlZElkOntpbml0Om51bGwscmVxdWVzdDpudWxsfSxkZWNsYXJlZElkQ29tYm9zOnt9LHNldERlY2xhcmVkSWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1OLmlzUG9wdWxhdGVkU3RyaW5nLGk9ZW5jb2RlVVJJQ29tcG9uZW50O2lmKGU9PT1PYmplY3QoZSkmJm4odCkpe3ZhciByPWUuZHBpZCxhPWUuZHB1dWlkLHM9bnVsbDtpZihuKHIpJiZuKGEpKXJldHVybiBzPWkocikrIiQiK2koYSksITA9PT10aGlzLmRlY2xhcmVkSWRDb21ib3Nbc10/InNldERlY2xhcmVkSWQ6IGNvbWJvIGV4aXN0cyBmb3IgdHlwZSAnIit0KyInIjoodGhpcy5kZWNsYXJlZElkQ29tYm9zW3NdPSEwLHRoaXMuZGVjbGFyZWRJZFt0XT17ZHBpZDpyLGRwdXVpZDphfSwic2V0RGVjbGFyZWRJZDogc3VjY2VlZGVkIGZvciB0eXBlICciK3QrIiciKX1yZXR1cm4ic2V0RGVjbGFyZWRJZDogZmFpbGVkIGZvciB0eXBlICciK3QrIicifSxnZXREZWNsYXJlZElkUXVlcnlTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlY2xhcmVkSWQucmVxdWVzdCx0PXRoaXMuZGVjbGFyZWRJZC5pbml0LG49ZW5jb2RlVVJJQ29tcG9uZW50LGk9IiI7cmV0dXJuIG51bGwhPT1lP2k9IiZkX2RwaWQ9IituKGUuZHBpZCkrIiZkX2RwdXVpZD0iK24oZS5kcHV1aWQpOm51bGwhPT10JiYoaT0iJmRfZHBpZD0iK24odC5kcGlkKSsiJmRfZHB1dWlkPSIrbih0LmRwdXVpZCkpLGl9fSxyZWdpc3RlclJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLmZpcmluZ1F1ZXVlO2U9PT1PYmplY3QoZSkmJihuLnB1c2goZSksZS5pc0RlZmF1bHRSZXF1ZXN0fHwoaz0hMCkpLHRoaXMuZmlyaW5nfHwhbi5sZW5ndGh8fGQmJiFESUwud2luZG93TG9hZGVkfHwodGhpcy5hZG1zLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZHx8dGhpcy5hZG1zLmdldElzT3B0ZWRPdXQoKSx0aGlzLmFkbXMuY2FsbGVkQmFjayYmIXRoaXMuYWRtcy5pc09wdGVkT3V0JiZ0aGlzLmFkbXMuaXNPcHRlZE91dENhbGxiYWNrQ2FsbGVkJiYoVS5pc0FwcHJvdmVkKCl8fHouaGFzR29TaWduYWwoKSkmJih0aGlzLmFkbXMuaXNPcHRlZE91dENhbGxiYWNrQ2FsbGVkPSExLCh0PW4uc2hpZnQoKSkuc3JjPXQuc3JjLnJlcGxhY2UoLyZkX25zaWQ9LywiJiIrdGhpcy5hZG1zLmdldE1JRFF1ZXJ5U3RyaW5nKCkrei5nZXRRdWVyeVN0cmluZygpKyJkX25zaWQ9IiksTi5pc1BvcHVsYXRlZFN0cmluZyh0LmNvcnNQb3N0RGF0YSkmJih0LmNvcnNQb3N0RGF0YT10LmNvcnNQb3N0RGF0YS5yZXBsYWNlKC9eZF9uc2lkPS8sdGhpcy5hZG1zLmdldE1JRFF1ZXJ5U3RyaW5nKCkrei5nZXRRdWVyeVN0cmluZygpKyJkX25zaWQ9IikpLHEuZmlyZVJlcXVlc3QodCksdGhpcy5maXJzdFJlcXVlc3RIYXNGaXJlZHx8InNjcmlwdCIhPT10LnRhZyYmImNvcnMiIT09dC50YWd8fCh0aGlzLmZpcnN0UmVxdWVzdEhhc0ZpcmVkPSEwKSkpfSxwcm9jZXNzVmlzaXRvckFQSTpmdW5jdGlvbigpe3RoaXMuYWRtcy5wcm9jZXNzKHd8fHdpbmRvdy5WaXNpdG9yKX0sZ2V0Q29vcFF1ZXJ5U3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuITA9PT1mP2U9IiZkX2Nvb3Bfc2FmZT0xIjohMT09PWYmJihlPSImZF9jb29wX3Vuc2FmZT0xIiksZX19O0MucmVxdWVzdENvbnRyb2xsZXI9UDt2YXIgRSxNLFI9e3NlbmRpbmdNZXNzYWdlczohMSxtZXNzYWdlczpbXSxtZXNzYWdlc1Bvc3RlZDpbXSxkZXN0aW5hdGlvbnM6W10sZGVzdGluYXRpb25zUG9zdGVkOltdLGpzb25Gb3JDb21wYXJpc29uOltdLGpzb25EdXBsaWNhdGVzOltdLGpzb25XYWl0aW5nOltdLGpzb25Qcm9jZXNzZWQ6W10scHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb246bnVsbCxyZXF1ZXN0VG9Qcm9jZXNzOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpe3IuanNvbkZvckNvbXBhcmlzb24ucHVzaChlKSxyLmpzb25XYWl0aW5nLnB1c2goW2UsdF0pfXZhciBpLHI9dGhpcztpZihlJiYhTi5pc0VtcHR5T2JqZWN0KGUpKWlmKGk9SlNPTi5zdHJpbmdpZnkoZS5kZXN0c3x8W10pLHRoaXMuanNvbkZvckNvbXBhcmlzb24ubGVuZ3RoKXt2YXIgYSxzLG8sYz0hMTtmb3IoYT0wLHM9dGhpcy5qc29uRm9yQ29tcGFyaXNvbi5sZW5ndGg7YTxzO2ErKylpZihvPXRoaXMuanNvbkZvckNvbXBhcmlzb25bYV0saT09PUpTT04uc3RyaW5naWZ5KG8uZGVzdHN8fFtdKSl7Yz0hMDticmVha31jP3RoaXMuanNvbkR1cGxpY2F0ZXMucHVzaChlKTpuKCl9ZWxzZSBuKCk7aWYodGhpcy5qc29uV2FpdGluZy5sZW5ndGgpe3ZhciBsPXRoaXMuanNvbldhaXRpbmcuc2hpZnQoKTt0aGlzLnByb2Nlc3MobFswXSxsWzFdKSx0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoKX10aGlzLm1lc3NhZ2VzLmxlbmd0aCYmIXRoaXMuc2VuZGluZ01lc3NhZ2VzJiZ0aGlzLnNlbmRNZXNzYWdlcygpfSxwcm9jZXNzOmZ1bmN0aW9uKGUpe2lmKGgpe3ZhciB0LG4saSxyLGEscyxvPWVuY29kZVVSSUNvbXBvbmVudCxjPXRoaXMuZ2V0UHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb24oKSxsPSExO2lmKC0xIT09Yyl7aWYoKHQ9ZS5kZXN0cykmJnQgaW5zdGFuY2VvZiBBcnJheSYmKG49dC5sZW5ndGgpKXtmb3IoaT0wO2k8bjtpKyspcj10W2ldLHM9W28oImRlc3RzIiksbyhyLmlkfHwiIiksbyhyLnl8fCIiKSxvKHIuY3x8IiIpXS5qb2luKCJ8IiksdGhpcy5hZGRNZXNzYWdlKHMpLGE9e3VybDpyLmMsaGlkZVJlZmVycmVyOnZvaWQgMD09PXIuaHJ8fCEhci5ocixtZXNzYWdlOnN9LHRoaXMuYWRkRGVzdGluYXRpb24oYSksdm9pZCAwIT09ci5ociYmKGw9ITApOzE9PT1jJiZsJiZULmxvZ09uY2UoIldhcm5pbmc6IHZpc2l0b3JJbnN0YW5jZS5wdWJsaXNoRGVzdGluYXRpb25zIHZlcnNpb24gaXMgb2xkIChWaXNpdG9yIHYzLjMuMCB0byB2NC4wLjApLiBVUkwgZGVzdGluYXRpb25zIHdpbGwgbm90IGhhdmUgdGhlIG9wdGlvbiBvZiBiZWluZyBmaXJlZCBvbiBwYWdlLCBvbmx5IGluIHRoZSBpZnJhbWUuIil9dGhpcy5qc29uUHJvY2Vzc2VkLnB1c2goZSl9fX0sYWRkTWVzc2FnZTpmdW5jdGlvbihlKXt0aGlzLm1lc3NhZ2VzLnB1c2goZSl9LGFkZERlc3RpbmF0aW9uOmZ1bmN0aW9uKGUpe3RoaXMuZGVzdGluYXRpb25zLnB1c2goZSl9LHNlbmRNZXNzYWdlczpmdW5jdGlvbigpe3RoaXMuc2VuZGluZ01lc3NhZ2VzfHwodGhpcy5zZW5kaW5nTWVzc2FnZXM9ITAsaCYmdGhpcy5tZXNzYWdlcy5sZW5ndGgmJnRoaXMucHVibGlzaERlc3RpbmF0aW9ucygpKX0scHVibGlzaERlc3RpbmF0aW9uczpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7VC5sb2coInZpc2l0b3IucHVibGlzaERlc3RpbmF0aW9ucygpIHJlc3VsdDogIisoZS5lcnJvcnx8ZS5tZXNzYWdlKSksbi5zZW5kaW5nTWVzc2FnZXM9ITEsbi5yZXF1ZXN0VG9Qcm9jZXNzKCl9ZnVuY3Rpb24gdCgpe24ubWVzc2FnZXM9W10sbi5kZXN0aW5hdGlvbnM9W119dmFyIG49dGhpcyxpPVAuYWRtcy5pbnN0YW5jZSxyPVtdLGE9W107cmV0dXJuIDE9PT10aGlzLnB1Ymxpc2hEZXN0aW5hdGlvbnNWZXJzaW9uPyhGLmV4dGVuZEFycmF5KHIsdGhpcy5tZXNzYWdlcyksRi5leHRlbmRBcnJheSh0aGlzLm1lc3NhZ2VzUG9zdGVkLHRoaXMubWVzc2FnZXMpLHQoKSxpLnB1Ymxpc2hEZXN0aW5hdGlvbnMobSxyLGUpLCJDYWxsZWQgdmlzaXRvci5wdWJsaXNoRGVzdGluYXRpb25zKCkgdmVyc2lvbiAxIik6MTx0aGlzLnB1Ymxpc2hEZXN0aW5hdGlvbnNWZXJzaW9uPyhGLmV4dGVuZEFycmF5KGEsdGhpcy5kZXN0aW5hdGlvbnMpLEYuZXh0ZW5kQXJyYXkodGhpcy5kZXN0aW5hdGlvbnNQb3N0ZWQsdGhpcy5kZXN0aW5hdGlvbnMpLHQoKSxpLnB1Ymxpc2hEZXN0aW5hdGlvbnMoe3N1YmRvbWFpbjptLGNhbGxiYWNrOmUsdXJsRGVzdGluYXRpb25zOmF9KSwiQ2FsbGVkIHZpc2l0b3IucHVibGlzaERlc3RpbmF0aW9ucygpIHZlcnNpb24gPiAxIik6dm9pZCAwfSxnZXRQdWJsaXNoRGVzdGluYXRpb25zVmVyc2lvbjpmdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLnB1Ymxpc2hEZXN0aW5hdGlvbnNWZXJzaW9uKXJldHVybiB0aGlzLnB1Ymxpc2hEZXN0aW5hdGlvbnNWZXJzaW9uO3ZhciBlPVAuYWRtcy5pbnN0YW5jZSxuPS0xO3JldHVybiBlLnB1Ymxpc2hEZXN0aW5hdGlvbnMobnVsbCxudWxsLGZ1bmN0aW9uKGUpe2lmKGU9PT1PYmplY3QoZSkpe3ZhciB0PWUuZXJyb3I7InN1YmRvbWFpbiBpcyBub3QgYSBwb3B1bGF0ZWQgc3RyaW5nLiI9PT10P249MToiSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZC4iPT09dCYmKG49Mil9fSksdGhpcy5wdWJsaXNoRGVzdGluYXRpb25zVmVyc2lvbj1ufX0saj17dHJhaXRzOmZ1bmN0aW9uKGUpe3JldHVybiBOLmlzVmFsaWRQZGF0YShlKSYmKEEuc2lkcyBpbnN0YW5jZW9mIEFycmF5fHwoQS5zaWRzPVtdKSxGLmV4dGVuZEFycmF5KEEuc2lkcyxlKSksdGhpc30scGl4ZWxzOmZ1bmN0aW9uKGUpe3JldHVybiBOLmlzVmFsaWRQZGF0YShlKSYmKEEucGRhdGEgaW5zdGFuY2VvZiBBcnJheXx8KEEucGRhdGE9W10pLEYuZXh0ZW5kQXJyYXkoQS5wZGF0YSxlKSksdGhpc30sbG9nczpmdW5jdGlvbihlKXtyZXR1cm4gTi5pc1ZhbGlkTG9nZGF0YShlKSYmKEEubG9nZGF0YSE9PU9iamVjdChBLmxvZ2RhdGEpJiYoQS5sb2dkYXRhPXt9KSxGLmV4dGVuZE9iamVjdChBLmxvZ2RhdGEsZSkpLHRoaXN9LGN1c3RvbVF1ZXJ5UGFyYW1zOmZ1bmN0aW9uKGUpe3JldHVybiBOLmlzRW1wdHlPYmplY3QoZSl8fEYuZXh0ZW5kT2JqZWN0KEEsZSxQLnJlc2VydmVkS2V5cyksdGhpc30sc2lnbmFsczpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ZTtpZighTi5pc0VtcHR5T2JqZWN0KGkpKXtpZih0JiYic3RyaW5nIj09dHlwZW9mIHQpZm9yKG4gaW4gaT17fSxlKWUuaGFzT3duUHJvcGVydHkobikmJihpW3Qrbl09ZVtuXSk7Ri5leHRlbmRPYmplY3QoQSxpLFAucmVzZXJ2ZWRLZXlzKX1yZXR1cm4gdGhpc30sZGVjbGFyZWRJZDpmdW5jdGlvbihlKXtyZXR1cm4gUC5kZWNsYXJlZElkLnNldERlY2xhcmVkSWQoZSwicmVxdWVzdCIpLHRoaXN9LHJlc3VsdDpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKEEuY2FsbGJhY2s9ZSksdGhpc30sYWZ0ZXJSZXN1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihBLnBvc3RDYWxsYmFja0ZuPWUpLHRoaXN9LHVzZUltYWdlUmVxdWVzdDpmdW5jdGlvbigpe3JldHVybiBBLnVzZUltYWdlUmVxdWVzdD0hMCx0aGlzfSxjbGVhckRhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gQT17fSx0aGlzfSxzdWJtaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEEuaXNEZWZhdWx0UmVxdWVzdD0hIWUscS5zdWJtaXRSZXF1ZXN0KEEpLEE9e30sdGhpc30sZ2V0UGFydG5lcjpmdW5jdGlvbigpe3JldHVybiBtfSxnZXRDb250YWluZXJOU0lEOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGdldEV2ZW50TG9nOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LGdldFN0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9e30sdD17fTtyZXR1cm4gRi5leHRlbmRPYmplY3QoZSxQLHtyZWdpc3RlclJlcXVlc3Q6ITB9KSxGLmV4dGVuZE9iamVjdCh0LFIse3JlcXVlc3RUb1Byb2Nlc3M6ITAscHJvY2VzczohMCxzZW5kTWVzc2FnZXM6ITB9KSx7aW5pdENvbmZpZzpuLHBlbmRpbmdSZXF1ZXN0OkEsb3RoZXJSZXF1ZXN0SW5mbzplLGRlc3RpbmF0aW9uUHVibGlzaGluZ0luZm86dCxsb2c6SX19LGlkU3luYzpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiUGxlYXNlIHVzZSB0aGUgYGlkU3luY0J5VVJMYCBtZXRob2Qgb2YgdGhlIEV4cGVyaWVuY2UgQ2xvdWQgSUQgU2VydmljZSAoVmlzaXRvcikgaW5zdGFuY2UiKX0sYWFtSWRTeW5jOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgdXNlIHRoZSBgaWRTeW5jQnlEYXRhU291cmNlYCBtZXRob2Qgb2YgdGhlIEV4cGVyaWVuY2UgQ2xvdWQgSUQgU2VydmljZSAoVmlzaXRvcikgaW5zdGFuY2UiKX0scGFzc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIE4uaXNFbXB0eU9iamVjdChlKT8iRXJyb3I6IGpzb24gaXMgZW1wdHkgb3Igbm90IGFuIG9iamVjdCI6KHEuZGVmYXVsdENhbGxiYWNrKGUpLGUpfSxnZXRQbGF0Zm9ybVBhcmFtczpmdW5jdGlvbigpe3JldHVybiBQLnBsYXRmb3JtUGFyYW1zfSxnZXRFdmVudENhbGxDb25maWdQYXJhbXM6ZnVuY3Rpb24oKXt2YXIgZSx0PVAsbj10Lm1vZFN0YXRzUGFyYW1zLGk9dC5wbGF0Zm9ybVBhcmFtcztpZighbil7Zm9yKGUgaW4gbj17fSxpKWkuaGFzT3duUHJvcGVydHkoZSkmJiF0Lm5vbk1vZFN0YXRzUGFyYW1zW2VdJiYobltlLnJlcGxhY2UoL15kXy8sIiIpXT1pW2VdKTshMD09PWY/bi5jb29wX3NhZmU9MTohMT09PWYmJihuLmNvb3BfdW5zYWZlPTEpLHQubW9kU3RhdHNQYXJhbXM9bn1yZXR1cm4gbn0sc2V0QXNDb29wU2FmZTpmdW5jdGlvbigpe3JldHVybiBmPSEwLHRoaXN9LHNldEFzQ29vcFVuc2FmZTpmdW5jdGlvbigpe3JldHVybiBmPSExLHRoaXN9LGdldEV2ZW50Q2FsbElhYlNpZ25hbHM6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUhPT1PYmplY3QoZSk/IkVycm9yOiBjb25maWcgaXMgbm90IGFuIG9iamVjdCI6ImZ1bmN0aW9uIiE9dHlwZW9mIGUuY2FsbGJhY2s/IkVycm9yOiBjb25maWcuY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iOih0PXBhcnNlSW50KGUudGltZW91dCwxMCksaXNOYU4odCkmJih0PW51bGwpLHZvaWQgei5nZXRRdWVyeVN0cmluZ09iamVjdChlLmNhbGxiYWNrLHQpKX19LHE9e2NvcnNNZXRhZGF0YTooRT0ibm9uZSIsInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdCYmWE1MSHR0cFJlcXVlc3Q9PT1PYmplY3QoWE1MSHR0cFJlcXVlc3QpJiYid2l0aENyZWRlbnRpYWxzImluIG5ldyBYTUxIdHRwUmVxdWVzdCYmKEU9IlhNTEh0dHBSZXF1ZXN0Iikse2NvcnNUeXBlOkV9KSxnZXRDT1JTSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4ibm9uZSI9PT10aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZT9udWxsOm5ldyB3aW5kb3dbdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGVdfSxzdWJtaXRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3JldHVybiBQLnJlZ2lzdGVyUmVxdWVzdChxLmNyZWF0ZVF1ZXVlZFJlcXVlc3QoZSkpLCEwfSxjcmVhdGVRdWV1ZWRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0LG4saSxyLGEscz1lLmNhbGxiYWNrLG89ImltZyIsYz1lLmlzRGVmYXVsdFJlcXVlc3Q7aWYoZGVsZXRlIGUuaXNEZWZhdWx0UmVxdWVzdCwhTi5pc0VtcHR5T2JqZWN0KGwpKWZvcihpIGluIGwpaWYobC5oYXNPd25Qcm9wZXJ0eShpKSl7aWYobnVsbD09KHI9bFtpXSl8fCIiPT09ciljb250aW51ZTtpZihpIGluIGUmJiEociBpbiBlKSYmIShyIGluIFAucmVzZXJ2ZWRLZXlzKSl7aWYobnVsbD09KGE9ZVtpXSl8fCIiPT09YSljb250aW51ZTtlW3JdPWF9fXJldHVybiBOLmlzVmFsaWRQZGF0YShlLnNpZHMpfHwoZS5zaWRzPVtdKSxOLmlzVmFsaWRQZGF0YShlLnBkYXRhKXx8KGUucGRhdGE9W10pLE4uaXNWYWxpZExvZ2RhdGEoZS5sb2dkYXRhKXx8KGUubG9nZGF0YT17fSksZS5sb2dkYXRhQXJyYXk9Ri5jb252ZXJ0T2JqZWN0VG9LZXlWYWx1ZVBhaXJzKGUubG9nZGF0YSwiPSIsITApLGUubG9nZGF0YUFycmF5LnB1c2goIl90cz0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKSwiZnVuY3Rpb24iIT10eXBlb2YgcyYmKHM9dGhpcy5kZWZhdWx0Q2FsbGJhY2spLHQ9dGhpcy5tYWtlUmVxdWVzdFNyY0RhdGEoZSksKG49dGhpcy5nZXRDT1JTSW5zdGFuY2UoKSkmJiEwIT09ZS51c2VJbWFnZVJlcXVlc3QmJihvPSJjb3JzIikse3RhZzpvLHNyYzp0LnNyYyxjb3JzU3JjOnQuY29yc1NyYyxjYWxsYmFja0ZuOnMscG9zdENhbGxiYWNrRm46ZS5wb3N0Q2FsbGJhY2tGbix1c2VJbWFnZVJlcXVlc3Q6ISFlLnVzZUltYWdlUmVxdWVzdCxyZXF1ZXN0RGF0YTplLGNvcnNJbnN0YW5jZTpuLGNvcnNQb3N0RGF0YTp0LmNvcnNQb3N0RGF0YSxpc0RlZmF1bHRSZXF1ZXN0OmN9fSxkZWZhdWx0Q2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXt2YXIgbixpLHIsYSxzLG8sYyxsLHU7aWYoXyYmKG49ZS5zdHVmZikmJm4gaW5zdGFuY2VvZiBBcnJheSYmKGk9bi5sZW5ndGgpKWZvcihyPTA7cjxpO3IrKykoYT1uW3JdKSYmYT09PU9iamVjdChhKSYmKHM9YS5jbixvPWEuY3Ysdm9pZCAwIT09KGM9YS50dGwpJiYiIiE9PWN8fChjPU1hdGguZmxvb3IoRi5nZXRNYXhDb29raWVFeHBpcmVzSW5NaW51dGVzKCkvNjAvMjQpKSxsPWEuZG1ufHwiLiIrZG9jdW1lbnQuZG9tYWluLnJlcGxhY2UoL153d3dcLi8sIiIpLHU9YS50eXBlLHMmJihvfHwibnVtYmVyIj09dHlwZW9mIG8pJiYoInZhciIhPT11JiYoYz1wYXJzZUludChjLDEwKSkmJiFpc05hTihjKSYmRi5zZXRDb29raWUocyxvLDI0KmMqNjAsIi8iLGwsITEpLEwuc3R1ZmZlZFtzXT1vKSk7dmFyIGQscCxmPWUudXVpZDtOLmlzUG9wdWxhdGVkU3RyaW5nKGYpJiYoTi5pc0VtcHR5T2JqZWN0KGcpfHwoInN0cmluZyI9PXR5cGVvZihkPWcucGF0aCkmJmQubGVuZ3RofHwoZD0iLyIpLHA9cGFyc2VJbnQoZy5kYXlzLDEwKSxpc05hTihwKSYmKHA9MTAwKSxGLnNldENvb2tpZShnLm5hbWV8fCJhYW1fZGlkIixmLDI0KnAqNjAsZCxnLmRvbWFpbnx8Ii4iK2RvY3VtZW50LmRvbWFpbi5yZXBsYWNlKC9ed3d3XC4vLCIiKSwhMD09PWcuc2VjdXJlKSkpLFAuYWJvcnRSZXF1ZXN0c3x8Ui5yZXF1ZXN0VG9Qcm9jZXNzKGUsdCl9LG1ha2VSZXF1ZXN0U3JjRGF0YTpmdW5jdGlvbihhKXthLnNpZHM9Ti5yZW1vdmVFbXB0eUFycmF5VmFsdWVzKGEuc2lkc3x8W10pLGEucGRhdGE9Ti5yZW1vdmVFbXB0eUFycmF5VmFsdWVzKGEucGRhdGF8fFtdKTt2YXIgcz1QLGU9cy5wbGF0Zm9ybVBhcmFtcyx0PUYuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0KGEuc2lkcywiLCIpLG49Ri5lbmNvZGVBbmRCdWlsZFJlcXVlc3QoYS5wZGF0YSwiLCIpLGk9KGEubG9nZGF0YUFycmF5fHxbXSkuam9pbigiJiIpO2RlbGV0ZSBhLmxvZ2RhdGFBcnJheTt2YXIgcixvLGM9ZW5jb2RlVVJJQ29tcG9uZW50LGw9Vi5JU19IVFRQUz8iaHR0cHM6Ly8iOiJodHRwOi8vIix1PXMuZGVjbGFyZWRJZC5nZXREZWNsYXJlZElkUXVlcnlTdHJpbmcoKSxkPXMuYWRtcy5pbnN0YW5jZT9zLmFkbXMuZ2V0Q3VzdG9tZXJJRHNRdWVyeVN0cmluZyhzLmFkbXMuZ2V0Q3VzdG9tZXJJRHMoKSk6IiIscD1mdW5jdGlvbigpe3ZhciBlLHQsbixpLHI9W107Zm9yKGUgaW4gYSlpZighKGUgaW4gcy5yZXNlcnZlZEtleXMpJiZhLmhhc093blByb3BlcnR5KGUpKWlmKHQ9YVtlXSxlPWMoZSksdCBpbnN0YW5jZW9mIEFycmF5KWZvcihuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXIucHVzaChlKyI9IitjKHRbbl0pKTtlbHNlIHIucHVzaChlKyI9IitjKHQpKTtyZXR1cm4gci5sZW5ndGg/IiYiK3Iuam9pbigiJiIpOiIifSgpLGY9ImRfZGlsX3Zlcj0iK2MoRElMLnZlcnNpb24pLGc9ImRfbnNpZD0iK2UuZF9uc2lkK3MuZ2V0Q29vcFF1ZXJ5U3RyaW5nKCkrdStkKyh0Lmxlbmd0aD8iJmRfc2lkPSIrdDoiIikrKG4ubGVuZ3RoPyImZF9weD0iK246IiIpKyhpLmxlbmd0aD8iJmRfbGQ9IitjKGkpOiIiKSx2PSImZF9ydGJkPSIrZS5kX3J0YmQrIiZkX2pzb252PSIrZS5kX2pzb252KyImZF9kc3Q9IitlLmRfZHN0LGg9Yj8iJmhfcmVmZXJlcj0iK2MobG9jYXRpb24uaHJlZik6IiI7cmV0dXJuIG89KHI9bCttKyIuZGVtZGV4Lm5ldC9ldmVudCIpKyI/IitmKyImIitnK3YrcCtoLHtjb3JzU3JjOnIrIj8iK2YrIiZfdHM9IisobmV3IERhdGUpLmdldFRpbWUoKSxzcmM6byxjb3JzUG9zdERhdGE6Zyt2K3AraCxpc0RlY2xhcmVkSWRDYWxsOiIiIT09dX19LGZpcmVSZXF1ZXN0OmZ1bmN0aW9uKGUpe2lmKCJpbWciPT09ZS50YWcpdGhpcy5maXJlSW1hZ2UoZSk7ZWxzZXt2YXIgdD1QLmRlY2xhcmVkSWQsbj10LmRlY2xhcmVkSWQucmVxdWVzdHx8dC5kZWNsYXJlZElkLmluaXR8fHt9LGk9e2RwaWQ6bi5kcGlkfHwiIixkcHV1aWQ6bi5kcHV1aWR8fCIifTt0aGlzLmZpcmVDT1JTKGUsaSl9fSxmaXJlSW1hZ2U6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVA7aS5hYm9ydFJlcXVlc3RzfHwoaS5maXJpbmc9ITAsZT1uZXcgSW1hZ2UoMCwwKSxpLnNlbnQucHVzaCh0KSxlLm9ubG9hZD1mdW5jdGlvbigpe2kuZmlyaW5nPSExLGkuZmlyZWQucHVzaCh0KSxpLm51bV9vZl9pbWdfcmVzcG9uc2VzKyssaS5yZWdpc3RlclJlcXVlc3QoKX0sbj1mdW5jdGlvbihlKXt1PSJpbWdBYm9ydE9yRXJyb3JIYW5kbGVyIHJlY2VpdmVkIHRoZSBldmVudCBvZiB0eXBlICIrZS50eXBlLFQubG9nKHUpLGkuYWJvcnRSZXF1ZXN0cz0hMCxpLmZpcmluZz0hMSxpLmVycm9yZWQucHVzaCh0KSxpLm51bV9vZl9pbWdfZXJyb3JzKyssaS5yZWdpc3RlclJlcXVlc3QoKX0sZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbiksZS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbiksZS5zcmM9dC5zcmMpfSxmaXJlQ09SUzpmdW5jdGlvbihpLHIpe3ZhciBhPXRoaXMscz1QLGU9dGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGUsdD1pLmNvcnNTcmMsbj1pLmNvcnNJbnN0YW5jZSxvPWkuY29yc1Bvc3REYXRhLGM9aS5wb3N0Q2FsbGJhY2tGbixsPSJmdW5jdGlvbiI9PXR5cGVvZiBjO2lmKCFzLmFib3J0UmVxdWVzdHMmJiF4KXtzLmZpcmluZz0hMDt0cnl7bi5vcGVuKCJwb3N0Iix0LCEwKSwiWE1MSHR0cFJlcXVlc3QiPT09ZSYmKG4ud2l0aENyZWRlbnRpYWxzPSEwLG4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09dGhpcy5yZWFkeVN0YXRlJiYyMDA9PT10aGlzLnN0YXR1cyYmZnVuY3Rpb24oZSl7dmFyIHQ7dHJ5e2lmKCh0PUpTT04ucGFyc2UoZSkpIT09T2JqZWN0KHQpKXJldHVybiBhLmhhbmRsZUNPUlNFcnJvcihpLHIsIlJlc3BvbnNlIGlzIG5vdCBKU09OIil9Y2F0Y2goZSl7cmV0dXJuIGEuaGFuZGxlQ09SU0Vycm9yKGksciwiRXJyb3IgcGFyc2luZyByZXNwb25zZSBhcyBKU09OIil9dHJ5e3ZhciBuPWkuY2FsbGJhY2tGbjtzLmZpcmluZz0hMSxzLmZpcmVkLnB1c2goaSkscy5udW1fb2ZfY29yc19yZXNwb25zZXMrKyxuKHQsciksbCYmYyh0LHIpfWNhdGNoKGUpe2UubWVzc2FnZT0iRElMIGhhbmRsZUNPUlNSZXNwb25zZSBjYXVnaHQgZXJyb3Igd2l0aCBtZXNzYWdlICIrZS5tZXNzYWdlLHU9ZS5tZXNzYWdlLFQubG9nKHUpLGUuZmlsZW5hbWU9ZS5maWxlbmFtZXx8ImRpbC5qcyIsZS5wYXJ0bmVyPW0sRElMLmVycm9yTW9kdWxlLmhhbmRsZUVycm9yKGUpO3RyeXtuKHtlcnJvcjplLm5hbWUrInwiK2UubWVzc2FnZX0sciksbCYmYyh7ZXJyb3I6ZS5uYW1lKyJ8IitlLm1lc3NhZ2V9LHIpfWNhdGNoKGUpe319ZmluYWxseXtzLnJlZ2lzdGVyUmVxdWVzdCgpfX0odGhpcy5yZXNwb25zZVRleHQpfSksbi5vbmVycm9yPWZ1bmN0aW9uKCl7YS5oYW5kbGVDT1JTRXJyb3IoaSxyLCJvbmVycm9yIil9LG4ub250aW1lb3V0PWZ1bmN0aW9uKCl7YS5oYW5kbGVDT1JTRXJyb3IoaSxyLCJvbnRpbWVvdXQiKX0sbi5zZW5kKG8pfWNhdGNoKGUpe3RoaXMuaGFuZGxlQ09SU0Vycm9yKGksciwidHJ5LWNhdGNoIil9cy5zZW50LnB1c2goaSkscy5kZWNsYXJlZElkLmRlY2xhcmVkSWQucmVxdWVzdD1udWxsfX0saGFuZGxlQ09SU0Vycm9yOmZ1bmN0aW9uKGUsdCxuKXtQLm51bV9vZl9jb3JzX2Vycm9ycysrLFAuY29yc0Vycm9yU291cmNlcy5wdXNoKG4pfX0sTj17aXNWYWxpZFBkYXRhOmZ1bmN0aW9uKGUpe3JldHVybiEhKGUgaW5zdGFuY2VvZiBBcnJheSYmdGhpcy5yZW1vdmVFbXB0eUFycmF5VmFsdWVzKGUpLmxlbmd0aCl9LGlzVmFsaWRMb2dkYXRhOmZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLmlzRW1wdHlPYmplY3QoZSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7aWYoZSE9PU9iamVjdChlKSlyZXR1cm4hMDt2YXIgdDtmb3IodCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuITE7cmV0dXJuITB9LHJlbW92ZUVtcHR5QXJyYXlWYWx1ZXM6ZnVuY3Rpb24oZSl7dmFyIHQsbj0wLGk9ZS5sZW5ndGgscj1bXTtmb3Iobj0wO248aTtuKyspbnVsbCE9KHQ9ZVtuXSkmJiIiIT09dCYmci5wdXNoKHQpO3JldHVybiByfSxpc1BvcHVsYXRlZFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUubGVuZ3RofX0sRj17Y29udmVydE9iamVjdFRvS2V5VmFsdWVQYWlyczpmdW5jdGlvbihlLHQsbil7dmFyIGkscixhPVtdO2ZvcihpIGluIHQ9dHx8Ij0iLGUpZS5oYXNPd25Qcm9wZXJ0eShpKSYmbnVsbCE9KHI9ZVtpXSkmJiIiIT09ciYmYS5wdXNoKGkrdCsobj9lbmNvZGVVUklDb21wb25lbnQocik6cikpO3JldHVybiBhfSxlbmNvZGVBbmRCdWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pLmpvaW4odCl9LGdldENvb2tpZTpmdW5jdGlvbihlKXt2YXIgdCxuLGkscj1lKyI9IixhPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpO2Zvcih0PTAsbj1hLmxlbmd0aDt0PG47dCsrKXtmb3IoaT1hW3RdOyIgIj09PWkuY2hhckF0KDApOylpPWkuc3Vic3RyaW5nKDEsaS5sZW5ndGgpO2lmKDA9PT1pLmluZGV4T2YocikpcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpLnN1YnN0cmluZyhyLmxlbmd0aCxpLmxlbmd0aCkpfXJldHVybiBudWxsfSxzZXRDb29raWU6ZnVuY3Rpb24oZSx0LG4saSxyLGEpe3ZhciBzPW5ldyBEYXRlO249biYmMWUzKm4qNjAsZG9jdW1lbnQuY29va2llPWUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSsobj8iO2V4cGlyZXM9IituZXcgRGF0ZShzLmdldFRpbWUoKStuKS50b1VUQ1N0cmluZygpOiIiKSsoaT8iO3BhdGg9IitpOiIiKSsocj8iO2RvbWFpbj0iK3I6IiIpKyhhPyI7c2VjdXJlIjoiIil9LGV4dGVuZEFycmF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSYmdCBpbnN0YW5jZW9mIEFycmF5JiYoQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZSx0KSwhMCl9LGV4dGVuZE9iamVjdDpmdW5jdGlvbihlLHQsbil7dmFyIGk7aWYoZSE9PU9iamVjdChlKXx8dCE9PU9iamVjdCh0KSlyZXR1cm4hMTtmb3IoaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe2lmKCFOLmlzRW1wdHlPYmplY3QobikmJmkgaW4gbiljb250aW51ZTtlW2ldPXRbaV19cmV0dXJuITB9LGdldE1heENvb2tpZUV4cGlyZXNJbk1pbnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gVi5TSVhfTU9OVEhTX0lOX01JTlVURVN9LHJlcGxhY2VNZXRob2RzV2l0aEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoZT09PU9iamVjdChlKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQpZm9yKG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXSYmKGVbbl09dCl9fSxVPShNPUMucmVxdWVzdENvbnRyb2xsZXIse2V4aXN0czpudWxsLGluc3RhbmNlOm51bGwsYWFtSXNBcHByb3ZlZDpudWxsLGluaXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuY2hlY2tJZkV4aXN0cygpPyh0aGlzLmV4aXN0cz0hMCx0aGlzLmluc3RhbmNlPXdpbmRvdy5hZG9iZS5vcHRJbix0aGlzLmluc3RhbmNlLmZldGNoUGVybWlzc2lvbnMoZnVuY3Rpb24oKXtlLmNhbGxiYWNrKCl9LCEwKSk6dGhpcy5leGlzdHM9ITF9LGNoZWNrSWZFeGlzdHM6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmFkb2JlPT09T2JqZWN0KHdpbmRvdy5hZG9iZSkmJndpbmRvdy5hZG9iZS5vcHRJbj09PU9iamVjdCh3aW5kb3cuYWRvYmUub3B0SW4pfSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuYWFtSXNBcHByb3ZlZD10aGlzLmluc3RhbmNlLmlzQXBwcm92ZWQoW3RoaXMuaW5zdGFuY2UuQ2F0ZWdvcmllcy5BQU1dKSxNLmFkbXMud2FpdEZvck1pZFRvUmVsZWFzZVJlcXVlc3RzKCksTS5hZG1zLmdldElzT3B0ZWRPdXQoKX0saXNBcHByb3ZlZDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSWFiQ29udGV4dCgpJiYhTS5hZG1zLmlzT3B0ZWRPdXQmJighdGhpcy5leGlzdHN8fHRoaXMuYWFtSXNBcHByb3ZlZCl9LGlzSWFiQ29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc3RhbmNlJiZ0aGlzLmluc3RhbmNlLmlzSWFiQ29udGV4dH19KTtDLm9wdEluPVU7dmFyIEIsSCxHLFEsej0oSD0oQj1DKS5yZXF1ZXN0Q29udHJvbGxlcixHPUIub3B0SW4sUT17aXNWZW5kb3JDb25zZW50ZWQ6bnVsbCxkb2VzR2RwckFwcGx5Om51bGwsY29uc2VudFN0cmluZzpudWxsLHF1ZXJ5U3RyaW5nT2JqZWN0Q2FsbGJhY2tzOltdLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmZldGNoQ29uc2VudERhdGEoKX0saGFzR29TaWduYWw6ZnVuY3Rpb24oKXtyZXR1cm4hKCEoRy5pc0lhYkNvbnRleHQoKSYmdGhpcy5pc1ZlbmRvckNvbnNlbnRlZCYmdGhpcy5kb2VzR2RwckFwcGx5JiYic3RyaW5nIj09dHlwZW9mIHRoaXMuY29uc2VudFN0cmluZyYmdGhpcy5jb25zZW50U3RyaW5nLmxlbmd0aCl8fEguYWRtcy5pc09wdGVkT3V0KX0sZmV0Y2hDb25zZW50RGF0YTpmdW5jdGlvbihuLGUpe3ZhciBpPXRoaXMsdD17fTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49ZnVuY3Rpb24oKXt9KSxHLmluc3RhbmNlJiZHLmlzSWFiQ29udGV4dCgpPyhlJiYodC50aW1lb3V0PWUpLEcuaW5zdGFuY2UuZXhlY3V0ZSh7Y29tbWFuZDoiaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEiLHBhcmFtczp0LGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dD09PU9iamVjdCh0KT8oaS5kb2VzR2RwckFwcGx5PSEhdC5nZHByQXBwbGllcyxpLmNvbnNlbnRTdHJpbmc9dC5jb25zZW50U3RyaW5nfHwiIik6KGkuZG9lc0dkcHJBcHBseT0hMSxpLmNvbnNlbnRTdHJpbmc9IiIpLGkuaXNWZW5kb3JDb25zZW50ZWQ9Ry5pbnN0YW5jZS5pc0FwcHJvdmVkKEcuaW5zdGFuY2UuQ2F0ZWdvcmllcy5BQU0pLGU/bih7fSk6aS5jaGVja1F1ZXJ5U3RyaW5nT2JqZWN0KG4pLEguYWRtcy53YWl0Rm9yTWlkVG9SZWxlYXNlUmVxdWVzdHMoKX19KSk6bih7fSl9LGdldFF1ZXJ5U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIEcuaXNJYWJDb250ZXh0KCk/ImdkcHI9IisodGhpcy5kb2VzR2RwckFwcGx5PzE6MCkrIiZnZHByX2NvbnNlbnQ9Iit0aGlzLmNvbnNlbnRTdHJpbmcrIiYiOiIifSxnZXRRdWVyeVN0cmluZ09iamVjdDpmdW5jdGlvbihlLHQpe3RoaXMuZmV0Y2hDb25zZW50RGF0YShlLHQpfSxjaGVja1F1ZXJ5U3RyaW5nT2JqZWN0OmZ1bmN0aW9uKGUpe1EuaGFzR29TaWduYWwoKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoe2dkcHI6dGhpcy5kb2VzR2RwckFwcGx5PzE6MCxnZHByX2NvbnNlbnQ6dGhpcy5jb25zZW50U3RyaW5nfSl9fSk7Qy5pYWI9eiwiZXJyb3IiPT09bSYmMD09PWEmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe0RJTC53aW5kb3dMb2FkZWQ9ITB9KTt2YXIgVz0hMSxZPWZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2t8fFAuZmlyc3RSZXF1ZXN0SGFzRmlyZWR8fCgiZnVuY3Rpb24iPT10eXBlb2YgeT9qLmFmdGVyUmVzdWx0KHkpLnN1Ym1pdCghMCk6ai5zdWJtaXQoITApKX0sRElMLmNvbnN0YW50cy5USU1FX1RPX0RFRkFVTFRfUkVRVUVTVCl9LEs9ZG9jdW1lbnQ7ImVycm9yIiE9PW0mJihESUwud2luZG93TG9hZGVkP2koKToiY29tcGxldGUiIT09Sy5yZWFkeVN0YXRlJiYibG9hZGVkIiE9PUsucmVhZHlTdGF0ZT93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXtESUwud2luZG93TG9hZGVkPSEwLGkoKX0pOihESUwud2luZG93TG9hZGVkPSEwLGkoKSkpLFAuZGVjbGFyZWRJZC5zZXREZWNsYXJlZElkKGMsImluaXQiKSxVLmluaXQoKSx6LmluaXQoKSxQLnByb2Nlc3NWaXNpdG9yQVBJKCksVi5JU19JRV9MRVNTX1RIQU5fMTAmJkYucmVwbGFjZU1ldGhvZHNXaXRoRnVuY3Rpb24oaixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdGhpcy5hcGk9aix0aGlzLmdldFN0dWZmZWRWYXJpYWJsZT1mdW5jdGlvbihlKXt2YXIgdD1MLnN0dWZmZWRbZV07cmV0dXJuIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8KHQ9Ri5nZXRDb29raWUoZSkpfHwibnVtYmVyIj09dHlwZW9mIHR8fCh0PSIiKSx0fSx0aGlzLnZhbGlkYXRvcnM9Tix0aGlzLmhlbHBlcnM9Rix0aGlzLmNvbnN0YW50cz1WLHRoaXMubG9nPUksdGhpcy5wZW5kaW5nUmVxdWVzdD1BLHRoaXMucmVxdWVzdENvbnRyb2xsZXI9UCx0aGlzLmRlc3RpbmF0aW9uUHVibGlzaGluZz1SLHRoaXMucmVxdWVzdFByb2NzPXEsdGhpcy51bml0cz1DLHRoaXMuaW5pdENvbmZpZz1uLHRoaXMubG9nZ2VyPVQsTyYmKHRoaXMudmFyaWFibGVzPUwsdGhpcy5jYWxsV2luZG93TG9hZEZ1bmN0aW9ucz1pKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF9lMzM1ZTBjODdmYTc1Y2M5KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX29sZF9lMzM1ZTBjODdmYTc1Y2M5KTtpZigkX19fb2xkXzEzN2JhZThlNDcxMmVmZTIpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fb2xkXzEzN2JhZThlNDcxMmVmZTIpfX0sRElMLmV4dGVuZFN0YXRpY1Byb3BlcnRpZXNBbmRNZXRob2RzPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKGU9PT1PYmplY3QoZSkpZm9yKHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYodGhpc1t0XT1lW3RdKX0sRElMLmV4dGVuZFN0YXRpY1Byb3BlcnRpZXNBbmRNZXRob2RzKHt2ZXJzaW9uOiI5LjQiLGpzb25WZXJzaW9uOjEsY29uc3RhbnRzOntUSU1FX1RPX0RFRkFVTFRfUkVRVUVTVDo1MDB9LHZhcmlhYmxlczp7c2NyaXB0Tm9kZUxpc3Q6ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpfSx3aW5kb3dMb2FkZWQ6ITEsZGlsczp7fSxpc0FkZGVkUG9zdFdpbmRvd0xvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTt0aGlzLndpbmRvd0xvYWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgdD8hIXQoKToiYm9vbGVhbiIhPXR5cGVvZiB0fHx0fSxjcmVhdGU6ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBuZXcgRElMKGUpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiRXJyb3IgaW4gYXR0ZW1wdCB0byBjcmVhdGUgRElMIGluc3RhbmNlIHdpdGggRElMLmNyZWF0ZSgpOiAiK2UubWVzc2FnZSl9fSxyZWdpc3RlckRpbDpmdW5jdGlvbihlLHQsbil7dmFyIGk9dCsiJCIrbjtpIGluIHRoaXMuZGlsc3x8KHRoaXMuZGlsc1tpXT1lKX0sZ2V0RGlsOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIiksKG49ZSsiJCIrKHQ9dHx8MCkpaW4gdGhpcy5kaWxzP3RoaXMuZGlsc1tuXTpuZXcgRXJyb3IoIlRoZSBESUwgaW5zdGFuY2Ugd2l0aCBwYXJ0bmVyID0gIitlKyIgYW5kIGNvbnRhaW5lck5TSUQgPSAiK3QrIiB3YXMgbm90IGZvdW5kIil9LGRleEdldFFTVmFyczpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy5nZXREaWwodCxuKTtyZXR1cm4gaSBpbnN0YW5jZW9mIHRoaXM/aS5nZXRTdHVmZmVkVmFyaWFibGUoZSk6IiJ9fSksRElMLmVycm9yTW9kdWxlPShhPURJTC5jcmVhdGUoe3BhcnRuZXI6ImVycm9yIixjb250YWluZXJOU0lEOjAsaWdub3JlSGFyZERlcGVuZGVuY3lPblZpc2l0b3JBUEk6ITB9KSxvPSEocz17aGFydmVzdGVyZXJyb3I6MTQxMzgsZGVzdHB1YmVycm9yOjE0MTM5LGRwbWVycm9yOjE0MTQwLGdlbmVyYWxlcnJvcjoxNDEzNyxlcnJvcjoxNDEzNyxub2Vycm9ydHlwZWRlZmluZWQ6MTUwMjEsZXZhbGVycm9yOjE1MDE2LHJhbmdlZXJyb3I6MTUwMTcscmVmZXJlbmNlZXJyb3I6MTUwMTgsdHlwZWVycm9yOjE1MDE5LHVyaWVycm9yOjE1MDIwfSkse2FjdGl2YXRlOmZ1bmN0aW9uKCl7bz0hMH0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oZSl7aWYoIW8pcmV0dXJuIkRJTCBlcnJvciBtb2R1bGUgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCI7ZSE9PU9iamVjdChlKSYmKGU9e30pO3ZhciB0PWUubmFtZT8oZS5uYW1lKyIiKS50b0xvd2VyQ2FzZSgpOiIiLG49dCBpbiBzP3NbdF06cy5ub2Vycm9ydHlwZWRlZmluZWQsaT1bXSxyPXtuYW1lOnQsZmlsZW5hbWU6ZS5maWxlbmFtZT9lLmZpbGVuYW1lKyIiOiIiLHBhcnRuZXI6ZS5wYXJ0bmVyP2UucGFydG5lcisiIjoibm9fcGFydG5lciIsc2l0ZTplLnNpdGU/ZS5zaXRlKyIiOmRvY3VtZW50LmxvY2F0aW9uLmhyZWYsbWVzc2FnZTplLm1lc3NhZ2U/ZS5tZXNzYWdlKyIiOiIifTtyZXR1cm4gaS5wdXNoKG4pLGEuYXBpLnBpeGVscyhpKS5sb2dzKHIpLnVzZUltYWdlUmVxdWVzdCgpLnN1Ym1pdCgpLCJESUwgZXJyb3IgcmVwb3J0IHNlbnQifSxwaXhlbE1hcDpzfSksRElMLnRvb2xzPXt9LERJTC5tb2R1bGVzPXtoZWxwZXJzOnt9fSl9KCksQXBwTWVhc3VyZW1lbnQuZ2V0SW5zdGFuY2U9c19naSx3aW5kb3cuc19vYmplY3RJRHx8KHdpbmRvdy5zX29iamVjdElEPTApLHNfcGdpY3EoKSxmZHhfaW5pdFNDb2RlKCl9KSgpfQo="},{"name":"sugarcoat-analytics-a14946c73def6bdaa93155f58435a82e.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0ICRfX19tb2NrX2NmM2UyNjQxYTZhMDU3ZGU9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7Y29uc3QgeGhyVW5zZW50PTA7Y29uc3QgeGhyT3BlbmVkPTE7Y29uc3QgeGhySGVhZGVyc1JlY2VpdmVkPTI7Y29uc3QgeGhyTG9hZGluZz0zO2NvbnN0IHhockRvbmU9NDtjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbD1TeW1ib2woImRlZmVycmVkSGFuZGxlIik7Y29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2w9U3ltYm9sKCJvbmxvYWRzdGFydCIpO2NvbnN0IHhock9uUHJvZ3Jlc3NTeW1ib2w9U3ltYm9sKCJvbnByb2dyZXNzIik7Y29uc3QgeGhyT25BYm9ydFN5bWJvbD1TeW1ib2woIm9uYWJvcnQiKTtjb25zdCB4aHJPbkVycm9yU3ltYm9sPVN5bWJvbCgib25lcnJvciIpO2NvbnN0IHhock9uTG9hZFN5bWJvbD1TeW1ib2woIm9ubG9hZCIpO2NvbnN0IHhock9uVGltZW91dFN5bWJvbD1TeW1ib2woIm9udGltZW91dCIpO2NvbnN0IHhock9uTG9hZEVuZFN5bWJvbD1TeW1ib2woIm9ubG9hZGVuZCIpO2NvbnN0IHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpO2NvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2w9U3ltYm9sKCJyZWFkeVN0YXRlIik7Y29uc3QgeGhyVGltZW91dFN5bWJvbD1TeW1ib2woInRpbWVvdXQiKTtjb25zdCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2w9U3ltYm9sKCJ3aXRoQ3JlZGVudGlhbHMiKTtjb25zdCB4aHJVcGxvYWRTeW1ib2w9U3ltYm9sKCJ1cGxvYWQiKTtjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2w9U3ltYm9sKCJyZXNwb25zZVR5cGUiKTtjb25zdCBkZWZpbmVFdmVudD0ob2JqLHN5bWJvbCk9Pntjb25zdCB0eXBlPXN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixzeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZnVuY3Rpb24oZXZlbnQpe2NvbnN0IGhhbmRsZXI9dGhpc1tzeW1ib2xdO2lmKGhhbmRsZXIpe2hhbmRsZXIuY2FsbCh0aGlzLGV2ZW50KX19KX07Y29uc3QgY2hhbmdlUmVhZHlTdGF0ZT0oeGhyLHJlYWR5U3RhdGUpPT57eGhyW3hoclJlYWR5U3RhdGVTeW1ib2xdPXJlYWR5U3RhdGU7eGhyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZWFkeXN0YXRlY2hhbmdlIikpfTtsZXQgaXNTZWFsZWQ9dHJ1ZTtjbGFzcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IGV4dGVuZHMgRXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSYmISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIil9ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTdGFydFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblByb2dyZXNzU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uQWJvcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25FcnJvclN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25UaW1lb3V0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uTG9hZEVuZFN5bWJvbCl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdfXNldCBvbmxvYWRzdGFydCh2YWx1ZSl7dGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF09dmFsdWV9Z2V0IG9ucHJvZ3Jlc3MoKXtyZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXX1zZXQgb25wcm9ncmVzcyh2YWx1ZSl7dGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXT12YWx1ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3hock9uQWJvcnRTeW1ib2xdfXNldCBvbmFib3J0KHZhbHVlKXt0aGlzW3hock9uQWJvcnRTeW1ib2xdPXZhbHVlfWdldCBvbmVycm9yKCl7cmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF19c2V0IG9uZXJyb3IodmFsdWUpe3RoaXNbeGhyT25FcnJvclN5bWJvbF09dmFsdWV9Z2V0IG9udGltZW91dCgpe3JldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF19c2V0IG9udGltZW91dCh2YWx1ZSl7dGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdPXZhbHVlfWdldCBvbmxvYWRlbmQoKXtyZXR1cm4gdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdfXNldCBvbmxvYWRlbmQodmFsdWUpe3RoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXT12YWx1ZX19ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfXN1cGVyKCl9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQ9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpYTUxIdHRwUmVxdWVzdFVwbG9hZCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lzU2VhbGVkPWZhbHNlO2NvbnN0IHhoclVwbG9hZD1uZXcgWE1MSHR0cFJlcXVlc3RVcGxvYWQ7aXNTZWFsZWQ9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6bnVsbCx3cml0YWJsZTp0cnVlfSk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclJlYWR5U3RhdGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOnhoclVuc2VudCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVGltZW91dFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6MCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpmYWxzZSx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVXBsb2FkU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVcGxvYWQsd3JpdGFibGU6ZmFsc2V9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZXNwb25zZVR5cGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiIiLHdyaXRhYmxlOnRydWV9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXX1zZXQgb25yZWFkeXN0YXRlY2hhbmdlKHZhbHVlKXt0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF09dmFsdWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXX1vcGVuKG1ldGhvZCx1cmwpe3N3aXRjaCh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKXtjYXNlIHhoclVuc2VudDpjYXNlIHhockRvbmU6e2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJPcGVuZWQpO2JyZWFrfX19c2V0UmVxdWVzdEhlYWRlcihuYW1lLHZhbHVlKXt9c2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKXt9Z2V0IHRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXX1zZXQgdGltZW91dCh2YWx1ZSl7dGhpc1t4aHJUaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgd2l0aENyZWRlbnRpYWxzKCl7cmV0dXJuIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXX1zZXQgd2l0aENyZWRlbnRpYWxzKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJPcGVuZWQ6e2JyZWFrfWRlZmF1bHQ6e3Rocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICd3aXRoQ3JlZGVudGlhbHMnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIFVOU0VOVCBvciBPUEVORUQuIil9fXRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXT0hIXZhbHVlfWdldCB1cGxvYWQoKXtyZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdfXNlbmQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT09PW51bGwpe3RoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdPXNldFRpbWVvdXQoKCk9Pnt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJEb25lKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImVycm9yIikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX0sMCl9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpfX1hYm9ydCgpe2lmKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF09PT14aHJPcGVuZWQmJnRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdIT09bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdKTt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJVbnNlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgiYWJvcnQiKSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJsb2FkZW5kIikpfX1nZXQgcmVzcG9uc2VVUkwoKXtyZXR1cm4iIn1nZXQgc3RhdHVzKCl7cmV0dXJuIDB9Z2V0IHN0YXR1c1RleHQoKXtyZXR1cm4iIn1nZXRSZXNwb25zZUhlYWRlcihuYW1lKXtyZXR1cm4gbnVsbH1vdmVycmlkZU1pbWVUeXBlKG1pbWUpe31nZXQgcmVzcG9uc2VUeXBlKCl7cmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXX1zZXQgcmVzcG9uc2VUeXBlKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJEb25lOnt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAncmVzcG9uc2VUeXBlJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBMT0FESU5HIG9yIERPTkUuIil9fXN3aXRjaCh2YWx1ZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnt0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF09dmFsdWU7YnJlYWt9fX1nZXQgcmVzcG9uc2UoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO3JldHVybiByZXNwb25zZVR5cGU9PT0iInx8cmVzcG9uc2VUeXBlPT09InRleHQiPyIiOm51bGx9Z2V0IHJlc3BvbnNlVGV4dCgpe2NvbnN0IHJlc3BvbnNlVHlwZT10aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07aWYocmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Iil7cmV0dXJuIiJ9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCB0aGUgJ3Jlc3BvbnNlVGV4dCcgcHJvcGVydHkgZnJvbSAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3QncyAncmVzcG9uc2VUeXBlJyBpcyAnJyBvciAndGV4dCcgKHdhcyAnYXJyYXlidWZmZXInKS4iKX19Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiVU5TRU5UIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJVbnNlbnR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyT3BlbmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJIRUFERVJTX1JFQ0VJVkVEIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJIZWFkZXJzUmVjZWl2ZWR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkxPQURJTkciLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockxvYWRpbmd9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkRPTkUiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockRvbmV9KTtleHBvcnRzLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3Qsd3JpdGFibGU6dHJ1ZX19KSgkX19fbW9ja19jZjNlMjY0MWE2YTA1N2RlKTsoZnVuY3Rpb24oKXsoZnVuY3Rpb24oKXt2YXIgbj10aGlzfHxzZWxmLHA9ZnVuY3Rpb24oYSxiKXthPWEuc3BsaXQoIi4iKTt2YXIgYz1uO2FbMF1pbiBjfHwidW5kZWZpbmVkIj09dHlwZW9mIGMuZXhlY1NjcmlwdHx8Yy5leGVjU2NyaXB0KCJ2YXIgIithWzBdKTtmb3IodmFyIGQ7YS5sZW5ndGgmJihkPWEuc2hpZnQoKSk7KWEubGVuZ3RofHx2b2lkIDA9PT1iP2M9Y1tkXSYmY1tkXSE9PU9iamVjdC5wcm90b3R5cGVbZF0/Y1tkXTpjW2RdPXt9OmNbZF09Yn07dmFyIHE9e30scj1mdW5jdGlvbigpe3EuVEFHR0lORz1xLlRBR0dJTkd8fFtdO3EuVEFHR0lOR1sxXT0hMH07dmFyIHQ9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYiliLmhhc093blByb3BlcnR5KGMpJiYoYVtjXT1iW2NdKX0sdj1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXJldHVybiEwO3JldHVybiExfTt2YXIgeD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaTt2YXIgeT13aW5kb3csej1kb2N1bWVudCxBPWZ1bmN0aW9uKGEsYil7ei5hZGRFdmVudExpc3RlbmVyP3ouYWRkRXZlbnRMaXN0ZW5lcihhLGIsITEpOnouYXR0YWNoRXZlbnQmJnouYXR0YWNoRXZlbnQoIm9uIithLGIpfTt2YXIgQj0vOlswLTldKyQvLEM9ZnVuY3Rpb24oYSxiLGMpe2E9YS5zcGxpdCgiJiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLnNwbGl0KCI9Iik7aWYoZGVjb2RlVVJJQ29tcG9uZW50KGVbMF0pLnJlcGxhY2UoL1wrL2csIiAiKT09PWIpcmV0dXJuIGI9ZS5zbGljZSgxKS5qb2luKCI9IiksYz9iOmRlY29kZVVSSUNvbXBvbmVudChiKS5yZXBsYWNlKC9cKy9nLCIgIil9fSxGPWZ1bmN0aW9uKGEsYil7YiYmKGI9U3RyaW5nKGIpLnRvTG93ZXJDYXNlKCkpO2lmKCJwcm90b2NvbCI9PT1ifHwicG9ydCI9PT1iKWEucHJvdG9jb2w9RChhLnByb3RvY29sKXx8RCh5LmxvY2F0aW9uLnByb3RvY29sKTsicG9ydCI9PT1iP2EucG9ydD1TdHJpbmcoTnVtYmVyKGEuaG9zdG5hbWU/YS5wb3J0OnkubG9jYXRpb24ucG9ydCl8fCgiaHR0cCI9PWEucHJvdG9jb2w/ODA6Imh0dHBzIj09YS5wcm90b2NvbD80NDM6IiIpKToiaG9zdCI9PT1iJiYoYS5ob3N0bmFtZT0oYS5ob3N0bmFtZXx8eS5sb2NhdGlvbi5ob3N0bmFtZSkucmVwbGFjZShCLCIiKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gRShhLGIsdm9pZCAwLHZvaWQgMCx2b2lkIDApfSxFPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9RChhLnByb3RvY29sKTtiJiYoYj1TdHJpbmcoYikudG9Mb3dlckNhc2UoKSk7c3dpdGNoKGIpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpkPSIiO2EmJmEuaHJlZiYmKGQ9YS5ocmVmLmluZGV4T2YoIiMiKSxkPTA+ZD9hLmhyZWY6YS5ocmVmLnN1YnN0cigwLGQpKTthPWQ7YnJlYWs7Y2FzZSJwcm90b2NvbCI6YT1mO2JyZWFrO2Nhc2UiaG9zdCI6YT1hLmhvc3RuYW1lLnJlcGxhY2UoQiwiIikudG9Mb3dlckNhc2UoKTtjJiYoZD0vXnd3d1xkKlwuLy5leGVjKGEpKSYmZFswXSYmKGE9YS5zdWJzdHIoZFswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOmE9U3RyaW5nKE51bWJlcihhLnBvcnQpfHwoImh0dHAiPT1mPzgwOiJodHRwcyI9PWY/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjphLnBhdGhuYW1lfHxhLmhvc3RuYW1lfHxyKCk7YT0iLyI9PWEucGF0aG5hbWUuc3Vic3RyKDAsMSk/YS5wYXRobmFtZToiLyIrYS5wYXRobmFtZTthPWEuc3BsaXQoIi8iKTthOmlmKGQ9ZHx8W10sYz1hW2EubGVuZ3RoLTFdLEFycmF5LnByb3RvdHlwZS5pbmRleE9mKWQ9ZC5pbmRleE9mKGMpLGQ9Im51bWJlciI9PXR5cGVvZiBkP2Q6LTE7ZWxzZXtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWlmKGRbZV09PT1jKXtkPWU7YnJlYWsgYX1kPS0xfTA8PWQmJihhW2EubGVuZ3RoLTFdPSIiKTthPWEuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOmE9YS5zZWFyY2gucmVwbGFjZSgiPyIsIiIpO2UmJihhPUMoYSxlLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjphPWEucGF0aG5hbWUuc3BsaXQoIi4iKTthPTE8YS5sZW5ndGg/YVthLmxlbmd0aC0xXToiIjthPWEuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50IjphPWEuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDphPWEmJmEuaHJlZn1yZXR1cm4gYX0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYT9hLnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxHPWZ1bmN0aW9uKGEpe3ZhciBiPXouY3JlYXRlRWxlbWVudCgiYSIpO2EmJihiLmhyZWY9YSk7dmFyIGM9Yi5wYXRobmFtZTsiLyIhPT1jWzBdJiYoYXx8cigpLGM9Ii8iK2MpO2E9Yi5ob3N0bmFtZS5yZXBsYWNlKEIsIiIpO3JldHVybntocmVmOmIuaHJlZixwcm90b2NvbDpiLnByb3RvY29sLGhvc3Q6Yi5ob3N0LGhvc3RuYW1lOmEscGF0aG5hbWU6YyxzZWFyY2g6Yi5zZWFyY2gsaGFzaDpiLmhhc2gscG9ydDpiLnBvcnR9fTtmdW5jdGlvbiBIKCl7Zm9yKHZhciBhPUksYj17fSxjPTA7YzxhLmxlbmd0aDsrK2MpYlthW2NdXT1jO3JldHVybiBifWZ1bmN0aW9uIEooKXt2YXIgYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO2ErPWEudG9Mb3dlckNhc2UoKSsiMDEyMzQ1Njc4OS1fIjtyZXR1cm4gYSsiLiJ9dmFyIEksSztmdW5jdGlvbiBhYShhKXtmdW5jdGlvbiBiKGspe2Zvcig7ZDxhLmxlbmd0aDspe3ZhciBtPWEuY2hhckF0KGQrKyksbD1LW21dO2lmKG51bGwhPWwpcmV0dXJuIGw7aWYoIS9eW1xzXHhhMF0qJC8udGVzdChtKSl0aHJvdyBFcnJvcigiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogIittKX1yZXR1cm4ga31JPUl8fEooKTtLPUt8fEgoKTtmb3IodmFyIGM9IiIsZD0wOzspe3ZhciBlPWIoLTEpLGY9YigwKSxnPWIoNjQpLGg9Yig2NCk7aWYoNjQ9PT1oJiYtMT09PWUpcmV0dXJuIGM7Yys9U3RyaW5nLmZyb21DaGFyQ29kZShlPDwyfGY+PjQpOzY0IT1nJiYoYys9U3RyaW5nLmZyb21DaGFyQ29kZShmPDw0JjI0MHxnPj4yKSw2NCE9aCYmKGMrPVN0cmluZy5mcm9tQ2hhckNvZGUoZzw8NiYxOTJ8aCkpKX19dmFyIEw7dmFyIE49ZnVuY3Rpb24oKXt2YXIgYT1iYSxiPWNhLGM9TSgpLGQ9ZnVuY3Rpb24oZyl7YShnLnRhcmdldHx8Zy5zcmNFbGVtZW50fHx7fSl9LGU9ZnVuY3Rpb24oZyl7YihnLnRhcmdldHx8Zy5zcmNFbGVtZW50fHx7fSl9O2lmKCFjLmluaXQpe0EoIm1vdXNlZG93biIsZCk7QSgia2V5dXAiLGQpO0EoInN1Ym1pdCIsZSk7dmFyIGY9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ7SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtiKHRoaXMpO2YuY2FsbCh0aGlzKX07Yy5pbml0PSEwfX0sTz1mdW5jdGlvbihhLGIsYyxkLGUpe2E9e2NhbGxiYWNrOmEsZG9tYWluczpiLGZyYWdtZW50OjI9PT1jLHBsYWNlbWVudDpjLGZvcm1zOmQsc2FtZUhvc3Q6ZX07TSgpLmRlY29yYXRvcnMucHVzaChhKX0sUD1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPU0oKS5kZWNvcmF0b3JzLGU9e30sZj0wO2Y8ZC5sZW5ndGg7KytmKXt2YXIgZz1kW2ZdLGg7aWYoaD0hY3x8Zy5mb3JtcylhOntoPWcuZG9tYWluczt2YXIgaz1hLG09ISFnLnNhbWVIb3N0O2lmKGgmJihtfHxrIT09ei5sb2NhdGlvbi5ob3N0bmFtZSkpZm9yKHZhciBsPTA7bDxoLmxlbmd0aDtsKyspaWYoaFtsXWluc3RhbmNlb2YgUmVnRXhwKXtpZihoW2xdLnRlc3Qoaykpe2g9ITA7YnJlYWsgYX19ZWxzZSBpZigwPD1rLmluZGV4T2YoaFtsXSl8fG0mJjA8PWhbbF0uaW5kZXhPZihrKSl7aD0hMDticmVhayBhfWg9ITF9aCYmKGg9Zy5wbGFjZW1lbnQsdm9pZCAwPT1oJiYoaD1nLmZyYWdtZW50PzI6MSksaD09PWImJnQoZSxnLmNhbGxiYWNrKCkpKX1yZXR1cm4gZX0sTT1mdW5jdGlvbigpe3ZhciBhPXt9O3ZhciBiPXkuZ29vZ2xlX3RhZ19kYXRhO3kuZ29vZ2xlX3RhZ19kYXRhPXZvaWQgMD09PWI/YTpiO2E9eS5nb29nbGVfdGFnX2RhdGE7Yj1hLmdsO2ImJmIuZGVjb3JhdG9yc3x8KGI9e2RlY29yYXRvcnM6W119LGEuZ2w9Yik7cmV0dXJuIGJ9O3ZhciBkYT0vKC4qPylcKiguKj8pXCooLiopLyxlYT0vKFtePyNdKykoXD9bXiNdKik/KCMuKik/LztmdW5jdGlvbiBRKGEpe3JldHVybiBuZXcgUmVnRXhwKCIoLio/KShefCYpIithKyI9KFteJl0qKSY/KC4qKSIpfXZhciBTPWZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1hW2NdO2lmKHZvaWQgMCE9PWQmJmQ9PT1kJiZudWxsIT09ZCYmIltvYmplY3QgT2JqZWN0XSIhPT1kLnRvU3RyaW5nKCkpe2IucHVzaChjKTt2YXIgZT1iLGY9ZS5wdXNoO2Q9U3RyaW5nKGQpO0k9SXx8SigpO0s9S3x8SCgpO2Zvcih2YXIgZz1bXSxoPTA7aDxkLmxlbmd0aDtoKz0zKXt2YXIgaz1oKzE8ZC5sZW5ndGgsbT1oKzI8ZC5sZW5ndGgsbD1kLmNoYXJDb2RlQXQoaCksdT1rP2QuY2hhckNvZGVBdChoKzEpOjAsdz1tP2QuY2hhckNvZGVBdChoKzIpOjAsZmE9bD4+MjtsPShsJjMpPDw0fHU+PjQ7dT0odSYxNSk8PDJ8dz4+Njt3Jj02MzttfHwodz02NCxrfHwodT02NCkpO2cucHVzaChJW2ZhXSxJW2xdLElbdV0sSVt3XSl9Zi5jYWxsKGUsZy5qb2luKCIiKSl9fWE9Yi5qb2luKCIqIik7cmV0dXJuWyIxIixSKGEpLGFdLmpvaW4oIioiKX0sUj1mdW5jdGlvbihhLGIpe2E9W3dpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LChuZXcgRGF0ZSkuZ2V0VGltZXpvbmVPZmZzZXQoKSx3aW5kb3cubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8d2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSxNYXRoLmZsb29yKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWI/MDpiKSxhXS5qb2luKCIqIik7aWYoIShiPUwpKXtiPUFycmF5KDI1Nik7Zm9yKHZhciBjPTA7MjU2PmM7YysrKXtmb3IodmFyIGQ9YyxlPTA7OD5lO2UrKylkPWQmMT9kPj4+MV4zOTg4MjkyMzg0OmQ+Pj4xO2JbY109ZH19TD1iO2I9NDI5NDk2NzI5NTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWI9Yj4+PjheTFsoYl5hLmNoYXJDb2RlQXQoYykpJjI1NV07cmV0dXJuKChiXi0xKT4+PjApLnRvU3RyaW5nKDM2KX0saWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPUcoeS5sb2NhdGlvbi5ocmVmKSxkPWMuc2VhcmNoLnJlcGxhY2UoIj8iLCIiKTt2YXIgZT1DKGQsIl9nbCIsITApO2IucXVlcnk9VChlfHwiIil8fHt9O2U9RihjLCJmcmFnbWVudCIpO3ZhciBmPWUubWF0Y2goUSgiX2dsIikpO2IuZnJhZ21lbnQ9VChmJiZmWzNdfHwiIil8fHt9O2EmJmhhKGMsZCxlKX19O2Z1bmN0aW9uIFUoYSxiKXtpZihhPVEoYSkuZXhlYyhiKSl7dmFyIGM9YVsyXSxkPWFbNF07Yj1hWzFdO2QmJihiPWIrYytkKX1yZXR1cm4gYn12YXIgaGE9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoZixnKXtmPVUoIl9nbCIsZik7Zi5sZW5ndGgmJihmPWcrZik7cmV0dXJuIGZ9aWYoeS5oaXN0b3J5JiZ5Lmhpc3RvcnkucmVwbGFjZVN0YXRlKXt2YXIgZT1RKCJfZ2wiKTtpZihlLnRlc3QoYil8fGUudGVzdChjKSlhPUYoYSwicGF0aCIpLGI9ZChiLCI/IiksYz1kKGMsIiMiKSx5Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIithK2IrYyl9fSxUPWZ1bmN0aW9uKGEpe3ZhciBiPXZvaWQgMD09PWI/MzpiO3RyeXtpZihhKXthOntmb3IodmFyIGM9MDszPmM7KytjKXt2YXIgZD1kYS5leGVjKGEpO2lmKGQpe3ZhciBlPWQ7YnJlYWsgYX1hPWRlY29kZVVSSUNvbXBvbmVudChhKX1lPXZvaWQgMH1pZihlJiYiMSI9PT1lWzFdKXt2YXIgZj1lWzJdLGc9ZVszXTthOntmb3IoZT0wO2U8YjsrK2UpaWYoZj09PVIoZyxlKSl7dmFyIGg9ITA7YnJlYWsgYX1oPSExfWlmKGgpe2I9e307dmFyIGs9Zz9nLnNwbGl0KCIqIik6W107Zm9yKGc9MDtnPGsubGVuZ3RoO2crPTIpYltrW2ddXT1hYShrW2crMV0pO3JldHVybiBifX19fWNhdGNoKG0pe319O2Z1bmN0aW9uIFYoYSxiLGMsZCl7ZnVuY3Rpb24gZShrKXtrPVUoYSxrKTt2YXIgbT1rLmNoYXJBdChrLmxlbmd0aC0xKTtrJiYiJiIhPT1tJiYoays9IiYiKTtyZXR1cm4gaytofWQ9dm9pZCAwPT09ZD8hMTpkO3ZhciBmPWVhLmV4ZWMoYyk7aWYoIWYpcmV0dXJuIiI7Yz1mWzFdO3ZhciBnPWZbMl18fCIiO2Y9ZlszXXx8IiI7dmFyIGg9YSsiPSIrYjtkP2Y9IiMiK2UoZi5zdWJzdHJpbmcoMSkpOmc9Ij8iK2UoZy5zdWJzdHJpbmcoMSkpO3JldHVybiIiK2MrZytmfWZ1bmN0aW9uIFcoYSxiKXt2YXIgYz0iRk9STSI9PT0oYS50YWdOYW1lfHwiIikudG9VcHBlckNhc2UoKSxkPVAoYiwxLGMpLGU9UChiLDIsYyk7Yj1QKGIsMyxjKTt2KGQpJiYoZD1TKGQpLGM/WCgiX2dsIixkLGEpOlkoIl9nbCIsZCxhLCExKSk7IWMmJnYoZSkmJihjPVMoZSksWSgiX2dsIixjLGEsITApKTtmb3IodmFyIGYgaW4gYiliLmhhc093blByb3BlcnR5KGYpJiZaKGYsYltmXSxhKX1mdW5jdGlvbiBaKGEsYixjLGQpe2lmKGMudGFnTmFtZSl7aWYoImEiPT09Yy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFkoYSxiLGMsZCk7aWYoImZvcm0iPT09Yy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFgoYSxiLGMpfWlmKCJzdHJpbmciPT10eXBlb2YgYylyZXR1cm4gVihhLGIsYyxkKX1mdW5jdGlvbiBZKGEsYixjLGQpe2MuaHJlZiYmKGE9VihhLGIsYy5ocmVmLHZvaWQgMD09PWQ/ITE6ZCkseC50ZXN0KGEpJiYoYy5ocmVmPWEpKX1mdW5jdGlvbiBYKGEsYixjKXtpZihjJiZjLmFjdGlvbil7dmFyIGQ9KGMubWV0aG9kfHwiIikudG9Mb3dlckNhc2UoKTtpZigiZ2V0Ij09PWQpe2Q9Yy5jaGlsZE5vZGVzfHxbXTtmb3IodmFyIGU9ITEsZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgZz1kW2ZdO2lmKGcubmFtZT09PWEpe2cuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYik7ZT0hMDticmVha319ZXx8KGQ9ei5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGQuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYiksYy5hcHBlbmRDaGlsZChkKSl9ZWxzZSJwb3N0Ij09PWQmJihhPVYoYSxiLGMuYWN0aW9uKSx4LnRlc3QoYSkmJihjLmFjdGlvbj1hKSl9fXZhciBiYT1mdW5jdGlvbihhKXt0cnl7YTp7Zm9yKHZhciBiPTEwMDthJiYwPGI7KXtpZihhLmhyZWYmJmEubm9kZU5hbWUubWF0Y2goL15hKD86cmVhKT8kL2kpKXt2YXIgYz1hO2JyZWFrIGF9YT1hLnBhcmVudE5vZGU7Yi0tfWM9bnVsbH1pZihjKXt2YXIgZD1jLnByb3RvY29sOyJodHRwOiIhPT1kJiYiaHR0cHM6IiE9PWR8fFcoYyxjLmhvc3RuYW1lKX19Y2F0Y2goZSl7fX0sY2E9ZnVuY3Rpb24oYSl7dHJ5e2lmKGEuYWN0aW9uKXt2YXIgYj1GKEcoYS5hY3Rpb24pLCJob3N0Iik7VyhhLGIpfX1jYXRjaChjKXt9fTtwKCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuYXV0byIsZnVuY3Rpb24oYSxiLGMsZCl7TigpO08oYSxiLCJmcmFnbWVudCI9PT1jPzI6MSwhIWQsITEpfSk7cCgiZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLnBhc3N0aHJvdWdoIixmdW5jdGlvbihhLGIsYyl7TigpO08oYSxbRSh5LmxvY2F0aW9uLCJob3N0IiwhMCldLGIsISFjLCEwKX0pO3AoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24oYSxiLGMpe2E9UyhhKTtyZXR1cm4gWigiX2dsIixhLGIsISFjKX0pO3AoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZW5lcmF0ZSIsUyk7cCgiZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLmdldCIsZnVuY3Rpb24oYSxiKXt2YXIgYz1pYSghIWIpO2I9TSgpO2IuZGF0YXx8KGIuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LGMoYi5kYXRhKSk7Yz17fTtpZihiPWIuZGF0YSl0KGMsYi5xdWVyeSksYSYmdChjLGIuZnJhZ21lbnQpO3JldHVybiBjfSl9KSh3aW5kb3cpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIExhKGEpe3ZhciBiPTEsYztpZihhKWZvcihiPTAsYz1hLmxlbmd0aC0xOzA8PWM7Yy0tKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7Yj0oYjw8NiYyNjg0MzU0NTUpK2QrKGQ8PDE0KTtkPWImMjY2MzM4MzA0O2I9MCE9ZD9iXmQ+PjIxOmJ9cmV0dXJuIGJ9dmFyICRjPWZ1bmN0aW9uKGEpe3RoaXMuQz1hfHxbXX07JGMucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXt0aGlzLkNbYV09ITB9OyRjLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj0wO2I8dGhpcy5DLmxlbmd0aDtiKyspdGhpcy5DW2JdJiYoYVtNYXRoLmZsb29yKGIvNildXj0xPDxiJTYpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyIuY2hhckF0KGFbYl18fDApO3JldHVybiBhLmpvaW4oIiIpKyJ+In07dmFyIGhhPXdpbmRvdy5Hb29nbGVBbmFseXRpY3NPYmplY3Qsd2E7aWYod2E9dm9pZCAwIT1oYSl3YT0tMTwoaGEuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpO3ZhciB5YTtpZih5YT13YSl7dmFyIGZjPXdpbmRvdy5Hb29nbGVBbmFseXRpY3NPYmplY3Q7eWE9ZmM/ZmMucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIifXZhciBnYj15YXx8ImdhIixqZD0vXig/OnV0bWFcLik/XGQrXC5cZCskLyxrZD0vXmFtcC1bXHcuLV17MjIsNjR9JC8sQmE9ITE7dmFyIHZkPW5ldyAkYztmdW5jdGlvbiBKKGEpe3ZkLnNldChhKX12YXIgVGQ9ZnVuY3Rpb24oYSl7YT1EZChhKTthPW5ldyAkYyhhKTtmb3IodmFyIGI9dmQuQy5zbGljZSgpLGM9MDtjPGEuQy5sZW5ndGg7YysrKWJbY109YltjXXx8YS5DW2NdO3JldHVybiBuZXcgJGMoYikuZW5jb2RlKCl9LERkPWZ1bmN0aW9uKGEpe2E9YS5nZXQoR2QpO2thKGEpfHwoYT1bXSk7cmV0dXJuIGF9O3ZhciBlYT1mdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYX0sa2E9ZnVuY3Rpb24oYSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdChhKSl9LHFhPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPWEmJi0xPChhLmNvbnN0cnVjdG9yKyIiKS5pbmRleE9mKCJTdHJpbmciKX0sRD1mdW5jdGlvbihhLGIpe3JldHVybiAwPT1hLmluZGV4T2YoYil9LHNhPWZ1bmN0aW9uKGEpe3JldHVybiBhP2EucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIifSxyYT1mdW5jdGlvbigpe2Zvcih2YXIgYT1PLm5hdmlnYXRvci51c2VyQWdlbnQrKE0uY29va2llP00uY29va2llOiIiKSsoTS5yZWZlcnJlcj9NLnJlZmVycmVyOiIiKSxiPWEubGVuZ3RoLGM9Ty5oaXN0b3J5Lmxlbmd0aDswPGM7KWErPWMtLV5iKys7cmV0dXJuW2hkKCleTGEoYSkmMjE0NzQ4MzY0NyxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX0sdGE9ZnVuY3Rpb24oYSl7dmFyIGI9TS5jcmVhdGVFbGVtZW50KCJpbWciKTtiLndpZHRoPTE7Yi5oZWlnaHQ9MTtiLnNyYz1hO3JldHVybiBifSx1YT1mdW5jdGlvbigpe30sSz1mdW5jdGlvbihhKXtpZihlbmNvZGVVUklDb21wb25lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbilyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGEpO0ooMjgpO3JldHVybiBhfSxMPWZ1bmN0aW9uKGEsYixjLGQpe3RyeXthLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKGIsYywhIWQpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitiLGMpfWNhdGNoKGUpe0ooMjcpfX0sZj0vXltcd1wtOi8uPz0mJSFcW1xdXSskLyxOZD0vXltcdysvXy1dK1s9XXswLDJ9JC8sZmY9bnVsbCxJZD1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKCFmZil7ZmY9e2NyZWF0ZVNjcmlwdFVSTDpmdW5jdGlvbihjYSl7cmV0dXJuIGNhfSxjcmVhdGVIVE1MOmZ1bmN0aW9uKGNhKXtyZXR1cm4gY2F9fTt0cnl7ZmY9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLGZmKX1jYXRjaChjYSl7fX1pZihhKXt2YXIgZz1NLnF1ZXJ5U2VsZWN0b3ImJk0ucXVlcnlTZWxlY3Rvcigic2NyaXB0W25vbmNlXSIpfHxudWxsO2c9Zz9nLm5vbmNlfHxnLmdldEF0dHJpYnV0ZSYmZy5nZXRBdHRyaWJ1dGUoIm5vbmNlIil8fCIiOiIiO2M/KGU9ZD0iIixiJiZmLnRlc3QoYikmJihkPScgaWQ9IicrYisnIicpLGcmJk5kLnRlc3QoZykmJihlPScgbm9uY2U9IicrZysnIicpLGYudGVzdChhKSYmTS53cml0ZShmZi5jcmVhdGVIVE1MKCI8c2NyaXB0IitkK2UrJyBzcmM9IicrYSsnIj48XC9zY3JpcHQ+JykpKTooYz1NLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGMudHlwZT0idGV4dC9qYXZhc2NyaXB0IixjLmFzeW5jPSEwLGMuc3JjPWZmLmNyZWF0ZVNjcmlwdFVSTChhKSxkJiYoYy5vbmxvYWQ9ZCksZSYmKGMub25lcnJvcj1lKSxiJiYoYy5pZD1iKSxnJiZjLnNldEF0dHJpYnV0ZSgibm9uY2UiLGcpLGE9TS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF0sYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjLGEpKX19LGJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEUoTS5sb2NhdGlvbltiPyJocmVmIjoic2VhcmNoIl0sYSl9LEU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT1hLm1hdGNoKCIoPzomfCN8XFw/KSIrSyhiKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09YS5sZW5ndGg/YVsxXToiIn0seGE9ZnVuY3Rpb24oKXt2YXIgYT0iIitNLmxvY2F0aW9uLmhvc3RuYW1lO3JldHVybiAwPT1hLmluZGV4T2YoInd3dy4iKT9hLnN1YnN0cmluZyg0KTphfSxkZT1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaW5kZXhPZihiKTtpZig1PT1jfHw2PT1jKWlmKGE9YS5jaGFyQXQoYytiLmxlbmd0aCksIi8iPT1hfHwiPyI9PWF8fCIiPT1hfHwiOiI9PWEpcmV0dXJuITA7cmV0dXJuITF9LHphPWZ1bmN0aW9uKGEsYil7aWYoMT09Yi5sZW5ndGgmJm51bGwhPWJbMF0mJiJvYmplY3QiPT09dHlwZW9mIGJbMF0pcmV0dXJuIGJbMF07Zm9yKHZhciBjPXt9LGQ9TWF0aC5taW4oYS5sZW5ndGgrMSxiLmxlbmd0aCksZT0wO2U8ZDtlKyspaWYoIm9iamVjdCI9PT10eXBlb2YgYltlXSl7Zm9yKHZhciBnIGluIGJbZV0pYltlXS5oYXNPd25Qcm9wZXJ0eShnKSYmKGNbZ109YltlXVtnXSk7YnJlYWt9ZWxzZSBlPGEubGVuZ3RoJiYoY1thW2VdXT1iW2VdKTtyZXR1cm4gY30sRWU9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihiPT1hW2NdKXJldHVybiEwO3JldHVybiExfTt2YXIgZWU9ZnVuY3Rpb24oKXt0aGlzLm9hPVtdO3RoaXMuZWE9e307dGhpcy5tPXt9fTtlZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYixjKXt0aGlzLm9hLnB1c2goYSk7Yz90aGlzLm1bIjoiK2FdPWI6dGhpcy5lYVsiOiIrYV09Yn07ZWUucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tLmhhc093blByb3BlcnR5KCI6IithKT90aGlzLm1bIjoiK2FdOnRoaXMuZWFbIjoiK2FdfTtlZS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5vYS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLm9hW2JdLGQ9dGhpcy5nZXQoYyk7ZCYmYShjLGQpfX07dmFyIE89d2luZG93LE09ZG9jdW1lbnQsdmE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gc2V0VGltZW91dChhLGIpfTt2YXIgUWE9d2luZG93LFphPWRvY3VtZW50LEc9ZnVuY3Rpb24oYSl7dmFyIGI9UWEuX2dhVXNlclByZWZzO2lmKGImJmIuaW9vJiZiLmlvbygpfHxhJiYhMD09PVFhWyJnYS1kaXNhYmxlLSIrYV0pcmV0dXJuITA7dHJ5e3ZhciBjPVFhLmV4dGVybmFsO2lmKGMmJmMuX2dhVXNlclByZWZzJiYib28iPT1jLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaChnKXt9YT1bXTtiPVN0cmluZyhaYS5jb29raWUpLnNwbGl0KCI7Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5zcGxpdCgiPSIpLGU9ZFswXS5yZXBsYWNlKC9eXHMqfFxzKiQvZywiIik7ZSYmIkFNUF9UT0tFTiI9PWUmJigoZD1kLnNsaWNlKDEpLmpvaW4oIj0iKS5yZXBsYWNlKC9eXHMqfFxzKiQvZywiIikpJiYoZD1kZWNvZGVVUklDb21wb25lbnQoZCkpLGEucHVzaChkKSl9Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylpZigiJE9QVF9PVVQiPT1hW2JdKXJldHVybiEwO3JldHVybiBaYS5nZXRFbGVtZW50QnlJZCgiX19nYU9wdE91dEV4dGVuc2lvbiIpPyEwOiExfTt2YXIgQ2E9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1NLmNvb2tpZS5zcGxpdCgiOyIpO2E9bmV3IFJlZ0V4cCgiXlxccyoiK2ErIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLm1hdGNoKGEpO2UmJmIucHVzaChlWzFdKX1yZXR1cm4gYn0semM9ZnVuY3Rpb24oYSxiLGMsZCxlLGcsY2Epe2U9RyhlKT8hMTplYi50ZXN0KE0ubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PWMmJnZjLnRlc3QoZCk/ITE6ITA7aWYoIWUpcmV0dXJuITE7YiYmMTIwMDxiLmxlbmd0aCYmKGI9Yi5zdWJzdHJpbmcoMCwxMjAwKSk7Yz1hKyI9IitiKyI7IHBhdGg9IitjKyI7ICI7ZyYmKGMrPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrZykudG9HTVRTdHJpbmcoKSsiOyAiKTtkJiYibm9uZSIhPT1kJiYoYys9ImRvbWFpbj0iK2QrIjsiKTtjYSYmKGMrPWNhKyI7Iik7ZD1NLmNvb2tpZTtNLmNvb2tpZT1jO2lmKCEoZD1kIT1NLmNvb2tpZSkpYTp7YT1DYShhKTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGI9PWFbZF0pe2Q9ITA7YnJlYWsgYX1kPSExfXJldHVybiBkfSxDYz1mdW5jdGlvbihhKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50P2VuY29kZVVSSUNvbXBvbmVudChhKS5yZXBsYWNlKC9cKC9nLCIlMjgiKS5yZXBsYWNlKC9cKS9nLCIlMjkiKTphfSx2Yz0vXih3d3dcLik/Z29vZ2xlKFwuY29tPyk/KFwuW2Etel17Mn0pPyQvLGViPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pO3ZhciBPZT1mdW5jdGlvbihhKXt2YXIgYj1bXSxjPU0uY29va2llLnNwbGl0KCI7Iik7YT1uZXcgUmVnRXhwKCJeXFxzKiIrKGF8fCJfZ2FjIikrIl8oVUEtXFxkKy1cXGQrKT1cXHMqKC4rPylcXHMqJCIpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLm1hdGNoKGEpO2UmJmIucHVzaCh7amE6ZVsxXSx2YWx1ZTplWzJdLHRpbWVzdGFtcDpOdW1iZXIoZVsyXS5zcGxpdCgiLiIpWzFdKXx8MH0pfWIuc29ydChmdW5jdGlvbihnLGNhKXtyZXR1cm4gY2EudGltZXN0YW1wLWcudGltZXN0YW1wfSk7cmV0dXJuIGJ9O2Z1bmN0aW9uIGRmKGEsYixjKXtiPU9lKGIpO3ZhciBkPXt9O2lmKCFifHwhYi5sZW5ndGgpcmV0dXJuIGQ7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBnPWJbZV0udmFsdWUuc3BsaXQoIi4iKTtpZigiMSIhPT1nWzBdfHxjJiYzPmcubGVuZ3RofHwhYyYmMyE9PWcubGVuZ3RoKWEmJihhLm5hPSEwKTtlbHNlIGlmKE51bWJlcihnWzFdKSl7ZFtiW2VdLmphXT9hJiYoYS5wYT0hMCk6ZFtiW2VdLmphXT1bXTt2YXIgY2E9e3ZlcnNpb246Z1swXSx0aW1lc3RhbXA6MWUzKk51bWJlcihnWzFdKSxxYTpnWzJdfTtjJiYzPGcubGVuZ3RoJiYoY2EubGFiZWxzPWcuc2xpY2UoMykpO2RbYltlXS5qYV0ucHVzaChjYSl9fXJldHVybiBkfXZhciBGYSxHYSxmYixBYixqYT0vXmh0dHBzPzpcL1wvW14vXSpjZG5cLmFtcHByb2plY3RcLm9yZ1wvLyxVZT0vXig/Ond3d1wufG1cLnxhbXBcLikrLyxVYj1bXSxkYT1mdW5jdGlvbihhKXtpZih5ZShhW0tkXSkpe2lmKHZvaWQgMD09PUFiKXt2YXIgYjtpZihiPShiPURlLmdldCgpKSYmYi5fZ2F8fHZvaWQgMClBYj1iLEooODEpfWlmKHZvaWQgMCE9PUFiKXJldHVybiBhW1FdfHwoYVtRXT1BYiksITF9aWYoYVtLZF0pe0ooNjcpO2lmKGFbYWNdJiYiY29va2llIiE9YVthY10pcmV0dXJuITE7aWYodm9pZCAwIT09QWIpYVtRXXx8KGFbUV09QWIpO2Vsc2V7YTp7Yj1TdHJpbmcoYVtXXXx8eGEoKSk7dmFyIGM9U3RyaW5nKGFbWWJdfHwiLyIpLGQ9Q2EoU3RyaW5nKGFbVV18fCJfZ2EiKSk7Yj1uYShkLGIsYyk7aWYoIWJ8fGpkLnRlc3QoYikpYj0hMDtlbHNlIGlmKGI9Q2EoIkFNUF9UT0tFTiIpLDA9PWIubGVuZ3RoKWI9ITA7ZWxzZXtpZigxPT1iLmxlbmd0aCYmKGI9ZGVjb2RlVVJJQ29tcG9uZW50KGJbMF0pLCIkUkVUUklFVklORyI9PWJ8fCIkT1BUX09VVCI9PWJ8fCIkRVJST1IiPT1ifHwiJE5PVF9GT1VORCI9PWIpKXtiPSEwO2JyZWFrIGF9Yj0hMX19aWYoYiYmdGMoaWMsU3RyaW5nKGFbTmFdKSkpcmV0dXJuITB9fXJldHVybiExfSxpYz1mdW5jdGlvbigpe1ouRChbdWFdKX0sdGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1DYSgiQU1QX1RPS0VOIik7aWYoMTxjLmxlbmd0aClyZXR1cm4gSig1NSksITE7Yz1kZWNvZGVVUklDb21wb25lbnQoY1swXXx8IiIpO2lmKCIkT1BUX09VVCI9PWN8fCIkRVJST1IiPT1jfHxHKGIpKXJldHVybiBKKDYyKSwhMTtpZighamEudGVzdChNLnJlZmVycmVyKSYmIiROT1RfRk9VTkQiPT1jKXJldHVybiBKKDY4KSwhMTtpZih2b2lkIDAhPT1BYilyZXR1cm4gSig1NiksdmEoZnVuY3Rpb24oKXthKEFiKX0sMCksITA7aWYoRmEpcmV0dXJuIFViLnB1c2goYSksITA7aWYoIiRSRVRSSUVWSU5HIj09YylyZXR1cm4gSig1NyksdmEoZnVuY3Rpb24oKXt0YyhhLGIpfSwxZTQpLCEwO0ZhPSEwO2MmJiIkIiE9Y1swXXx8KHhjKCIkUkVUUklFVklORyIsM2U0KSxzZXRUaW1lb3V0KE1jLDNlNCksYz0iIik7cmV0dXJuIFBjKGMsYik/KFViLnB1c2goYSksITApOiExfSxQYz1mdW5jdGlvbihhLGIsYyl7aWYoIXdpbmRvdy5KU09OKXJldHVybiBKKDU4KSwhMTt2YXIgZD1PLlhNTEh0dHBSZXF1ZXN0O2lmKCFkKXJldHVybiBKKDU5KSwhMTt2YXIgZT1uZXcgZDtpZighKCJ3aXRoQ3JlZGVudGlhbHMiaW4gZSkpcmV0dXJuIEooNjApLCExO2Uub3BlbigiUE9TVCIsKGN8fCJodHRwczovL2FtcGNpZC5nb29nbGUuY29tL3YxL3B1Ymxpc2hlcjpnZXRDbGllbnRJZCIpKyI/a2V5PUFJemFTeUE2NWxFSFVFaXpJc050bGJOby1sMksxOGRUNjgwbnNhTSIsITApO2Uud2l0aENyZWRlbnRpYWxzPSEwO2Uuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwidGV4dC9wbGFpbiIpO2Uub25sb2FkPWZ1bmN0aW9uKCl7RmE9ITE7aWYoND09ZS5yZWFkeVN0YXRlKXt0cnl7MjAwIT1lLnN0YXR1cyYmKEooNjEpLFFjKCIiLCIkRVJST1IiLDNlNCkpO3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpO2cub3B0T3V0PyhKKDYzKSxRYygiIiwiJE9QVF9PVVQiLDMxNTM2ZTYpKTpnLmNsaWVudElkP1FjKGcuY2xpZW50SWQsZy5zZWN1cml0eVRva2VuLDMxNTM2ZTYpOiFjJiZnLmFsdGVybmF0ZVVybD8oR2EmJmNsZWFyVGltZW91dChHYSksRmE9ITAsUGMoYSxiLGcuYWx0ZXJuYXRlVXJsKSk6KEooNjQpLFFjKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2goY2Epe0ooNjUpLFFjKCIiLCIkRVJST1IiLDNlNCl9ZT1udWxsfX07ZD17b3JpZ2luU2NvcGU6IkFNUF9FQ0lEX0dPT0dMRSJ9O2EmJihkLnNlY3VyaXR5VG9rZW49YSk7ZS5zZW5kKEpTT04uc3RyaW5naWZ5KGQpKTtHYT12YShmdW5jdGlvbigpe0ooNjYpO1FjKCIiLCIkRVJST1IiLDNlNCl9LDFlNCk7cmV0dXJuITB9LE1jPWZ1bmN0aW9uKCl7RmE9ITF9LHhjPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09ZmIpe2ZiPSIiO2Zvcih2YXIgYz1pZCgpLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtpZih6YygiQU1QX1RPS0VOIixlbmNvZGVVUklDb21wb25lbnQoYSksIi8iLGUsIiIsYikpe2ZiPWU7cmV0dXJufX19emMoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KGEpLCIvIixmYiwiIixiKX0sUWM9ZnVuY3Rpb24oYSxiLGMpe0dhJiZjbGVhclRpbWVvdXQoR2EpO2ImJnhjKGIsYyk7QWI9YTtiPVViO1ViPVtdO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXShhKX0seWU9ZnVuY3Rpb24oYSl7YTp7aWYoamEudGVzdChNLnJlZmVycmVyKSl7dmFyIGI9TS5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKFVlLCIiKTtiOnt2YXIgYz1NLnJlZmVycmVyO2M9Yy5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKTt2YXIgZD1jLnJlcGxhY2UoL15bXi9dKy8sIiIpLnNwbGl0KCIvIiksZT1kWzJdO2Q9KGQ9InMiPT1lP2RbM106ZSk/ZGVjb2RlVVJJQ29tcG9uZW50KGQpOmQ7aWYoIWQpe2lmKDA9PWMuaW5kZXhPZigieG4tLSIpKXtjPSIiO2JyZWFrIGJ9KGM9Yy5tYXRjaCgvKC4qKVwuY2RuXC5hbXBwcm9qZWN0XC5vcmdcLz8kLykpJiYyPT1jLmxlbmd0aCYmKGQ9Y1sxXS5yZXBsYWNlKC8tL2csIi4iKS5yZXBsYWNlKC9cLlwuL2csIi0iKSl9Yz1kP2QucmVwbGFjZShVZSwiIik6IiJ9KGQ9Yj09PWMpfHwoYz0iLiIrYyxkPWIuc3Vic3RyaW5nKGIubGVuZ3RoLWMubGVuZ3RoLGIubGVuZ3RoKT09PWMpO2lmKGQpe2I9ITA7YnJlYWsgYX1lbHNlIEooNzgpfWI9ITF9cmV0dXJuIGImJiExIT09YX07dmFyIGJkPWZ1bmN0aW9uKGEpe3JldHVybihhPyJodHRwczoiOkJhfHwiaHR0cHM6Ij09TS5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxHZT1mdW5jdGlvbihhKXtzd2l0Y2goYSl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX0sRGE9ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPSJsZW4iO3RoaXMubWVzc2FnZT1hKyItODE5MiJ9LGJhPWZ1bmN0aW9uKGEsYixjKXtjPWN8fHVhO2lmKDIwMzY+PWIubGVuZ3RoKXdjKGEsYixjKTtlbHNlIGlmKDgxOTI+PWIubGVuZ3RoKXgoYSxiLGMpfHx3ZChhLGIsYyl8fHdjKGEsYixjKTtlbHNlIHRocm93IGdlKCJsZW4iLGIubGVuZ3RoKSxuZXcgRGEoYi5sZW5ndGgpfSxwZT1mdW5jdGlvbihhLGIsYyxkKXtkPWR8fHVhO3dkKGErIj8iK2IsIiIsZCxjKX0sd2M9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRhKGErIj8iK2IpO2Qub25sb2FkPWQub25lcnJvcj1mdW5jdGlvbigpe2Qub25sb2FkPW51bGw7ZC5vbmVycm9yPW51bGw7YygpfX0sd2Q9ZnVuY3Rpb24oYSxiLGMsZCl7Y29uc3QgJF9fX29sZF9iZWI3MWExZDM1YzIzNWFiPXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2lmKCRfX19vbGRfYmViNzFhMWQzNWMyMzVhYikoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19tb2NrX2NmM2UyNjQxYTZhMDU3ZGUuWE1MSHR0cFJlcXVlc3QpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPU8uWE1MSHR0cFJlcXVlc3Q7aWYoIWUpcmV0dXJuITE7dmFyIGc9bmV3IGU7aWYoISgid2l0aENyZWRlbnRpYWxzImluIGcpKXJldHVybiExO2E9YS5yZXBsYWNlKC9eaHR0cDovLCJodHRwczoiKTtnLm9wZW4oIlBPU1QiLGEsITApO2cud2l0aENyZWRlbnRpYWxzPSEwO2cuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwidGV4dC9wbGFpbiIpO2cub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09Zy5yZWFkeVN0YXRlKXtpZihkJiYidGV4dC9wbGFpbiI9PT1nLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSl0cnl7RWEoZCxnLnJlc3BvbnNlVGV4dCxjKX1jYXRjaChjYSl7Z2UoInhociIsInJzcCIpLGMoKX1lbHNlIGMoKTtnPW51bGx9fTtnLnNlbmQoYik7cmV0dXJuITB9LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2lmKCRfX19vbGRfYmViNzFhMWQzNWMyMzVhYikoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19vbGRfYmViNzFhMWQzNWMyMzVhYil9fSxFYT1mdW5jdGlvbihhLGIsYyl7aWYoMT5iLmxlbmd0aClnZSgieGhyIiwidmVyIiwiMCIpLGMoKTtlbHNlIGlmKDM8YS5jb3VudCsrKWdlKCJ4aHIiLCJ0bXIiLCIiK2EuY291bnQpLGMoKTtlbHNle3ZhciBkPWIuY2hhckF0KDApO2lmKCIxIj09PWQpb2MoYSxiLnN1YnN0cmluZygxKSxjKTtlbHNlIGlmKGEuViYmIjIiPT09ZCl7dmFyIGU9Yi5zdWJzdHJpbmcoMSkuc3BsaXQoIiwiKSxnPTA7Yj1mdW5jdGlvbigpeysrZz09PWUubGVuZ3RoJiZjKCl9O2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspb2MoYSxlW2RdLGIpfWVsc2UgZ2UoInhociIsInZlciIsU3RyaW5nKGIubGVuZ3RoKSksYygpfX0sb2M9ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1iLmxlbmd0aCljKCk7ZWxzZXt2YXIgZD1iLmNoYXJBdCgwKTtzd2l0Y2goZCl7Y2FzZSJkIjpwZSgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLGEuVSxhLGMpO2JyZWFrO2Nhc2UiZyI6d2MoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLCJjb20iKSxhLmdvb2dsZSxjKTsoYj1iLnN1YnN0cmluZygxKSkmJigvXlthLXouXXsxLDZ9JC8udGVzdChiKT93YygiaHR0cHM6Ly93d3cuZ29vZ2xlLiUvYWRzL2dhLWF1ZGllbmNlcyIucmVwbGFjZSgiJSIsYiksYS5nb29nbGUsdWEpOmdlKCJ0bGQiLCJiY2MiLGIpKTticmVhaztjYXNlIkciOmlmKGEuVil7YS5WKCJHLSIrYi5zdWJzdHJpbmcoMSkpO2MoKTticmVha31jYXNlIngiOmlmKGEuVil7YS5WKCk7YygpO2JyZWFrfWRlZmF1bHQ6Z2UoInhociIsImJyYyIsZCksYygpfX19LHg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBPLm5hdmlnYXRvci5zZW5kQmVhY29uP08ubmF2aWdhdG9yLnNlbmRCZWFjb24oYSxiKT8oYygpLCEwKTohMTohMX0sZ2U9ZnVuY3Rpb24oYSxiLGMpezE8PTEwMCpNYXRoLnJhbmRvbSgpfHxHKCI/Iil8fChhPVsidD1lcnJvciIsIl9lPSIrYSwiX3Y9ajkyIiwic3I9MSJdLGImJmEucHVzaCgiX2Y9IitiKSxjJiZhLnB1c2goIl9tPSIrSyhjLnN1YnN0cmluZygwLDEwMCkpKSxhLnB1c2goImFpcD0xIiksYS5wdXNoKCJ6PSIraGQoKSksd2MoYmQoITApKyIvdS9kIixhLmpvaW4oIiYiKSx1YSkpfTt2YXIgcWM9ZnVuY3Rpb24oKXtyZXR1cm4gTy5nYURhdGE9Ty5nYURhdGF8fHt9fSxoPWZ1bmN0aW9uKGEpe3ZhciBiPXFjKCk7cmV0dXJuIGJbYV09YlthXXx8e319O3ZhciBIYT1mdW5jdGlvbigpe3RoaXMuTT1bXX07SGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhKXt0aGlzLk0ucHVzaChhKX07SGEucHJvdG90eXBlLkQ9ZnVuY3Rpb24oYSl7dHJ5e2Zvcih2YXIgYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspe3ZhciBjPWEuZ2V0KHRoaXMuTVtiXSk7YyYmZWEoYykmJmMuY2FsbChPLGEpfX1jYXRjaChkKXt9Yj1hLmdldChJYSk7YiE9dWEmJmVhKGIpJiYoYS5zZXQoSWEsdWEsITApLHNldFRpbWVvdXQoYiwxMCkpfTtmdW5jdGlvbiBKYShhKXtpZigxMDAhPWEuZ2V0KEthKSYmTGEoUChhLFEpKSUxZTQ+PTEwMCpSKGEsS2EpKXRocm93ImFib3J0In1mdW5jdGlvbiBNYShhKXtpZihHKFAoYSxOYSkpKXRocm93ImFib3J0In1mdW5jdGlvbiBPYSgpe3ZhciBhPU0ubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9YSYmImh0dHBzOiIhPWEpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFBhKGEpe3RyeXtPLm5hdmlnYXRvci5zZW5kQmVhY29uP0ooNDIpOk8uWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IE8uWE1MSHR0cFJlcXVlc3QmJkooNDApfWNhdGNoKGMpe31hLnNldChsZCxUZChhKSwhMCk7YS5zZXQoQWMsUihhLEFjKSsxKTt2YXIgYj1bXTt1ZS5tYXAoZnVuY3Rpb24oYyxkKXtkLkYmJihjPWEuZ2V0KGMpLHZvaWQgMCE9YyYmYyE9ZC5kZWZhdWx0VmFsdWUmJigiYm9vbGVhbiI9PXR5cGVvZiBjJiYoYyo9MSksYi5wdXNoKGQuRisiPSIrSygiIitjKSkpKX0pOyExPT09YS5nZXQoeGUpJiZiLnB1c2goIm5wYT0xIik7Yi5wdXNoKCJ6PSIrQmQoKSk7YS5zZXQoUmEsYi5qb2luKCImIiksITApfWZ1bmN0aW9uIFNhKGEpe3ZhciBiPVAoYSxmYSk7IWImJmEuZ2V0KFZkKSYmKGI9ImJlYWNvbiIpO3ZhciBjPVAoYSxnZCksZD1QKGEsb2UpLGU9Y3x8KGR8fGJkKCExKSsiIikrIi9jb2xsZWN0Ijtzd2l0Y2goUChhLGFkKSl7Y2FzZSJkIjplPWN8fChkfHxiZCghMSkrIiIpKyIvai9jb2xsZWN0IjtiPWEuZ2V0KHFlKXx8dm9pZCAwO3BlKGUsUChhLFJhKSxiLGEuWihJYSkpO2JyZWFrO2RlZmF1bHQ6Yj8oYz1QKGEsUmEpLGQ9KGQ9YS5aKElhKSl8fHVhLCJpbWFnZSI9PWI/d2MoZSxjLGQpOiJ4aHIiPT1iJiZ3ZChlLGMsZCl8fCJiZWFjb24iPT1iJiZ4KGUsYyxkKXx8YmEoZSxjLGQpKTpiYShlLFAoYSxSYSksYS5aKElhKSl9ZT1QKGEsTmEpO2U9aChlKTtiPWUuaGl0Y291bnQ7ZS5oaXRjb3VudD1iP2IrMToxO2UuZmlyc3RfaGl0fHwoZS5maXJzdF9oaXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2U9UChhLE5hKTtkZWxldGUgaChlKS5wZW5kaW5nX2V4cGVyaW1lbnRzO2Euc2V0KElhLHVhLCEwKX1mdW5jdGlvbiBIYyhhKXtxYygpLmV4cElkJiZhLnNldChOYyxxYygpLmV4cElkKTtxYygpLmV4cFZhciYmYS5zZXQoT2MscWMoKS5leHBWYXIpO3ZhciBiPVAoYSxOYSk7aWYoYj1oKGIpLnBlbmRpbmdfZXhwZXJpbWVudHMpe3ZhciBjPVtdO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChkKSsiLiIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pKTt2YXIgZD1jLmpvaW4oIiEiKX1lbHNlIGQ9dm9pZCAwO2QmJigoYj1hLmdldChtKSkmJihkPWIrIiEiK2QpLGEuc2V0KG0sZCwhMCkpfWZ1bmN0aW9uIGNkKCl7aWYoTy5uYXZpZ2F0b3ImJiJwcmV2aWV3Ij09Ty5uYXZpZ2F0b3IubG9hZFB1cnBvc2UpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIHlkKGEpe3ZhciBiPU8uZ2FEZXZJZHN8fFtdO2lmKGthKGIpKXt2YXIgYz1hLmdldCgiJmRpZCIpO3FhKGMpJiYwPGMubGVuZ3RoJiYoYj1iLmNvbmNhdChjLnNwbGl0KCIsIikpKTtjPVtdO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKUVlKGMsYltkXSl8fGMucHVzaChiW2RdKTswIT1jLmxlbmd0aCYmYS5zZXQoIiZkaWQiLGMuam9pbigiLCIpLCEwKX19ZnVuY3Rpb24gdmIoYSl7aWYoIWEuZ2V0KE5hKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gUGUoYSl7dHJ5e2lmKCFhLmdldChRZSkmJihhLnNldChRZSwhMCksIWEuZ2V0KCImZ3RtIikpKXt2YXIgYj0hMSxjPU8ubG9jYXRpb24uc2VhcmNoLnNwbGl0KCI/IilbMV07YyYmRWUoYy5zcGxpdCgiJiIpLCJndG1fZGVidWc9eCIpJiYoYj0hMCk7IWImJkQoTS5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKSYmKGI9ITApOyFiJiZFZShNLmNvb2tpZS5zcGxpdCgiOyAiKSwiX19UQUdfQVNTSVNUQU5UPXgiKSYmKGI9ITApOyFiJiZPLl9fVEFHX0FTU0lTVEFOVF9BUEkmJihiPSEwKTtpZihiKXtPWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoT1siZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxJZCgiaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vZGVidWcvYm9vdHN0cmFwIikpO3ZhciBkPU0uY3VycmVudFNjcmlwdDtPWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdLnB1c2goe21lc3NhZ2VUeXBlOiJMRUdBQ1lfQ09OVEFJTkVSX1NUQVJUSU5HIixkYXRhOntpZDphLmdldChOYSksc2NyaXB0U291cmNlOmQmJmQuc3JjfHwiIn19KX19fWNhdGNoKGUpe319dmFyIGhkPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoMjE0NzQ4MzY0NypNYXRoLnJhbmRvbSgpKX0sQmQ9ZnVuY3Rpb24oKXt0cnl7dmFyIGE9bmV3IFVpbnQzMkFycmF5KDEpO08uY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhKTtyZXR1cm4gYVswXSYyMTQ3NDgzNjQ3fWNhdGNoKGIpe3JldHVybiBoZCgpfX07ZnVuY3Rpb24gVGEoYSl7dmFyIGI9UihhLFVhKTs1MDA8PWImJkooMTUpO3ZhciBjPVAoYSxWYSk7aWYoInRyYW5zYWN0aW9uIiE9YyYmIml0ZW0iIT1jKXtjPVIoYSxXYSk7dmFyIGQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksZT1SKGEsWGEpOzA9PWUmJmEuc2V0KFhhLGQpO2U9TWF0aC5yb3VuZCgyKihkLWUpLzFlMyk7MDxlJiYoYz1NYXRoLm1pbihjK2UsMjApLGEuc2V0KFhhLGQpKTtpZigwPj1jKXRocm93ImFib3J0IjthLnNldChXYSwtLWMpfWEuc2V0KFVhLCsrYil9dmFyIFlhPWZ1bmN0aW9uKCl7dGhpcy5kYXRhPW5ldyBlZX07WWEucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXt2YXIgYj0kYShhKSxjPXRoaXMuZGF0YS5nZXQoYSk7YiYmdm9pZCAwPT1jJiYoYz1lYShiLmRlZmF1bHRWYWx1ZSk/Yi5kZWZhdWx0VmFsdWUoKTpiLmRlZmF1bHRWYWx1ZSk7cmV0dXJuIGImJmIuWj9iLloodGhpcyxhLGMpOmN9O3ZhciBQPWZ1bmN0aW9uKGEsYil7YT1hLmdldChiKTtyZXR1cm4gdm9pZCAwPT1hPyIiOiIiK2F9LFI9ZnVuY3Rpb24oYSxiKXthPWEuZ2V0KGIpO3JldHVybiB2b2lkIDA9PWF8fCIiPT09YT8wOk51bWJlcihhKX07WWEucHJvdG90eXBlLlo9ZnVuY3Rpb24oYSl7cmV0dXJuKGE9dGhpcy5nZXQoYSkpJiZlYShhKT9hOnVhfTtZYS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKCJvYmplY3QiPT10eXBlb2YgYSlmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZhYih0aGlzLGQsYVtkXSxjKTtlbHNlIGFiKHRoaXMsYSxiLGMpfTt2YXIgYWI9ZnVuY3Rpb24oYSxiLGMsZCl7aWYodm9pZCAwIT1jKXN3aXRjaChiKXtjYXNlIE5hOndiLnRlc3QoYyl9dmFyIGU9JGEoYik7ZSYmZS5vP2UubyhhLGIsYyxkKTphLmRhdGEuc2V0KGIsYyxkKX07dmFyIHVlPW5ldyBlZSx2ZT1bXSxiYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubmFtZT1hO3RoaXMuRj1iO3RoaXMuWj1kO3RoaXMubz1lO3RoaXMuZGVmYXVsdFZhbHVlPWN9LCRhPWZ1bmN0aW9uKGEpe3ZhciBiPXVlLmdldChhKTtpZighYilmb3IodmFyIGM9MDtjPHZlLmxlbmd0aDtjKyspe3ZhciBkPXZlW2NdLGU9ZFswXS5leGVjKGEpO2lmKGUpe2I9ZFsxXShlKTt1ZS5zZXQoYi5uYW1lLGIpO2JyZWFrfX1yZXR1cm4gYn0seWM9ZnVuY3Rpb24oYSl7dmFyIGI7dWUubWFwKGZ1bmN0aW9uKGMsZCl7ZC5GPT1hJiYoYj1kKX0pO3JldHVybiBiJiZiLm5hbWV9LFM9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPW5ldyBiYihhLGIsYyxkLGUpO3VlLnNldChhLm5hbWUsYSk7cmV0dXJuIGEubmFtZX0sY2I9ZnVuY3Rpb24oYSxiKXt2ZS5wdXNoKFtuZXcgUmVnRXhwKCJeIithKyIkIiksYl0pfSxUPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUyhhLGIsYyx2b2lkIDAsZGIpfSxkYj1mdW5jdGlvbigpe307dmFyIGhiPVQoImFwaVZlcnNpb24iLCJ2IiksaWI9VCgiY2xpZW50VmVyc2lvbiIsIl92Iik7UygiYW5vbnltaXplSXAiLCJhaXAiKTt2YXIgamI9UygiYWRTZW5zZUlkIiwiYSIpLFZhPVMoImhpdFR5cGUiLCJ0IiksSWE9UygiaGl0Q2FsbGJhY2siKSxSYT1TKCJoaXRQYXlsb2FkIik7Uygibm9uSW50ZXJhY3Rpb24iLCJuaSIpO1MoImN1cnJlbmN5Q29kZSIsImN1Iik7UygiZGF0YVNvdXJjZSIsImRzIik7dmFyIFZkPVMoInVzZUJlYWNvbiIsdm9pZCAwLCExKSxmYT1TKCJ0cmFuc3BvcnQiKTtTKCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIik7Uygic2Vzc2lvbkdyb3VwIiwic2ciKTtTKCJxdWV1ZVRpbWUiLCJxdCIpO3ZhciBBYz1TKCJfcyIsIl9zIik7Uygic2NyZWVuTmFtZSIsImNkIik7dmFyIGtiPVMoImxvY2F0aW9uIiwiZGwiLCIiKSxsYj1TKCJyZWZlcnJlciIsImRyIiksbWI9UygicGFnZSIsImRwIiwiIik7UygiaG9zdG5hbWUiLCJkaCIpO3ZhciBuYj1TKCJsYW5ndWFnZSIsInVsIiksb2I9UygiZW5jb2RpbmciLCJkZSIpO1MoInRpdGxlIiwiZHQiLGZ1bmN0aW9uKCl7cmV0dXJuIE0udGl0bGV8fHZvaWQgMH0pO2NiKCJjb250ZW50R3JvdXAoWzAtOV0rKSIsZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBiYihhWzBdLCJjZyIrYVsxXSl9KTt2YXIgcGI9Uygic2NyZWVuQ29sb3JzIiwic2QiKSxxYj1TKCJzY3JlZW5SZXNvbHV0aW9uIiwic3IiKSxyYj1TKCJ2aWV3cG9ydFNpemUiLCJ2cCIpLHNiPVMoImphdmFFbmFibGVkIiwiamUiKSx0Yj1TKCJmbGFzaFZlcnNpb24iLCJmbCIpO1MoImNhbXBhaWduSWQiLCJjaSIpO1MoImNhbXBhaWduTmFtZSIsImNuIik7UygiY2FtcGFpZ25Tb3VyY2UiLCJjcyIpO1MoImNhbXBhaWduTWVkaXVtIiwiY20iKTtTKCJjYW1wYWlnbktleXdvcmQiLCJjayIpO1MoImNhbXBhaWduQ29udGVudCIsImNjIik7dmFyIHViPVMoImV2ZW50Q2F0ZWdvcnkiLCJlYyIpLHhiPVMoImV2ZW50QWN0aW9uIiwiZWEiKSx5Yj1TKCJldmVudExhYmVsIiwiZWwiKSx6Yj1TKCJldmVudFZhbHVlIiwiZXYiKSxCYj1TKCJzb2NpYWxOZXR3b3JrIiwic24iKSxDYj1TKCJzb2NpYWxBY3Rpb24iLCJzYSIpLERiPVMoInNvY2lhbFRhcmdldCIsInN0IiksRWI9UygibDEiLCJwbHQiKSxGYj1TKCJsMiIsInBkdCIpLEdiPVMoImwzIiwiZG5zIiksSGI9UygibDQiLCJycnQiKSxJYj1TKCJsNSIsInNydCIpLEpiPVMoImw2IiwidGNwIiksS2I9UygibDciLCJkaXQiKSxMYj1TKCJsOCIsImNsdCIpLFZlPVMoImw5IiwiX2dzdCIpLFdlPVMoImwxMCIsIl9nYnQiKSxYZT1TKCJsMTEiLCJfY3N0IiksWWU9UygibDEyIiwiX2NidCIpLE1iPVMoInRpbWluZ0NhdGVnb3J5IiwidXRjIiksTmI9UygidGltaW5nVmFyIiwidXR2IiksT2I9UygidGltaW5nTGFiZWwiLCJ1dGwiKSxQYj1TKCJ0aW1pbmdWYWx1ZSIsInV0dCIpO1MoImFwcE5hbWUiLCJhbiIpO1MoImFwcFZlcnNpb24iLCJhdiIsIiIpO1MoImFwcElkIiwiYWlkIiwiIik7UygiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIik7UygiZXhEZXNjcmlwdGlvbiIsImV4ZCIpO1MoImV4RmF0YWwiLCJleGYiKTt2YXIgTmM9UygiZXhwSWQiLCJ4aWQiKSxPYz1TKCJleHBWYXIiLCJ4dmFyIiksbT1TKCJleHAiLCJleHAiKSxSYz1TKCJfdXRtYSIsIl91dG1hIiksU2M9UygiX3V0bXoiLCJfdXRteiIpLFRjPVMoIl91dG1odCIsIl91dG1odCIpLFVhPVMoIl9oYyIsdm9pZCAwLDApLFhhPVMoIl90aSIsdm9pZCAwLDApLFdhPVMoIl90byIsdm9pZCAwLDIwKTtjYigiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYmIoYVswXSwiY2QiK2FbMV0pfSk7Y2IoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGJiKGFbMF0sImNtIithWzFdKX0pO1MoImxpbmtlclBhcmFtIix2b2lkIDAsdm9pZCAwLEJjLGRiKTt2YXIgWmU9VCgiX2NkMmwiLHZvaWQgMCwhMSksbGQ9UygidXNhZ2UiLCJfdSIpLEdkPVMoIl91bSIpO1MoImZvcmNlU1NMIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIEJhfSxmdW5jdGlvbihhLGIsYyl7SigzNCk7QmE9ISFjfSk7dmFyIGVkPVMoIl9qMSIsImppZCIpLGlhPVMoIl9qMiIsImdqaWQiKTtjYigiXFwmKC4qKSIsZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGJiKGFbMF0sYVsxXSksYz15YyhhWzBdLnN1YnN0cmluZygxKSk7YyYmKGIuWj1mdW5jdGlvbihkKXtyZXR1cm4gZC5nZXQoYyl9LGIubz1mdW5jdGlvbihkLGUsZyxjYSl7ZC5zZXQoYyxnLGNhKX0sYi5GPXZvaWQgMCk7cmV0dXJuIGJ9KTt2YXIgUWI9VCgiX29vdCIpLGRkPVMoInByZXZpZXdUYXNrIiksUmI9UygiY2hlY2tQcm90b2NvbFRhc2siKSxtZD1TKCJ2YWxpZGF0aW9uVGFzayIpLFNiPVMoImNoZWNrU3RvcmFnZVRhc2siKSxVYz1TKCJoaXN0b3J5SW1wb3J0VGFzayIpLFRiPVMoInNhbXBsZXJUYXNrIiksVmI9UygiX3JsdCIpLFdiPVMoImJ1aWxkSGl0VGFzayIpLFhiPVMoInNlbmRIaXRUYXNrIiksVmM9UygiY2VUYXNrIiksemQ9UygiZGV2SWRUYXNrIiksQ2Q9UygidGltaW5nVGFzayIpLExkPVMoImRpc3BsYXlGZWF0dXJlc1Rhc2siKSxvYT1TKCJjdXN0b21UYXNrIiksemU9UygiZnBzQ3Jvc3NEb21haW5UYXNrIiksUmU9VCgiX2N0YSIpLFY9VCgibmFtZSIpLFE9VCgiY2xpZW50SWQiLCJjaWQiKSxuPVQoImNsaWVudElkVGltZSIpLHhkPVQoInN0b3JlZENsaWVudElkIiksQWQ9UygidXNlcklkIiwidWlkIiksTmE9VCgidHJhY2tpbmdJZCIsInRpZCIpLFU9VCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxXPVQoImNvb2tpZURvbWFpbiIpLFliPVQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLFpiPVQoImNvb2tpZUV4cGlyZXMiLHZvaWQgMCw2MzA3MmUzKSxIZD1UKCJjb29raWVVcGRhdGUiLHZvaWQgMCwhMCksQmU9VCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksJGI9VCgibGVnYWN5Q29va2llRG9tYWluIiksV2M9VCgibGVnYWN5SGlzdG9yeUltcG9ydCIsdm9pZCAwLCEwKSxhYz1UKCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGJjPVQoImFsbG93TGlua2VyIix2b2lkIDAsITEpLGNjPVQoImFsbG93QW5jaG9yIix2b2lkIDAsITApLEthPVQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxkYz1UKCJzaXRlU3BlZWRTYW1wbGVSYXRlIix2b2lkIDAsMSksZWM9VCgiYWx3YXlzU2VuZFJlZmVycmVyIix2b2lkIDAsITEpLEk9VCgiX2dpZCIsIl9naWQiKSxsYT1UKCJfZ2NuIiksS2Q9VCgidXNlQW1wQ2xpZW50SWQiKSxjZT1UKCJfZ2NsaWQiKSxmZT1UKCJfZ3QiKSxoZT1UKCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLGllPVQoIl9nY2xzcmMiKSxqZT1UKCJzdG9yZUdhYyIsdm9pZCAwLCEwKSxvZT1TKCJfeF8xOSIpLEFlPVMoIl9mcGxjIiwiX2ZwbGMiKSxGPVQoIl9jcyIpLEplPVQoIl91c2VVcCIsdm9pZCAwLCExKSxMZT1TKCJ1cCIsInVwIiksUWU9UygiX3RhYyIsdm9pZCAwLCExKSxTZT1UKCJfZ2JyYWlkIiksVGU9VCgiX2didCIpLGJmPVQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLGdkPVMoInRyYW5zcG9ydFVybCIpLE1kPVMoIl9yIiwiX3IiKSxPZD1TKCJfc2xjIiwiX3NsYyIpLHFlPVMoIl9kcCIpLGFkPVMoIl9qdCIsdm9pZCAwLCJuIiksVWQ9UygiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHhlPVMoImFsbG93QWRQZXJzb25hbGl6YXRpb25TaWduYWxzIix2b2lkIDAsITApO2Z1bmN0aW9uIFgoYSxiLGMsZCl7YlthXT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZCYmSihkKSxjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChlKXt0aHJvdyBnZSgiZXhjIixhLGUmJmUubmFtZSksZX19fXZhciBFZD1mdW5jdGlvbihhKXtpZigiY29va2llIj09YS5nZXQoYWMpKXJldHVybiBhPUNhKCJGUExDIiksMDxhLmxlbmd0aD9hWzBdOnZvaWQgMH0sRmU9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYj1QKGEsb2UpJiZhLmdldChaZSkpYj1EZS5nZXQoYS5nZXQoY2MpKSxiPSEoYiYmYi5fZnBsYyk7YiYmIUVkKGEpJiZhLnNldChBZSwiMCIpfTt2YXIgYWE9ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5taW4oUihhLGRjKSwxMDApO3JldHVybiBMYShQKGEsUSkpJTEwMD49Yj8hMTohMH0sZ2M9ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoRWMoYil8fEZjKGIpKXt2YXIgYz1iW0ViXTt2b2lkIDA9PWN8fEluZmluaXR5PT1jfHxpc05hTihjKXx8KDA8Yz8oWShiLEdiKSxZKGIsSmIpLFkoYixJYiksWShiLEZiKSxZKGIsSGIpLFkoYixLYiksWShiLExiKSxZKGIsVmUpLFkoYixXZSksWShiLFhlKSxZKGIsWWUpLHZhKGZ1bmN0aW9uKCl7YShiKX0sMTApKTpMKE8sImxvYWQiLGZ1bmN0aW9uKCl7Z2MoYSl9LCExKSl9fSxFYz1mdW5jdGlvbihhKXt2YXIgYj1PLnBlcmZvcm1hbmNlfHxPLndlYmtpdFBlcmZvcm1hbmNlO2I9YiYmYi50aW1pbmc7aWYoIWIpcmV0dXJuITE7dmFyIGM9Yi5uYXZpZ2F0aW9uU3RhcnQ7aWYoMD09YylyZXR1cm4hMTthW0ViXT1iLmxvYWRFdmVudFN0YXJ0LWM7YVtHYl09Yi5kb21haW5Mb29rdXBFbmQtYi5kb21haW5Mb29rdXBTdGFydDthW0piXT1iLmNvbm5lY3RFbmQtYi5jb25uZWN0U3RhcnQ7YVtJYl09Yi5yZXNwb25zZVN0YXJ0LWIucmVxdWVzdFN0YXJ0O2FbRmJdPWIucmVzcG9uc2VFbmQtYi5yZXNwb25zZVN0YXJ0O2FbSGJdPWIuZmV0Y2hTdGFydC1jO2FbS2JdPWIuZG9tSW50ZXJhY3RpdmUtYzthW0xiXT1iLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LWM7YVtWZV09Ti5MLWM7YVtXZV09Ti55YS1jO08uZ29vZ2xlX3RhZ19tYW5hZ2VyJiZPLmdvb2dsZV90YWdfbWFuYWdlci5fbGkmJihiPU8uZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSxhW1hlXT1iLmNzdCxhW1llXT1iLmNidCk7cmV0dXJuITB9LEZjPWZ1bmN0aW9uKGEpe2lmKE8udG9wIT1PKXJldHVybiExO3ZhciBiPU8uZXh0ZXJuYWwsYz1iJiZiLm9ubG9hZFQ7YiYmIWIuaXNWYWxpZExvYWRUaW1lJiYoYz12b2lkIDApOzIxNDc0ODM2NDg8YyYmKGM9dm9pZCAwKTswPGMmJmIuc2V0UGFnZVJlYWR5VGltZSgpO2lmKHZvaWQgMD09YylyZXR1cm4hMTthW0ViXT1jO3JldHVybiEwfSxZPWZ1bmN0aW9uKGEsYil7dmFyIGM9YVtiXTtpZihpc05hTihjKXx8SW5maW5pdHk9PWN8fDA+YylhW2JdPXZvaWQgMH0sRmQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2lmKCJwYWdldmlldyI9PWIuZ2V0KFZhKSYmIWEuSSl7YS5JPSEwO3ZhciBjPWFhKGIpLGQ9MDxFKFAoYixrYiksImdjbGlkIikubGVuZ3RoLGU9MDxFKFAoYixrYiksIndicmFpZCIpLmxlbmd0aDsoY3x8ZHx8ZSkmJmdjKGZ1bmN0aW9uKGcpe2MmJmEuc2VuZCgidGltaW5nIixnKTsoZHx8ZSkmJmEuc2VuZCgiYWR0aW1pbmciLGcpfSl9fX07dmFyIGhjPSExLG1jPWZ1bmN0aW9uKGEpe2lmKCJjb29raWUiPT1QKGEsYWMpKXtpZihhLmdldChIZCl8fFAoYSx4ZCkhPVAoYSxRKSl7dmFyIGI9MWUzKlIoYSxaYik7bWEoYSxRLFUsYik7YS5kYXRhLnNldCh4ZCxQKGEsUSkpfShhLmdldChIZCl8fHVjKGEpIT1QKGEsSSkpJiZtYShhLEksbGEsODY0ZTUpO2lmKGEuZ2V0KGplKSl7aWYoYj1QKGEsY2UpKXt2YXIgYz1NYXRoLm1pbihSKGEsaGUpLDFlMypSKGEsWmIpKTtjPTA9PT1jPzA6TWF0aC5taW4oYywxZTMqUihhLGZlKStjLShuZXcgRGF0ZSkuZ2V0VGltZSgpKTthLmRhdGEuc2V0KGhlLGMpO3ZhciBkPXt9LGU9UChhLGZlKSxnPVAoYSxpZSksY2E9a2MoUChhLFliKSksbD1sYyhQKGEsVykpLGs9UChhLE5hKSx3PVAoYSxCZSk7ZyYmImF3LmRzIiE9Zz9kJiYoZC51YT0hMCk6KGI9WyIxIixlLENjKGIpXS5qb2luKCIuIiksMDw9YyYmKGQmJihkLnRhPSEwKSx6YygiX2dhY18iK0NjKGspLGIsY2EsbCxrLGMsdykpKTtsZShkKX19ZWxzZSBKKDc1KTthLmdldChqZSkmJihiPVAoYSxTZSkpJiYoYz1NYXRoLm1pbihSKGEsYmYpLDFlMypSKGEsWmIpKSxjPTA9PT1jPzA6TWF0aC5taW4oYywxZTMqUihhLFRlKStjLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxhLmRhdGEuc2V0KGJmLGMpLGQ9e30sdz1QKGEsVGUpLGNhPWtjKFAoYSxZYikpLGw9bGMoUChhLFcpKSxrPVAoYSxOYSksYT1QKGEsQmUpLGI9WyIxIix3LENjKGIpXS5qb2luKCIuIiksMDw9YyYmKGQmJihkLnRhPSEwKSx6YygiX2dhY19nYl8iK0NjKGspLGIsY2EsbCxrLGMsYSkpLGVmKGQpKX19LG1hPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW5kKGEsYik7aWYoZSl7Yz1QKGEsYyk7dmFyIGc9a2MoUChhLFliKSksY2E9bGMoUChhLFcpKSxsPVAoYSxCZSksaz1QKGEsTmEpO2lmKCJhdXRvIiE9Y2EpemMoYyxlLGcsY2EsayxkLGwpJiYoaGM9ITApO2Vsc2V7SigzMik7Zm9yKHZhciB3PWlkKCksQ2U9MDtDZTx3Lmxlbmd0aDtDZSsrKWlmKGNhPXdbQ2VdLGEuZGF0YS5zZXQoVyxjYSksZT1uZChhLGIpLHpjKGMsZSxnLGNhLGssZCxsKSl7aGM9ITA7cmV0dXJufWEuZGF0YS5zZXQoVywiYXV0byIpfX19LHVjPWZ1bmN0aW9uKGEpe3ZhciBiPUNhKFAoYSxsYSkpO3JldHVybiBYZChhLGIpfSxuYz1mdW5jdGlvbihhKXtpZigiY29va2llIj09UChhLGFjKSYmIWhjJiYobWMoYSksIWhjKSl0aHJvdyJhYm9ydCJ9LFljPWZ1bmN0aW9uKGEpe2lmKGEuZ2V0KFdjKSl7dmFyIGI9UChhLFcpLGM9UChhLCRiKXx8eGEoKSxkPVhjKCJfX3V0bWEiLGMsYik7ZCYmKEooMTkpLGEuc2V0KFRjLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSxhLnNldChSYyxkLlIpLChiPVhjKCJfX3V0bXoiLGMsYikpJiZkLmhhc2g9PWIuaGFzaCYmYS5zZXQoU2MsYi5SKSl9fSxuZD1mdW5jdGlvbihhLGIpe2I9Q2MoUChhLGIpKTt2YXIgYz1sYyhQKGEsVykpLnNwbGl0KCIuIikubGVuZ3RoO2E9amMoUChhLFliKSk7MTxhJiYoYys9Ii0iK2EpO3JldHVybiBiP1siR0ExIixjLGJdLmpvaW4oIi4iKToiIn0sWGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmEoYixQKGEsVyksUChhLFliKSl9LG5hPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8MT5hLmxlbmd0aClKKDEyKTtlbHNle2Zvcih2YXIgZD1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBnPWFbZV07dmFyIGNhPWcuc3BsaXQoIi4iKTt2YXIgbD1jYS5zaGlmdCgpOygiR0ExIj09bHx8IjEiPT1sKSYmMTxjYS5sZW5ndGg/KGc9Y2Euc2hpZnQoKS5zcGxpdCgiLSIpLDE9PWcubGVuZ3RoJiYoZ1sxXT0iMSIpLGdbMF0qPTEsZ1sxXSo9MSxjYT17SDpnLHM6Y2Euam9pbigiLiIpfSk6Y2E9a2QudGVzdChnKT97SDpbMCwwXSxzOmd9OnZvaWQgMDtjYSYmZC5wdXNoKGNhKX1pZigxPT1kLmxlbmd0aClyZXR1cm4gSigxMyksZFswXS5zO2lmKDA9PWQubGVuZ3RoKUooMTIpO2Vsc2V7SigxNCk7ZD1HYyhkLGxjKGIpLnNwbGl0KCIuIikubGVuZ3RoLDApO2lmKDE9PWQubGVuZ3RoKXJldHVybiBkWzBdLnM7ZD1HYyhkLGpjKGMpLDEpOzE8ZC5sZW5ndGgmJkooNDEpO3JldHVybiBkWzBdJiZkWzBdLnN9fX0sR2M9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1bXSxlPVtdLGcsY2E9MDtjYTxhLmxlbmd0aDtjYSsrKXt2YXIgbD1hW2NhXTtsLkhbY109PWI/ZC5wdXNoKGwpOnZvaWQgMD09Z3x8bC5IW2NdPGc/KGU9W2xdLGc9bC5IW2NdKTpsLkhbY109PWcmJmUucHVzaChsKX1yZXR1cm4gMDxkLmxlbmd0aD9kOmV9LGxjPWZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmluZGV4T2YoIi4iKT9hLnN1YnN0cigxKTphfSxpZD1mdW5jdGlvbigpe3ZhciBhPVtdLGI9eGEoKS5zcGxpdCgiLiIpO2lmKDQ9PWIubGVuZ3RoKXt2YXIgYz1iW2IubGVuZ3RoLTFdO2lmKHBhcnNlSW50KGMsMTApPT1jKXJldHVyblsibm9uZSJdfWZvcihjPWIubGVuZ3RoLTI7MDw9YztjLS0pYS5wdXNoKGIuc2xpY2UoYykuam9pbigiLiIpKTtiPU0ubG9jYXRpb24uaG9zdG5hbWU7ZWIudGVzdChiKXx8dmMudGVzdChiKXx8YS5wdXNoKCJub25lIik7cmV0dXJuIGF9LGtjPWZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiIvIjsxPGEubGVuZ3RoJiZhLmxhc3RJbmRleE9mKCIvIik9PWEubGVuZ3RoLTEmJihhPWEuc3Vic3RyKDAsYS5sZW5ndGgtMSkpOzAhPWEuaW5kZXhPZigiLyIpJiYoYT0iLyIrYSk7cmV0dXJuIGF9LGpjPWZ1bmN0aW9uKGEpe2E9a2MoYSk7cmV0dXJuIi8iPT1hPzE6YS5zcGxpdCgiLyIpLmxlbmd0aH0sbGU9ZnVuY3Rpb24oYSl7YS50YSYmSig3Nyk7YS5uYSYmSig3NCk7YS5wYSYmSig3Myk7YS51YSYmSig2OSl9LGVmPWZ1bmN0aW9uKGEpe2EudGEmJkooODUpO2EubmEmJkooODYpO2EucGEmJkooODcpfTtmdW5jdGlvbiBYYyhhLGIsYyl7Im5vbmUiPT1iJiYoYj0iIik7dmFyIGQ9W10sZT1DYShhKTthPSJfX3V0bWEiPT1hPzY6Mjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoO2crKyl7dmFyIGNhPSgiIitlW2ddKS5zcGxpdCgiLiIpO2NhLmxlbmd0aD49YSYmZC5wdXNoKHtoYXNoOmNhWzBdLFI6ZVtnXSxPOmNhfSl9aWYoMCE9ZC5sZW5ndGgpcmV0dXJuIDE9PWQubGVuZ3RoP2RbMF06WmMoYixkKXx8WmMoYyxkKXx8WmMobnVsbCxkKXx8ZFswXX1mdW5jdGlvbiBaYyhhLGIpe2lmKG51bGw9PWEpdmFyIGM9YT0xO2Vsc2UgYz1MYShhKSxhPUxhKEQoYSwiLiIpP2Euc3Vic3RyaW5nKDEpOiIuIithKTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLmhhc2g9PWN8fGJbZF0uaGFzaD09YSlyZXR1cm4gYltkXX12YXIgSmM9bmV3IFJlZ0V4cCgvXmh0dHBzPzpcL1wvKFteXC86XSspLyksRGU9Ty5nb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UsS2M9LyguKikoWz8mI10pKD86X2dhPVteJiNdKikoPzomPykoLiopLyxvZD0vKC4qKShbPyYjXSkoPzpfZ2FjPVteJiNdKikoPzomPykoLiopLztmdW5jdGlvbiBCYyhhKXtpZihhLmdldChaZSkpcmV0dXJuIEooMzUpLERlLmdlbmVyYXRlKCRlKGEpKTt2YXIgYj1QKGEsUSksYz1QKGEsSSl8fCIiO2I9Il9nYT0yLiIrSyhwYShjK2IsMCkrIi4iK2MrIi0iK2IpOyhhPWFmKGEpKT8oSig0NCksYT0iJl9nYWM9MS4iK0soW3BhKGEucWEsMCksYS50aW1lc3RhbXAsYS5xYV0uam9pbigiLiIpKSk6YT0iIjtyZXR1cm4gYithfWZ1bmN0aW9uIEljKGEsYil7dmFyIGM9bmV3IERhdGUsZD1PLm5hdmlnYXRvcixlPWQucGx1Z2luc3x8W107YT1bYSxkLnVzZXJBZ2VudCxjLmdldFRpbWV6b25lT2Zmc2V0KCksYy5nZXRZZWFyKCksYy5nZXREYXRlKCksYy5nZXRIb3VycygpLGMuZ2V0TWludXRlcygpK2JdO2ZvcihiPTA7YjxlLmxlbmd0aDsrK2IpYS5wdXNoKGVbYl0uZGVzY3JpcHRpb24pO3JldHVybiBMYShhLmpvaW4oIi4iKSl9ZnVuY3Rpb24gcGEoYSxiKXt2YXIgYz1uZXcgRGF0ZSxkPU8ubmF2aWdhdG9yLGU9Yy5nZXRIb3VycygpK01hdGguZmxvb3IoKGMuZ2V0TWludXRlcygpK2IpLzYwKTtyZXR1cm4gTGEoW2EsZC51c2VyQWdlbnQsZC5sYW5ndWFnZXx8IiIsYy5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0WWVhcigpLGMuZ2V0RGF0ZSgpK01hdGguZmxvb3IoZS8yNCksKDI0K2UpJTI0LCg2MCtjLmdldE1pbnV0ZXMoKStiKSU2MF0uam9pbigiLiIpKX12YXIgRGM9ZnVuY3Rpb24oYSl7Sig0OCk7dGhpcy50YXJnZXQ9YTt0aGlzLlQ9ITF9O0RjLnByb3RvdHlwZS5jYT1mdW5jdGlvbihhLGIpe2lmKGEpe2lmKHRoaXMudGFyZ2V0LmdldChaZSkpcmV0dXJuIERlLmRlY29yYXRlKCRlKHRoaXMudGFyZ2V0KSxhLGIpO2lmKGEudGFnTmFtZSl7aWYoImEiPT1hLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7YS5ocmVmJiYoYS5ocmVmPXFkKHRoaXMsYS5ocmVmLGIpKTtyZXR1cm59aWYoImZvcm0iPT1hLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gcmQodGhpcyxhKX1pZigic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIHFkKHRoaXMsYSxiKX19O3ZhciBxZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9S2MuZXhlYyhiKTtkJiYzPD1kLmxlbmd0aCYmKGI9ZFsxXSsoZFszXT9kWzJdK2RbM106IiIpKTsoZD1vZC5leGVjKGIpKSYmMzw9ZC5sZW5ndGgmJihiPWRbMV0rKGRbM10/ZFsyXStkWzNdOiIiKSk7YT1hLnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7ZD1iLmluZGV4T2YoIj8iKTt2YXIgZT1iLmluZGV4T2YoIiMiKTtiPWM/YisoKC0xPT1lPyIjIjoiJiIpK2EpOi0xPT1lP2IrKCgtMT09PWQ/Ij8iOiImIikrYSk6Yi5zdWJzdHJpbmcoMCxlKSsoLTE9PT1kfHxkPmU/Ij8iOiImIikrYStiLnN1YnN0cmluZyhlKTtiPWIucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKTtyZXR1cm4gYj1iLnJlcGxhY2UoLyYrX2dhYz0vLCImX2dhYz0iKX0scmQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiLmFjdGlvbilpZigiZ2V0Ij09Yi5tZXRob2QudG9Mb3dlckNhc2UoKSl7YT1hLnRhcmdldC5nZXQoImxpbmtlclBhcmFtIikuc3BsaXQoIiYiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5zcGxpdCgiPSIpLGU9ZFsxXTtkPWRbMF07Zm9yKHZhciBnPWIuY2hpbGROb2Rlc3x8W10sY2E9ITEsbD0wO2w8Zy5sZW5ndGg7bCsrKWlmKGdbbF0ubmFtZT09ZCl7Z1tsXS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKTtjYT0hMDticmVha31jYXx8KGc9TS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGcuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZy5zZXRBdHRyaWJ1dGUoIm5hbWUiLGQpLGcuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsZSksYi5hcHBlbmRDaGlsZChnKSl9fWVsc2UicG9zdCI9PWIubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihiLmFjdGlvbj1xZChhLGIuYWN0aW9uKSl9O0RjLnByb3RvdHlwZS5TPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGcpe3RyeXtnPWd8fE8uZXZlbnQ7YTp7dmFyIGNhPWcudGFyZ2V0fHxnLnNyY0VsZW1lbnQ7Zm9yKGc9MTAwO2NhJiYwPGc7KXtpZihjYS5ocmVmJiZjYS5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBsPWNhO2JyZWFrIGF9Y2E9Y2EucGFyZW50Tm9kZTtnLS19bD17fX0oImh0dHA6Ij09bC5wcm90b2NvbHx8Imh0dHBzOiI9PWwucHJvdG9jb2wpJiZzZChhLGwuaG9zdG5hbWV8fCIiKSYmbC5ocmVmJiYobC5ocmVmPXFkKGUsbC5ocmVmLGIpKX1jYXRjaChrKXtKKDI2KX19dmFyIGU9dGhpczt0aGlzLnRhcmdldC5nZXQoWmUpP0RlLmF1dG8oZnVuY3Rpb24oKXtyZXR1cm4gJGUoZS50YXJnZXQpfSxhLGI/ImZyYWdtZW50IjoiIixjKToodGhpcy5UfHwodGhpcy5UPSEwLEwoTSwibW91c2Vkb3duIixkLCExKSxMKE0sImtleXVwIixkLCExKSksYyYmTChNLCJzdWJtaXQiLGZ1bmN0aW9uKGcpe2c9Z3x8Ty5ldmVudDtpZigoZz1nLnRhcmdldHx8Zy5zcmNFbGVtZW50KSYmZy5hY3Rpb24pe3ZhciBjYT1nLmFjdGlvbi5tYXRjaChKYyk7Y2EmJnNkKGEsY2FbMV0pJiZyZChlLGcpfX0pKX07RGMucHJvdG90eXBlLiQ9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9dGhpcyxjPWIudGFyZ2V0LmdldChGKTt2b2lkIDAhPT1jJiZEZS5wYXNzdGhyb3VnaChmdW5jdGlvbigpe2lmKGMoImFuYWx5dGljc19zdG9yYWdlIikpcmV0dXJue307dmFyIGQ9e307cmV0dXJuIGQuX2dhPWIudGFyZ2V0LmdldChRKSxkLl91cD0iMSIsZH0sMSwhMCl9fTtmdW5jdGlvbiBzZChhLGIpe2lmKGI9PU0ubG9jYXRpb24uaG9zdG5hbWUpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXWluc3RhbmNlb2YgUmVnRXhwKXtpZihhW2NdLnRlc3QoYikpcmV0dXJuITB9ZWxzZSBpZigwPD1iLmluZGV4T2YoYVtjXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24ga2UoYSxiKXtyZXR1cm4gYiE9SWMoYSwwKSYmYiE9SWMoYSwtMSkmJmIhPUljKGEsLTIpJiZiIT1wYShhLDApJiZiIT1wYShhLC0xKSYmYiE9cGEoYSwtMil9ZnVuY3Rpb24gJGUoYSl7dmFyIGI9YWYoYSksYz17fTtjLl9nYT1hLmdldChRKTtjLl9naWQ9YS5nZXQoSSl8fHZvaWQgMDtjLl9nYWM9Yj9bYi5xYSxiLnRpbWVzdGFtcF0uam9pbigiLiIpOnZvaWQgMDtiPWEuZ2V0KEFlKTthPUVkKGEpO3JldHVybiBjLl9mcGxjPWImJiIwIiE9PWI/YjphLGN9ZnVuY3Rpb24gYWYoYSl7ZnVuY3Rpb24gYihlKXtyZXR1cm4gdm9pZCAwPT1lfHwiIj09PWU/MDpOdW1iZXIoZSl9dmFyIGM9YS5nZXQoY2UpO2lmKGMmJmEuZ2V0KGplKSl7dmFyIGQ9YihhLmdldChmZSkpO2lmKDFlMypkK2IoYS5nZXQoaGUpKTw9KG5ldyBEYXRlKS5nZXRUaW1lKCkpSig3Nik7ZWxzZSByZXR1cm57dGltZXN0YW1wOmQscWE6Y319fXZhciBwPS9eKEdUTXxPUFQpLVtBLVowLTldKyQvLEllPS9eRy1bQS1aMC05XSskLyxxPS87X2dhZXhwPVteO10qL2cscj0vOygoX191dG1hPSl8KFteOz1dKz1HQVg/XGQrXC4pKVteO10qL2csQWE9L15odHRwcz86XC9cL1tcd1wtLl0rXC5nb29nbGUuY29tKDpcZCspP1wvb3B0aW1pemVcL29wdC1sYXVuY2hcLmh0bWxcPy4qJC8sdD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGQsZSl7ZSYmKGMrPSImIitkKyI9IitLKGUpKX12YXIgYz1HZShhLnR5cGUpK0soYS5pZCk7ImRhdGFMYXllciIhPWEuQiYmYigibCIsYS5CKTtiKCJjeCIsYS5jb250ZXh0KTtiKCJ0IixhLnRhcmdldCk7YigiY2lkIixhLmNsaWVudElkKTtiKCJjaWR0IixhLmthKTtiKCJnYWMiLGEubGEpO2IoImFpcCIsYS5pYSk7YS5zeW5jJiZiKCJtIiwic3luYyIpO2IoImN5Y2xlIixhLkcpO2EucWEmJmIoImdjbGlkIixhLnFhKTtBYS50ZXN0KE0ucmVmZXJyZXIpJiZiKCJjYiIsU3RyaW5nKGhkKCkpKTtyZXR1cm4gY30sSGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTtPW2EuQl09T1thLkJdfHxbXTtjPXsiZ3RtLnN0YXJ0IjpjfTthLnN5bmN8fChjLmV2ZW50PSJndG0uanMiKTtPW2EuQl0ucHVzaChjKTsyPT09YS50eXBlJiZmdW5jdGlvbihkLGUsZyl7T1thLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsYS5pZCxiKX0sS2U9ZnVuY3Rpb24oYSxiLGMsZCl7Yz1jfHx7fTt2YXIgZT0xO0llLnRlc3QoYikmJihlPTIpO3ZhciBnPXtpZDpiLHR5cGU6ZSxCOmMuZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxjYT12b2lkIDA7YS5nZXQoIiZndG0iKT09YiYmKGcuRz0hMCk7MT09PWU/KGcuaWE9ISFhLmdldCgiYW5vbnltaXplSXAiKSxnLnN5bmM9ZCxiPVN0cmluZyhhLmdldCgibmFtZSIpKSwidDAiIT1iJiYoZy50YXJnZXQ9YiksRyhTdHJpbmcoYS5nZXQoInRyYWNraW5nSWQiKSkpfHwoZy5jbGllbnRJZD1TdHJpbmcoYS5nZXQoUSkpLGcua2E9TnVtYmVyKGEuZ2V0KG4pKSxjPWMucGFsaW5kcm9tZT9yOnEsYz0oYz1NLmNvb2tpZS5yZXBsYWNlKC9efCg7ICspL2csIjsiKS5tYXRjaChjKSk/Yy5zb3J0KCkuam9pbigiIikuc3Vic3RyaW5nKDEpOnZvaWQgMCxnLmxhPWMsZy5xYT1FKFAoYSxrYiksImdjbGlkIikpKToyPT09ZSYmKGcuY29udGV4dD0iYyIsY2E9e2FsbG93X2dvb2dsZV9zaWduYWxzOmEuZ2V0KFVkKSxhbGxvd19hZF9wZXJzb25hbGl6YXRpb25fc2lnbmFsczphLmdldCh4ZSl9KTtIZShnLGNhKTtyZXR1cm4gdChnKX07dmFyIEg9e30sSmQ9ZnVuY3Rpb24oYSxiKXtifHwoYj0oYj1QKGEsVikpJiYidDAiIT1iP1dkLnRlc3QoYik/Il9nYXRfIitDYyhQKGEsTmEpKToiX2dhdF8iK0NjKGIpOiJfZ2F0Iik7dGhpcy5ZPWJ9LFJkPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5nZXQoV2IpO2Iuc2V0KFdiLGZ1bmN0aW9uKGUpe1BkKGEsZSxlZCk7UGQoYSxlLGlhKTt2YXIgZz1jKGUpO1FkKGEsZSk7cmV0dXJuIGd9KTt2YXIgZD1iLmdldChYYik7Yi5zZXQoWGIsZnVuY3Rpb24oZSl7dmFyIGc9ZChlKTtpZihzZShlKSl7Sig4MCk7dmFyIGNhPXtVOnJlKGUsMSksZ29vZ2xlOnJlKGUsMiksY291bnQ6MH07cGUoImh0dHBzOi8vc3RhdHMuZy5kb3VibGVjbGljay5uZXQvai9jb2xsZWN0IixjYS5VLGNhKTtlLnNldChlZCwiIiwhMCl9cmV0dXJuIGd9KX0sUGQ9ZnVuY3Rpb24oYSxiLGMpeyExPT09Yi5nZXQoVWQpfHxiLmdldChjKXx8KCIxIj09Q2EoYS5ZKVswXT9iLnNldChjLCIiLCEwKTpiLnNldChjLCIiK2hkKCksITApKX0sUWQ9ZnVuY3Rpb24oYSxiKXtzZShiKSYmemMoYS5ZLCIxIixQKGIsWWIpLFAoYixXKSxQKGIsTmEpLDZlNCxQKGIsQmUpKX0sc2U9ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmdldChlZCkmJiExIT09YS5nZXQoVWQpfSxOZT1mdW5jdGlvbihhKXtyZXR1cm4hSFtQKGEsTmEpXSYmdm9pZCAwPT09YS5nZXQoIiZndG0iKSYmdm9pZCAwPT09YS5nZXQoZmEpJiZ2b2lkIDA9PT1hLmdldChnZCkmJnZvaWQgMD09PWEuZ2V0KG9lKX0scmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZWUsZD1mdW5jdGlvbihnKXskYShnKS5GJiZjLnNldCgkYShnKS5GLGEuZ2V0KGcpKX07ZChoYik7ZChpYik7ZChOYSk7ZChRKTtkKGVkKTsxPT1iJiYoZChBZCksZChpYSksZChJKSk7ITE9PT1hLmdldCh4ZSkmJmMuc2V0KCJucGEiLCIxIik7Yy5zZXQoJGEobGQpLkYsVGQoYSkpO3ZhciBlPSIiO2MubWFwKGZ1bmN0aW9uKGcsY2Epe2UrPUsoZykrIj0iO2UrPUsoIiIrY2EpKyImIn0pO2UrPSJ6PSIraGQoKTsxPT1iP2U9InQ9ZGMmYWlwPTEmX3I9MyYiK2U6Mj09YiYmKGU9InQ9c3ImYWlwPTEmX3I9NCZzbGZfcmQ9MSYiK2UpO3JldHVybiBlfSxNZT1mdW5jdGlvbihhKXtpZihOZShhKSlyZXR1cm4gSFtQKGEsTmEpXT0hMCxmdW5jdGlvbihiKXtpZihiJiYhSFtiXSl7dmFyIGM9S2UoYSxiKTtJZChjKTtIW2JdPSEwfX19LFdkPS9eZ3RtXGQrJC87dmFyIGZkPWZ1bmN0aW9uKGEsYil7YT1hLm1vZGVsO2lmKCFhLmdldCgiZGNMb2FkZWQiKSl7dmFyIGM9bmV3ICRjKERkKGEpKTtjLnNldCgyOSk7YS5zZXQoR2QsYy5DKTtiPWJ8fHt9O3ZhciBkO2JbVV0mJihkPUNjKGJbVV0pKTtiPW5ldyBKZChhLGQpO1JkKGIsYSk7YS5zZXQoImRjTG9hZGVkIiwhMCl9fTt2YXIgU2Q9ZnVuY3Rpb24oYSl7aWYoIWEuZ2V0KCJkY0xvYWRlZCIpJiYiY29va2llIj09YS5nZXQoYWMpKXt2YXIgYj1uZXcgSmQoYSk7UGQoYixhLGVkKTtQZChiLGEsaWEpO1FkKGIsYSk7Yj1zZShhKTt2YXIgYz1OZShhKTtiJiZhLnNldChNZCwxLCEwKTtjJiZhLnNldChPZCwxLCEwKTtpZihifHxjKWEuc2V0KGFkLCJkIiwhMCksSig3OSksYS5zZXQocWUse1U6cmUoYSwxKSxnb29nbGU6cmUoYSwyKSxWOk1lKGEpLGNvdW50OjB9LCEwKX19O3ZhciBMYz1mdW5jdGlvbigpe3ZhciBhPU8uZ2FHbG9iYWw9Ty5nYUdsb2JhbHx8e307cmV0dXJuIGEuaGlkPWEuaGlkfHxoZCgpfTt2YXIgd2I9L14oVUF8WVR8TU98R1ApLShcZCspLShcZCspJC8scGM9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihlLGcpe2QubW9kZWwuZGF0YS5zZXQoZSxnKX1mdW5jdGlvbiBjKGUsZyl7YihlLGcpO2QuZmlsdGVycy5hZGQoZSl9dmFyIGQ9dGhpczt0aGlzLm1vZGVsPW5ldyBZYTt0aGlzLmZpbHRlcnM9bmV3IEhhO2IoVixhW1ZdKTtiKE5hLHNhKGFbTmFdKSk7YihVLGFbVV0pO2IoVyxhW1ddfHx4YSgpKTtiKFliLGFbWWJdKTtiKFpiLGFbWmJdKTtiKEhkLGFbSGRdKTtiKEJlLGFbQmVdKTtiKCRiLGFbJGJdKTtiKFdjLGFbV2NdKTtiKGJjLGFbYmNdKTtiKGNjLGFbY2NdKTtiKEthLGFbS2FdKTtiKGRjLGFbZGNdKTtiKGVjLGFbZWNdKTtiKGFjLGFbYWNdKTtiKEFkLGFbQWRdKTtiKG4sYVtuXSk7YihLZCxhW0tkXSk7YihqZSxhW2plXSk7YihaZSxhW1plXSk7YihvZSxhW29lXSk7YihKZSxhW0plXSk7YihGLGFbRl0pO2IoaGIsMSk7YihpYiwiajkyIik7YyhSZSxQZSk7YyhRYixNYSk7YyhvYSx1YSk7YyhkZCxjZCk7YyhSYixPYSk7YyhtZCx2Yik7YyhTYixuYyk7YyhVYyxZYyk7YyhUYixKYSk7YyhWYixUYSk7YyhWYyxIYyk7Yyh6ZCx5ZCk7YyhMZCxTZCk7Yyh6ZSxGZSk7YyhXYixQYSk7YyhYYixTYSk7YyhDZCxGZCh0aGlzKSk7cGQodGhpcy5tb2RlbCk7dGQodGhpcy5tb2RlbCxhW1FdKTt0aGlzLm1vZGVsLnNldChqYixMYygpKX07cGMucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tb2RlbC5nZXQoYSl9O3BjLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLm1vZGVsLnNldChhLGIpfTtwYy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihhKXtpZighKDE+YXJndW1lbnRzLmxlbmd0aCkpe2lmKCJzdHJpbmciPT09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGI9YXJndW1lbnRzWzBdO3ZhciBjPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpfWVsc2UgYj1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXVtWYV0sYz1hcmd1bWVudHM7YiYmKGM9emEobWVbYl18fFtdLGMpLGNbVmFdPWIsdGhpcy5tb2RlbC5zZXQoYyx2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KX19O3BjLnByb3RvdHlwZS5tYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7dShhLGMsYil8fCh2KGEsZnVuY3Rpb24oKXt1KGEsYyxiKX0pLHkoU3RyaW5nKGMuZ2V0KFYpKSxhLHZvaWQgMCxiLCEwKSl9O3ZhciB0ZD1mdW5jdGlvbihhLGIpe3ZhciBjPVAoYSxVKTthLmRhdGEuc2V0KGxhLCJfZ2EiPT1jPyJfZ2lkIjpjKyJfZ2lkIik7aWYoImNvb2tpZSI9PVAoYSxhYykpe2hjPSExO2M9Q2EoUChhLFUpKTtjPVhkKGEsYyk7aWYoIWMpe2M9UChhLFcpO3ZhciBkPVAoYSwkYil8fHhhKCk7Yz1YYygiX191dG1hIixkLGMpO3ZvaWQgMCE9Yz8oSigxMCksYz1jLk9bMV0rIi4iK2MuT1syXSk6Yz12b2lkIDB9YyYmKGhjPSEwKTtpZihkPWMmJiFhLmdldChIZCkpaWYoZD1jLnNwbGl0KCIuIiksMiE9ZC5sZW5ndGgpZD0hMTtlbHNlIGlmKGQ9TnVtYmVyKGRbMV0pKXt2YXIgZT1SKGEsWmIpO2Q9ZCtlPChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlM31lbHNlIGQ9ITE7ZCYmKGM9dm9pZCAwKTtjJiYoYS5kYXRhLnNldCh4ZCxjKSxhLmRhdGEuc2V0KFEsYyksKGM9dWMoYSkpJiZhLmRhdGEuc2V0KEksYykpO2EuZ2V0KGplKSYmKGM9YS5nZXQoY2UpLGQ9YS5nZXQoaWUpLCFjfHxkJiYiYXcuZHMiIT1kKSYmKGM9e30sZD0oTT9kZihjKTp7fSlbUChhLE5hKV0sbGUoYyksZCYmMCE9ZC5sZW5ndGgmJihjPWRbMF0sYS5kYXRhLnNldChmZSxjLnRpbWVzdGFtcC8xZTMpLGEuZGF0YS5zZXQoY2UsYy5xYSkpKTthLmdldChqZSkmJiFhLmdldChTZSkmJihjPXt9LGQ9KE0/ZGYoYywiX2dhY19nYiIsITApOnt9KVtQKGEsTmEpXSxlZihjKSxkJiYwIT1kLmxlbmd0aCYmKGM9ZFswXSxkPWMucWEsYy5sYWJlbHMmJmMubGFiZWxzLmxlbmd0aCYmKGQrPSIuIitjLmxhYmVscy5qb2luKCIuIikpLGEuZGF0YS5zZXQoVGUsYy50aW1lc3RhbXAvMWUzKSxhLmRhdGEuc2V0KFNlLGQpKSl9aWYoYS5nZXQoSGQpKXtjPWJlKCJfZ2EiLCEhYS5nZXQoY2MpKTt2YXIgZz1iZSgiX2dsIiwhIWEuZ2V0KGNjKSk7ZD1EZS5nZXQoYS5nZXQoY2MpKTtlPWQuX2dhO2cmJjA8Zy5pbmRleE9mKCJfZ2EqIikmJiFlJiZKKDMwKTtpZihifHwhYS5nZXQoSmUpKWc9ITE7ZWxzZSBpZihnPWEuZ2V0KEYpLHZvaWQgMD09PWd8fGcoImFuYWx5dGljc19zdG9yYWdlIikpZz0hMTtlbHNle0ooODQpO2EuZGF0YS5zZXQoTGUsMSk7aWYoZz1kLl91cClpZihnPUpjLmV4ZWMoTS5yZWZlcnJlcikpe2c9Z1sxXTt2YXIgY2E9TS5sb2NhdGlvbi5ob3N0bmFtZTtnPWNhPT09Z3x8MDw9Y2EuaW5kZXhPZigiLiIrZyl8fDA8PWcuaW5kZXhPZigiLiIrY2EpPyEwOiExfWVsc2UgZz0hMTtnPWc/ITA6ITF9Y2E9ZC5nY2xpZDt2YXIgbD1kLl9nYWM7aWYoY3x8ZXx8Y2F8fGwpaWYoYyYmZSYmSigzNiksYS5nZXQoYmMpfHx5ZShhLmdldChLZCkpfHxnKXtpZihlJiYoSigzOCksYS5kYXRhLnNldChRLGUpLGQuX2dpZCYmKEooNTEpLGEuZGF0YS5zZXQoSSxkLl9naWQpKSksY2E/KEooODIpLGEuZGF0YS5zZXQoY2UsY2EpLGQuZ2Nsc3JjJiZhLmRhdGEuc2V0KGllLGQuZ2Nsc3JjKSk6bCYmKGU9bC5zcGxpdCgiLiIpKSYmMj09PWUubGVuZ3RoJiYoSigzNyksYS5kYXRhLnNldChjZSxlWzBdKSxhLmRhdGEuc2V0KGZlLGVbMV0pKSwoZD1kLl9mcGxjKSYmUChhLG9lKSYmKEooODMpLGEuZGF0YS5zZXQoQWUsZCkpLGMpYjppZihkPWMuaW5kZXhPZigiLiIpLC0xPT1kKUooMjIpO2Vsc2V7ZT1jLnN1YnN0cmluZygwLGQpO2c9Yy5zdWJzdHJpbmcoZCsxKTtkPWcuaW5kZXhPZigiLiIpO2M9Zy5zdWJzdHJpbmcoMCxkKTtnPWcuc3Vic3RyaW5nKGQrMSk7aWYoIjEiPT1lKXtpZihkPWcsa2UoZCxjKSl7SigyMyk7YnJlYWsgYn19ZWxzZSBpZigiMiI9PWUpe2Q9Zy5pbmRleE9mKCItIik7ZT0iIjswPGQ/KGU9Zy5zdWJzdHJpbmcoMCxkKSxkPWcuc3Vic3RyaW5nKGQrMSkpOmQ9Zy5zdWJzdHJpbmcoMSk7aWYoa2UoZStkLGMpKXtKKDUzKTticmVhayBifWUmJihKKDIpLGEuZGF0YS5zZXQoSSxlKSl9ZWxzZXtKKDIyKTticmVhayBifUooMTEpO2EuZGF0YS5zZXQoUSxkKTtpZihjPWJlKCJfZ2FjIiwhIWEuZ2V0KGNjKSkpYz1jLnNwbGl0KCIuIiksIjEiIT1jWzBdfHw0IT1jLmxlbmd0aD9KKDcyKTprZShjWzNdLGNbMV0pP0ooNzEpOihhLmRhdGEuc2V0KGNlLGNbM10pLGEuZGF0YS5zZXQoZmUsY1syXSksSig3MCkpfX1lbHNlIEooMjEpfWImJihKKDkpLGEuZGF0YS5zZXQoUSxLKGIpKSk7YS5nZXQoUSl8fChiPShiPU8uZ2FHbG9iYWwpJiZiLmZyb21fY29va2llJiYiY29va2llIiE9PVAoYSxhYyk/dm9pZCAwOihiPWImJmIudmlkKSYmLTEhPT1iLnNlYXJjaChqZCk/Yjp2b2lkIDAsYj8oSigxNyksYS5kYXRhLnNldChRLGIpKTooSig4KSxhLmRhdGEuc2V0KFEscmEoKSkpKTthLmdldChJKXx8KEooMyksYS5kYXRhLnNldChJLHJhKCkpKTttYyhhKTtiPU8uZ2FHbG9iYWw9Ty5nYUdsb2JhbHx8e307Yz1QKGEsUSk7YT1jPT09UChhLHhkKTtpZih2b2lkIDA9PWIudmlkfHxhJiYhYi5mcm9tX2Nvb2tpZSliLnZpZD1jLGIuZnJvbV9jb29raWU9YX0scGQ9ZnVuY3Rpb24oYSl7dmFyIGI9Ty5uYXZpZ2F0b3IsYz1PLnNjcmVlbixkPU0ubG9jYXRpb24sZT1hLnNldDthOnt2YXIgZz0hIWEuZ2V0KGVjKSxjYT0hIWEuZ2V0KEtkKTt2YXIgbD1NLnJlZmVycmVyO2lmKC9eKGh0dHBzP3xhbmRyb2lkLWFwcCk6XC9cLy9pLnRlc3QobCkpe2lmKGcpYnJlYWsgYTtnPSIvLyIrTS5sb2NhdGlvbi5ob3N0bmFtZTtpZighZGUobCxnKSl7aWYoY2EmJihjYT1nLnJlcGxhY2UoL1wuL2csIi0iKSsiLmNkbi5hbXBwcm9qZWN0Lm9yZyIsZGUobCxjYSkpKXtsPXZvaWQgMDticmVhayBhfWJyZWFrIGF9fWw9dm9pZCAwfWUuY2FsbChhLGxiLGwpO2QmJihlPWQucGF0aG5hbWV8fCIiLCIvIiE9ZS5jaGFyQXQoMCkmJihKKDMxKSxlPSIvIitlKSxhLnNldChrYixkLnByb3RvY29sKyIvLyIrZC5ob3N0bmFtZStlK2Quc2VhcmNoKSk7YyYmYS5zZXQocWIsYy53aWR0aCsieCIrYy5oZWlnaHQpO2MmJmEuc2V0KHBiLGMuY29sb3JEZXB0aCsiLWJpdCIpO2M9TS5kb2N1bWVudEVsZW1lbnQ7bD0oZT1NLmJvZHkpJiZlLmNsaWVudFdpZHRoJiZlLmNsaWVudEhlaWdodDtjYT1bXTtjJiZjLmNsaWVudFdpZHRoJiZjLmNsaWVudEhlaWdodCYmKCJDU1MxQ29tcGF0Ij09PU0uY29tcGF0TW9kZXx8IWwpP2NhPVtjLmNsaWVudFdpZHRoLGMuY2xpZW50SGVpZ2h0XTpsJiYoY2E9W2UuY2xpZW50V2lkdGgsZS5jbGllbnRIZWlnaHRdKTtjPTA+PWNhWzBdfHwwPj1jYVsxXT8iIjpjYS5qb2luKCJ4Iik7YS5zZXQocmIsYyk7Yz1hLnNldDt2YXIgaztpZigoZT0oZT1PLm5hdmlnYXRvcik/ZS5wbHVnaW5zOm51bGwpJiZlLmxlbmd0aClmb3IobD0wO2w8ZS5sZW5ndGgmJiFrO2wrKyljYT1lW2xdLC0xPGNhLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJihrPWNhLmRlc2NyaXB0aW9uKTtpZighayl0cnl7dmFyIHc9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjciKTtrPXcuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2goQ2Upe31pZighayl0cnl7dz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNiIpLGs9IldJTiA2LDAsMjEsMCIsdy5BbGxvd1NjcmlwdEFjY2Vzcz0iYWx3YXlzIixrPXcuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2goQ2Upe31pZighayl0cnl7dz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSxrPXcuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2goQ2Upe31rJiYodz1rLm1hdGNoKC9bXGRdKy9nKSkmJjM8PXcubGVuZ3RoJiYoaz13WzBdKyIuIit3WzFdKyIgciIrd1syXSk7Yy5jYWxsKGEsdGIsa3x8dm9pZCAwKTthLnNldChvYixNLmNoYXJhY3RlclNldHx8TS5jaGFyc2V0KTthLnNldChzYixiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuamF2YUVuYWJsZWQmJmIuamF2YUVuYWJsZWQoKXx8ITEpO2Euc2V0KG5iLChiJiYoYi5sYW5ndWFnZXx8Yi5icm93c2VyTGFuZ3VhZ2UpfHwiIikudG9Mb3dlckNhc2UoKSk7YS5kYXRhLnNldChjZSxiZSgiZ2NsaWQiLCEwKSk7YS5kYXRhLnNldChpZSxiZSgiZ2Nsc3JjIiwhMCkpO2EuZGF0YS5zZXQoZmUsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKTthLmdldChjZSl8fChhLmRhdGEuc2V0KFNlLGJlKCJ3YnJhaWQiLCEwKSksYS5kYXRhLnNldChUZSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpKTtpZihkJiZhLmdldChjYykmJihiPU0ubG9jYXRpb24uaGFzaCkpe2I9Yi5zcGxpdCgvWz8mI10rLyk7ZD1bXTtmb3Ioaz0wO2s8Yi5sZW5ndGg7KytrKShEKGJba10sInV0bV9pZCIpfHxEKGJba10sInV0bV9jYW1wYWlnbiIpfHxEKGJba10sInV0bV9zb3VyY2UiKXx8RChiW2tdLCJ1dG1fbWVkaXVtIil8fEQoYltrXSwidXRtX3Rlcm0iKXx8RChiW2tdLCJ1dG1fY29udGVudCIpfHxEKGJba10sImdjbGlkIil8fEQoYltrXSwiZGNsaWQiKXx8RChiW2tdLCJnY2xzcmMiKXx8RChiW2tdLCJ3YnJhaWQiKSkmJmQucHVzaChiW2tdKTswPGQubGVuZ3RoJiYoYj0iIyIrZC5qb2luKCImIiksYS5zZXQoa2IsYS5nZXQoa2IpK2IpKX19LG1lPXtwYWdldmlldzpbbWJdLGV2ZW50Olt1Yix4Yix5Yix6Yl0sc29jaWFsOltCYixDYixEYl0sdGltaW5nOltNYixOYixQYixPYl19O3ZhciByYz1mdW5jdGlvbihhKXtpZigicHJlcmVuZGVyIj09TS52aXNpYmlsaXR5U3RhdGUpcmV0dXJuITE7YSgpO3JldHVybiEwfSx6PWZ1bmN0aW9uKGEpe2lmKCFyYyhhKSl7SigxNik7dmFyIGI9ITEsYz1mdW5jdGlvbigpe2lmKCFiJiZyYyhhKSl7Yj0hMDt2YXIgZD1jLGU9TTtlLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixkLCExKTplLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbnZpc2liaWxpdHljaGFuZ2UiLGQpfX07TChNLCJ2aXNpYmlsaXR5Y2hhbmdlIixjKX19O3ZhciB0ZT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLyxzYz1mdW5jdGlvbihhKXtpZihlYShhWzBdKSl0aGlzLnU9YVswXTtlbHNle3ZhciBiPXRlLmV4ZWMoYVswXSk7bnVsbCE9YiYmND09Yi5sZW5ndGgmJih0aGlzLmRhPWJbMV18fCJ0MCIsdGhpcy5LPWJbMl18fCIiLHRoaXMubWV0aG9kTmFtZT1iWzNdLHRoaXMuYWE9W10uc2xpY2UuY2FsbChhLDEpLHRoaXMuS3x8KHRoaXMuQT0iY3JlYXRlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuaT0icmVxdWlyZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmc9InByb3ZpZGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5iYT0icmVtb3ZlIj09dGhpcy5tZXRob2ROYW1lKSx0aGlzLmkmJigzPD10aGlzLmFhLmxlbmd0aD8odGhpcy5YPXRoaXMuYWFbMV0sdGhpcy5XPXRoaXMuYWFbMl0pOnRoaXMuYWFbMV0mJihxYSh0aGlzLmFhWzFdKT90aGlzLlg9dGhpcy5hYVsxXTp0aGlzLlc9dGhpcy5hYVsxXSkpKTtiPWFbMV07YT1hWzJdO2lmKCF0aGlzLm1ldGhvZE5hbWUpdGhyb3ciYWJvcnQiO2lmKHRoaXMuaSYmKCFxYShiKXx8IiI9PWIpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighcWEoYil8fCIiPT1ifHwhZWEoYSkpKXRocm93ImFib3J0IjtpZih1ZCh0aGlzLmRhKXx8dWQodGhpcy5LKSl0aHJvdyJhYm9ydCI7aWYodGhpcy5nJiYidDAiIT10aGlzLmRhKXRocm93ImFib3J0In19O2Z1bmN0aW9uIHVkKGEpe3JldHVybiAwPD1hLmluZGV4T2YoIi4iKXx8MDw9YS5pbmRleE9mKCI6Iil9dmFyIFlkLFpkLCRkLEE7WWQ9bmV3IGVlOyRkPW5ldyBlZTtBPW5ldyBlZTtaZD17ZWM6NDUsZWNvbW1lcmNlOjQ2LGxpbmtpZDo0N307dmFyIHU9ZnVuY3Rpb24oYSxiLGMpe2I9PU58fGIuZ2V0KFYpO3ZhciBkPVlkLmdldChhKTtpZighZWEoZCkpcmV0dXJuITE7Yi5wbHVnaW5zXz1iLnBsdWdpbnNffHxuZXcgZWU7aWYoYi5wbHVnaW5zXy5nZXQoYSkpcmV0dXJuITA7Yi5wbHVnaW5zXy5zZXQoYSxuZXcgZChiLGN8fHt9KSk7cmV0dXJuITB9LHk9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZighZWEoWWQuZ2V0KGIpKSYmISRkLmdldChiKSl7WmQuaGFzT3duUHJvcGVydHkoYikmJkooWmRbYl0pO2E9Ti5qKGEpO3ZhciBnPXZvaWQgMDtpZihwLnRlc3QoYikpe0ooNTIpO2lmKCFhKXJldHVybiEwO2M9S2UoYS5tb2RlbCxiLGQsZSk7Zz1mdW5jdGlvbigpe1ouRChbInByb3ZpZGUiLGIsZnVuY3Rpb24oKXt9XSk7dmFyIGw9T1tkJiZkLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO2wmJmwuaGlkZSYmZWEobC5oaWRlLmVuZCkmJmwuaGlkZVtiXSYmKGwuaGlkZS5lbmQoKSxsLmhpZGUuZW5kPXZvaWQgMCl9fSFjJiZaZC5oYXNPd25Qcm9wZXJ0eShiKT8oSigzOSksYz1iKyIuanMiKTpKKDQzKTtpZihjKXtpZihhKXt2YXIgY2E9YS5nZXQob2UpO3FhKGNhKXx8KGNhPXZvaWQgMCl9YT1hZShjZihjLGNhKSk7YT0hY2F8fG5lKGEucHJvdG9jb2wpJiZCKGEpP2E6YWUoY2YoYykpO25lKGEucHJvdG9jb2wpJiZCKGEpJiYoSWQoYS51cmwsdm9pZCAwLGUsdm9pZCAwLGcpLCRkLnNldChiLCEwKSl9fX0sdj1mdW5jdGlvbihhLGIpe3ZhciBjPUEuZ2V0KGEpfHxbXTtjLnB1c2goYik7QS5zZXQoYSxjKX0sQz1mdW5jdGlvbihhLGIpe1lkLnNldChhLGIpO2I9QS5nZXQoYSl8fFtdO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10oKTtBLnNldChhLFtdKX0sQj1mdW5jdGlvbihhKXt2YXIgYj1hZShNLmxvY2F0aW9uLmhyZWYpO2lmKEQoYS51cmwsR2UoMSkpfHxEKGEudXJsLEdlKDIpKSlyZXR1cm4hMDtpZihhLnF1ZXJ5fHwwPD1hLnVybC5pbmRleE9mKCI/Iil8fDA8PWEucGF0aC5pbmRleE9mKCI6Ly8iKSlyZXR1cm4hMTtpZihhLmhvc3Q9PWIuaG9zdCYmYS5wb3J0PT1iLnBvcnQpcmV0dXJuITA7Yj0iaHR0cDoiPT1hLnByb3RvY29sPzgwOjQ0MztyZXR1cm4id3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tIj09YS5ob3N0JiYoYS5wb3J0fHxiKT09YiYmRChhLnBhdGgsIi9wbHVnaW5zLyIpPyEwOiExfSxuZT1mdW5jdGlvbihhKXt2YXIgYj1NLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT1hfHxhPT1iPyEwOiJodHRwOiIhPWE/ITE6Imh0dHA6Ij09Yn0sYWU9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihsKXt2YXIgaz1sLmhvc3RuYW1lfHwiIix3PTA8PWsuaW5kZXhPZigiXSIpO2s9ay5zcGxpdCh3PyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7dyYmKGsrPSJdIik7dz0obC5wcm90b2NvbHx8IiIpLnRvTG93ZXJDYXNlKCk7dz0xKmwucG9ydHx8KCJodHRwOiI9PXc/ODA6Imh0dHBzOiI9PXc/NDQzOiIiKTtsPWwucGF0aG5hbWV8fCIiO0QobCwiLyIpfHwobD0iLyIrbCk7cmV0dXJuW2ssIiIrdyxsXX12YXIgYz1NLmNyZWF0ZUVsZW1lbnQoImEiKTtjLmhyZWY9TS5sb2NhdGlvbi5ocmVmO3ZhciBkPShjLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxlPWIoYyksZz1jLnNlYXJjaHx8IiIsY2E9ZCsiLy8iK2VbMF0rKGVbMV0/IjoiK2VbMV06IiIpO0QoYSwiLy8iKT9hPWQrYTpEKGEsIi8iKT9hPWNhK2E6IWF8fEQoYSwiPyIpP2E9Y2ErZVsyXSsoYXx8Zyk6MD5hLnNwbGl0KCIvIilbMF0uaW5kZXhPZigiOiIpJiYoYT1jYStlWzJdLnN1YnN0cmluZygwLGVbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK2EpO2MuaHJlZj1hO2Q9YihjKTtyZXR1cm57cHJvdG9jb2w6KGMucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGhvc3Q6ZFswXSxwb3J0OmRbMV0scGF0aDpkWzJdLHF1ZXJ5OmMuc2VhcmNofHwiIix1cmw6YXx8IiJ9fSxjZj1mdW5jdGlvbihhLGIpe3JldHVybiBhJiYwPD1hLmluZGV4T2YoIi8iKT9hOihifHxiZCghMSkpKyIvcGx1Z2lucy91YS8iK2F9O3ZhciBaPXtnYTpmdW5jdGlvbigpe1ouZmE9W119fTtaLmdhKCk7Wi5EPWZ1bmN0aW9uKGEpe3ZhciBiPVouSi5hcHBseShaLGFyZ3VtZW50cyk7Yj1aLmZhLmNvbmNhdChiKTtmb3IoWi5mYT1bXTswPGIubGVuZ3RoJiYhWi52KGJbMF0pJiYhKGIuc2hpZnQoKSwwPFouZmEubGVuZ3RoKTspO1ouZmE9Wi5mYS5jb25jYXQoYil9O1ouSj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdHJ5e3ZhciBkPW5ldyBzYyhhcmd1bWVudHNbY10pO2QuZz9DKGQuYWFbMF0sZC5hYVsxXSk6KGQuaSYmKGQuaGE9eShkLmRhLGQuYWFbMF0sZC5YLGQuVykpLGIucHVzaChkKSl9Y2F0Y2goZSl7fXJldHVybiBifTtaLnY9ZnVuY3Rpb24oYSl7dHJ5e2lmKGEudSlhLnUuY2FsbChPLE4uaigidDAiKSk7ZWxzZXt2YXIgYj1hLmRhPT1nYj9OOk4uaihhLmRhKTtpZihhLkEpe2lmKCJ0MCI9PWEuZGEmJihiPU4uY3JlYXRlLmFwcGx5KE4sYS5hYSksbnVsbD09PWIpKXJldHVybiEwfWVsc2UgaWYoYS5iYSlOLnJlbW92ZShhLmRhKTtlbHNlIGlmKGIpaWYoYS5pKXtpZihhLmhhJiYoYS5oYT15KGEuZGEsYS5hYVswXSxhLlgsYS5XKSksIXUoYS5hYVswXSxiLGEuVykpcmV0dXJuITB9ZWxzZSBpZihhLkspe3ZhciBjPWEubWV0aG9kTmFtZSxkPWEuYWEsZT1iLnBsdWdpbnNfLmdldChhLkspO2VbY10uYXBwbHkoZSxkKX1lbHNlIGJbYS5tZXRob2ROYW1lXS5hcHBseShiLGEuYWEpfX1jYXRjaChnKXt9fTt2YXIgTj1mdW5jdGlvbihhKXtKKDEpO1ouRC5hcHBseShaLFthcmd1bWVudHNdKX07Ti5oPXt9O04uUD1bXTtOLkw9MDtOLnlhPTA7Ti5hbnN3ZXI9NDI7dmFyIHdlPVtOYSxXLFZdO04uY3JlYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXphKHdlLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7YltWXXx8KGJbVl09InQwIik7dmFyIGM9IiIrYltWXTtpZihOLmhbY10pcmV0dXJuIE4uaFtjXTtpZihkYShiKSlyZXR1cm4gbnVsbDtiPW5ldyBwYyhiKTtOLmhbY109YjtOLlAucHVzaChiKTtjPXFjKCkudHJhY2tlcl9jcmVhdGVkO2lmKGVhKGMpKXRyeXtjKGIpfWNhdGNoKGQpe31yZXR1cm4gYn07Ti5yZW1vdmU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxOLlAubGVuZ3RoO2IrKylpZihOLlBbYl0uZ2V0KFYpPT1hKXtOLlAuc3BsaWNlKGIsMSk7Ti5oW2FdPW51bGw7YnJlYWt9fTtOLmo9ZnVuY3Rpb24oYSl7cmV0dXJuIE4uaFthXX07Ti5nZXRBbGw9ZnVuY3Rpb24oKXtyZXR1cm4gTi5QLnNsaWNlKDApfTtOLk49ZnVuY3Rpb24oKXsiZ2EiIT1nYiYmSig0OSk7dmFyIGE9T1tnYl07aWYoIWF8fDQyIT1hLmFuc3dlcil7Ti5MPWEmJmEubDtOLnlhPTEqbmV3IERhdGU7Ti5sb2FkZWQ9ITA7dmFyIGI9T1tnYl09TjtYKCJjcmVhdGUiLGIsYi5jcmVhdGUpO1goInJlbW92ZSIsYixiLnJlbW92ZSk7WCgiZ2V0QnlOYW1lIixiLGIuaiw1KTtYKCJnZXRBbGwiLGIsYi5nZXRBbGwsNik7Yj1wYy5wcm90b3R5cGU7WCgiZ2V0IixiLGIuZ2V0LDcpO1goInNldCIsYixiLnNldCw0KTtYKCJzZW5kIixiLGIuc2VuZCk7WCgicmVxdWlyZVN5bmMiLGIsYi5tYSk7Yj1ZYS5wcm90b3R5cGU7WCgiZ2V0IixiLGIuZ2V0KTtYKCJzZXQiLGIsYi5zZXQpO2lmKCJodHRwczoiIT1NLmxvY2F0aW9uLnByb3RvY29sJiYhQmEpe2E6e2I9TS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmMTAwPmM7YysrKXt2YXIgZD1iW2NdLnNyYztpZihkJiYwPT1kLmluZGV4T2YoYmQoITApKyIvYW5hbHl0aWNzIikpe2I9ITA7YnJlYWsgYX19Yj0hMX1iJiYoQmE9ITApfShPLmdhcGx1Z2lucz1PLmdhcGx1Z2luc3x8e30pLkxpbmtlcj1EYztiPURjLnByb3RvdHlwZTtDKCJsaW5rZXIiLERjKTtYKCJkZWNvcmF0ZSIsYixiLmNhLDIwKTtYKCJhdXRvTGluayIsYixiLlMsMjUpO1goInBhc3N0aHJvdWdoIixiLGIuJCwyNSk7QygiZGlzcGxheWZlYXR1cmVzIixmZCk7QygiYWRmZWF0dXJlcyIsZmQpO2E9YSYmYS5xO2thKGEpP1ouRC5hcHBseShOLGEpOkooNTApfX07dmFyIGdmPU4uTixoZj1PW2diXTtoZiYmaGYucj9nZigpOnooZ2YpO3ooZnVuY3Rpb24oKXtaLkQoWyJwcm92aWRlIiwicmVuZGVyIix1YV0pfSl9KSh3aW5kb3cpfSkoKX0K"},{"name":"sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0ICRfX19tb2NrXzNiZDVkMWRmODdiZmYwNWE9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7bGV0IGlzU2VhbGVkPWZhbHNlO2NsYXNzIFN0b3JhZ2V7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfX1nZXQgbGVuZ3RoKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aH1rZXkoaW5kZXgpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7aWYoaW5kZXg8MHx8aW5kZXg+PWtleXMubGVuZ3RoKXtyZXR1cm4gbnVsbH1yZXR1cm4ga2V5c1tpbmRleF19Z2V0SXRlbShrZXkpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcyxrZXkpP3RoaXNba2V5XTpudWxsfXNldEl0ZW0oa2V5LHZhbHVlKXt0aGlzW2tleV09U3RyaW5nKHZhbHVlKX1yZW1vdmVJdGVtKGtleSl7ZGVsZXRlIHRoaXNba2V5XX1jbGVhcigpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7Zm9yKGNvbnN0IGtleSBvZiBrZXlzKXtkZWxldGUgdGhpc1trZXldfX19ZXhwb3J0cy5TdG9yYWdlPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6U3RvcmFnZSx3cml0YWJsZTp0cnVlfTtjb25zdCBsb2NhbFN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5sb2NhbFN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSxnZXQoKXtyZXR1cm4gbG9jYWxTdG9yYWdlfX07Y29uc3Qgc2Vzc2lvblN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5zZXNzaW9uU3RvcmFnZT17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLGdldCgpe3JldHVybiBzZXNzaW9uU3RvcmFnZX19O2lzU2VhbGVkPXRydWV9KSgkX19fbW9ja18zYmQ1ZDFkZjg3YmZmMDVhKTtjb25zdCAkX19fbW9ja19jZjNlMjY0MWE2YTA1N2RlPXt9OyhleHBvcnRzPT57InVzZSBzdHJpY3QiO2NvbnN0IHhoclVuc2VudD0wO2NvbnN0IHhock9wZW5lZD0xO2NvbnN0IHhockhlYWRlcnNSZWNlaXZlZD0yO2NvbnN0IHhockxvYWRpbmc9Mztjb25zdCB4aHJEb25lPTQ7Y29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2w9U3ltYm9sKCJkZWZlcnJlZEhhbmRsZSIpO2NvbnN0IHhock9uTG9hZFN0YXJ0U3ltYm9sPVN5bWJvbCgib25sb2Fkc3RhcnQiKTtjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sPVN5bWJvbCgib25wcm9ncmVzcyIpO2NvbnN0IHhock9uQWJvcnRTeW1ib2w9U3ltYm9sKCJvbmFib3J0Iik7Y29uc3QgeGhyT25FcnJvclN5bWJvbD1TeW1ib2woIm9uZXJyb3IiKTtjb25zdCB4aHJPbkxvYWRTeW1ib2w9U3ltYm9sKCJvbmxvYWQiKTtjb25zdCB4aHJPblRpbWVvdXRTeW1ib2w9U3ltYm9sKCJvbnRpbWVvdXQiKTtjb25zdCB4aHJPbkxvYWRFbmRTeW1ib2w9U3ltYm9sKCJvbmxvYWRlbmQiKTtjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2w9U3ltYm9sKCJvbnJlYWR5c3RhdGVjaGFuZ2UiKTtjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sPVN5bWJvbCgicmVhZHlTdGF0ZSIpO2NvbnN0IHhoclRpbWVvdXRTeW1ib2w9U3ltYm9sKCJ0aW1lb3V0Iik7Y29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIik7Y29uc3QgeGhyVXBsb2FkU3ltYm9sPVN5bWJvbCgidXBsb2FkIik7Y29uc3QgeGhyUmVzcG9uc2VUeXBlU3ltYm9sPVN5bWJvbCgicmVzcG9uc2VUeXBlIik7Y29uc3QgZGVmaW5lRXZlbnQ9KG9iaixzeW1ib2wpPT57Y29uc3QgdHlwZT1zeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosc3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpudWxsLHdyaXRhYmxlOnRydWV9KTtvYmouYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGZ1bmN0aW9uKGV2ZW50KXtjb25zdCBoYW5kbGVyPXRoaXNbc3ltYm9sXTtpZihoYW5kbGVyKXtoYW5kbGVyLmNhbGwodGhpcyxldmVudCl9fSl9O2NvbnN0IGNoYW5nZVJlYWR5U3RhdGU9KHhocixyZWFkeVN0YXRlKT0+e3hoclt4aHJSZWFkeVN0YXRlU3ltYm9sXT1yZWFkeVN0YXRlO3hoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVhZHlzdGF0ZWNoYW5nZSIpKX07bGV0IGlzU2VhbGVkPXRydWU7Y2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtpZighKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkmJiEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0VXBsb2FkKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWRlZmluZUV2ZW50KHRoaXMseGhyT25Mb2FkU3RhcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25Qcm9ncmVzc1N5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkFib3J0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uRXJyb3JTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25Mb2FkU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uVGltZW91dFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRFbmRTeW1ib2wpfWdldCBvbmxvYWRzdGFydCgpe3JldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXX1zZXQgb25sb2Fkc3RhcnQodmFsdWUpe3RoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdPXZhbHVlfWdldCBvbnByb2dyZXNzKCl7cmV0dXJuIHRoaXNbeGhyT25Qcm9ncmVzc1N5bWJvbF19c2V0IG9ucHJvZ3Jlc3ModmFsdWUpe3RoaXNbeGhyT25Qcm9ncmVzc1N5bWJvbF09dmFsdWV9Z2V0IG9uYWJvcnQoKXtyZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXX1zZXQgb25hYm9ydCh2YWx1ZSl7dGhpc1t4aHJPbkFib3J0U3ltYm9sXT12YWx1ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdfXNldCBvbmVycm9yKHZhbHVlKXt0aGlzW3hock9uRXJyb3JTeW1ib2xdPXZhbHVlfWdldCBvbnRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdfXNldCBvbnRpbWVvdXQodmFsdWUpe3RoaXNbeGhyT25UaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgb25sb2FkZW5kKCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXX1zZXQgb25sb2FkZW5kKHZhbHVlKXt0aGlzW3hock9uTG9hZEVuZFN5bWJvbF09dmFsdWV9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldD17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsd3JpdGFibGU6dHJ1ZX07Y2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7aWYoaXNTZWFsZWQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKX1zdXBlcigpfX1leHBvcnRzLlhNTEh0dHBSZXF1ZXN0VXBsb2FkPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RVcGxvYWQsd3JpdGFibGU6dHJ1ZX07Y2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtpc1NlYWxlZD1mYWxzZTtjb25zdCB4aHJVcGxvYWQ9bmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkO2lzU2VhbGVkPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO2RlZmluZUV2ZW50KHRoaXMseGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZWFkeVN0YXRlU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVbnNlbnQsd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclRpbWVvdXRTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOjAsd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6ZmFsc2Usd3JpdGFibGU6dHJ1ZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclVwbG9hZFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6eGhyVXBsb2FkLHdyaXRhYmxlOmZhbHNlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyUmVzcG9uc2VUeXBlU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZToiIix3cml0YWJsZTp0cnVlfSl9Z2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpe3JldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSl7dGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdPXZhbHVlfWdldCByZWFkeVN0YXRlKCl7cmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF19b3BlbihtZXRob2QsdXJsKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJEb25lOntjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyT3BlbmVkKTticmVha319fXNldFJlcXVlc3RIZWFkZXIobmFtZSx2YWx1ZSl7fXNldFRydXN0VG9rZW4odHJ1c3RUb2tlbil7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbeGhyVGltZW91dFN5bWJvbF19c2V0IHRpbWVvdXQodmFsdWUpe3RoaXNbeGhyVGltZW91dFN5bWJvbF09dmFsdWV9Z2V0IHdpdGhDcmVkZW50aWFscygpe3JldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF19c2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSl7c3dpdGNoKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pe2Nhc2UgeGhyVW5zZW50OmNhc2UgeGhyT3BlbmVkOnticmVha31kZWZhdWx0Ont0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAnd2l0aENyZWRlbnRpYWxzJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELiIpfX10aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF09ISF2YWx1ZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbeGhyVXBsb2FkU3ltYm9sXX1zZW5kKCl7aWYodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXT09PXhock9wZW5lZCYmdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09PT1udWxsKXt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1zZXRUaW1lb3V0KCgpPT57dGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09bnVsbDtjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyRG9uZSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWVsc2V7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIGV4ZWN1dGUgJ3NlbmQnIG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSBvYmplY3QncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4iKX19YWJvcnQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSE9PW51bGwpe2NsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7dGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF09bnVsbDtjaGFuZ2VSZWFkeVN0YXRlKHRoaXMseGhyVW5zZW50KTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImFib3J0IikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX19Z2V0IHJlc3BvbnNlVVJMKCl7cmV0dXJuIiJ9Z2V0IHN0YXR1cygpe3JldHVybiAwfWdldCBzdGF0dXNUZXh0KCl7cmV0dXJuIiJ9Z2V0UmVzcG9uc2VIZWFkZXIobmFtZSl7cmV0dXJuIG51bGx9b3ZlcnJpZGVNaW1lVHlwZShtaW1lKXt9Z2V0IHJlc3BvbnNlVHlwZSgpe3JldHVybiB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF19c2V0IHJlc3BvbnNlVHlwZSh2YWx1ZSl7c3dpdGNoKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pe2Nhc2UgeGhyRG9uZTp7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3Jlc3BvbnNlVHlwZScgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLiIpfX1zd2l0Y2godmFsdWUpe2Nhc2UiIjpjYXNlImFycmF5YnVmZmVyIjpjYXNlImJsb2IiOmNhc2UiZG9jdW1lbnQiOmNhc2UianNvbiI6Y2FzZSJ0ZXh0Ijp7dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdPXZhbHVlO2JyZWFrfX19Z2V0IHJlc3BvbnNlKCl7Y29uc3QgcmVzcG9uc2VUeXBlPXRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTtyZXR1cm4gcmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Ij8iIjpudWxsfWdldCByZXNwb25zZVRleHQoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO2lmKHJlc3BvbnNlVHlwZT09PSIifHxyZXNwb25zZVR5cGU9PT0idGV4dCIpe3JldHVybiIifWVsc2V7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9fWdldCByZXNwb25zZVhNTCgpe3JldHVybiBudWxsfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIlVOU0VOVCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyVW5zZW50fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJPUEVORUQiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhock9wZW5lZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhySGVhZGVyc1JlY2VpdmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJMT0FESU5HIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJMb2FkaW5nfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJET05FIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJEb25lfSk7ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdD17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlhNTEh0dHBSZXF1ZXN0LHdyaXRhYmxlOnRydWV9fSkoJF9fX21vY2tfY2YzZTI2NDFhNmEwNTdkZSk7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe3ZhciByPXdpbmRvdy53ZWJwYWNrSnNvbnA7d2luZG93LndlYnBhY2tKc29ucD1mdW5jdGlvbihuLHQsbyl7Zm9yKHZhciBjLGEsaSx1PTAscD1bXTt1PG4ubGVuZ3RoO3UrKylhPW5bdV0sX1thXSYmcC5wdXNoKF9bYV1bMF0pLF9bYV09MDtmb3IoYyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGMpJiYoZVtjXT10W2NdKTtmb3IociYmcihuLHQsbyk7cC5sZW5ndGg7KXAuc2hpZnQoKSgpO2lmKG8pZm9yKHU9MDt1PG8ubGVuZ3RoO3UrKylpPV9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zPW9bdV0pO3JldHVybiBpfTt2YXIgbj17fSxfPXs1OjB9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18ocil7Y29uc3QgJF9fX29sZF9jZDhmODQxZTA3NDk2ZWZkPXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csImxvY2FsU3RvcmFnZSIpLCRfX19vbGRfMTk0M2QxNTcyMzIzNzUyMD17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJzZXNzaW9uU3RvcmFnZSIpLCRfX19vbGRfOTM2Y2JkMmY3MzI1OTQwZD17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpO3RyeXtpZigkX19fb2xkX2NkOGY4NDFlMDc0OTZlZmQpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX21vY2tfM2JkNWQxZGY4N2JmZjA1YS5sb2NhbFN0b3JhZ2UpO2lmKCRfX19vbGRfMTk0M2QxNTcyMzIzNzUyMCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywic2Vzc2lvblN0b3JhZ2UiLCRfX19tb2NrXzNiZDVkMWRmODdiZmYwNWEuc2Vzc2lvblN0b3JhZ2UpO2lmKCRfX19vbGRfOTM2Y2JkMmY3MzI1OTQwZCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19tb2NrX2NmM2UyNjQxYTZhMDU3ZGUuWE1MSHR0cFJlcXVlc3QpO3JldHVybiBmdW5jdGlvbigpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgXz1uW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKF8uZXhwb3J0cyxfLF8uZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKSxfLmw9ITAsXy5leHBvcnRzfS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtpZigkX19fb2xkX2NkOGY4NDFlMDc0OTZlZmQpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX29sZF9jZDhmODQxZTA3NDk2ZWZkKTtpZigkX19fb2xkXzE5NDNkMTU3MjMyMzc1MjApKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csInNlc3Npb25TdG9yYWdlIiwkX19fb2xkXzE5NDNkMTU3MjMyMzc1MjApO2lmKCRfX19vbGRfOTM2Y2JkMmY3MzI1OTQwZCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19vbGRfOTM2Y2JkMmY3MzI1OTQwZCl9fV9fd2VicGFja19yZXF1aXJlX18uZT1mdW5jdGlvbihlKXt2YXIgcj1fW2VdO2lmKDA9PT1yKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtlKCl9KTtpZihyKXJldHVybiByWzJdO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4sdCl7cj1fW2VdPVtuLHRdfSk7clsyXT1uO3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtvLnR5cGU9InRleHQvamF2YXNjcmlwdCIsby5jaGFyc2V0PSJ1dGYtOCIsby5hc3luYz0hMCxvLnRpbWVvdXQ9MTJlNCxfX3dlYnBhY2tfcmVxdWlyZV9fLm5jJiZvLnNldEF0dHJpYnV0ZSgibm9uY2UiLF9fd2VicGFja19yZXF1aXJlX18ubmMpLG8uc3JjPV9fd2VicGFja19yZXF1aXJlX18ucCsiIitlKyIuYTExM2IxMzZlYmRjZTAxY2YxNmQuY2h1bmsuanMiO3ZhciBjPXNldFRpbWVvdXQob25TY3JpcHRDb21wbGV0ZSwxMmU0KTtmdW5jdGlvbiBvblNjcmlwdENvbXBsZXRlKCl7by5vbmVycm9yPW8ub25sb2FkPW51bGwsY2xlYXJUaW1lb3V0KGMpO3ZhciByPV9bZV07MCE9PXImJihyJiZyWzFdKG5ldyBFcnJvcigiTG9hZGluZyBjaHVuayAiK2UrIiBmYWlsZWQuIikpLF9bZV09dm9pZCAwKX1yZXR1cm4gby5vbmVycm9yPW8ub25sb2FkPW9uU2NyaXB0Q29tcGxldGUsdC5hcHBlbmRDaGlsZChvKSxufSxfX3dlYnBhY2tfcmVxdWlyZV9fLm09ZSxfX3dlYnBhY2tfcmVxdWlyZV9fLmM9bixfX3dlYnBhY2tfcmVxdWlyZV9fLmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LF9fd2VicGFja19yZXF1aXJlX18uZD1mdW5jdGlvbihlLHIsbil7X193ZWJwYWNrX3JlcXVpcmVfXy5vKGUscil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpufSl9LF9fd2VicGFja19yZXF1aXJlX18ubj1mdW5jdGlvbihlKXt2YXIgcj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5kKHIsImEiLHIpLHJ9LF9fd2VicGFja19yZXF1aXJlX18ubz1mdW5jdGlvbihlLHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKX0sX193ZWJwYWNrX3JlcXVpcmVfXy5wPSIvIixfX3dlYnBhY2tfcmVxdWlyZV9fLm9lPWZ1bmN0aW9uKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoZSksZX0sX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnM9MjA4KX0oezE5MTpmdW5jdGlvbihlLHIpeyFmdW5jdGlvbihlLHIsbixfLHQsbyxjKXtlLkdvb2dsZUFuYWx5dGljc09iamVjdD10LGUuZ2E9ZS5nYXx8ZnVuY3Rpb24oKXsoZS5nYS5xPWUuZ2EucXx8W10pLnB1c2goYXJndW1lbnRzKX0sZS5nYS5sPTEqbmV3IERhdGUsbz1yLmNyZWF0ZUVsZW1lbnQobiksYz1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKG4pWzBdLG8uYXN5bmM9MSxvLnNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzIixjLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8sYyl9KHdpbmRvdyxkb2N1bWVudCwic2NyaXB0IiwwLCJnYSIpLGdhKCJjcmVhdGUiLCJVQS05ODc1Nzg1LTI1IiwiYXV0byIpLGdhKCJzZW5kIiwicGFnZXZpZXciKX0sMjA4OmZ1bmN0aW9uKGUscixuKXt3aW5kb3cubG9jYXRpb24ub3JpZ2luLmluZGV4T2YoImxpdmUuaG91c2UuZ292Iik+LTEmJm4oMTkxKX19KX0pKCl9Cg=="},{"name":"sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0ICRfX19tb2NrXzQxZGQwYWI1ZjUwZjgxOTg9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7Y29uc3QgeGhyVW5zZW50PTA7Y29uc3QgeGhyT3BlbmVkPTE7Y29uc3QgeGhySGVhZGVyc1JlY2VpdmVkPTI7Y29uc3QgeGhyTG9hZGluZz0zO2NvbnN0IHhockRvbmU9NDtjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbD1TeW1ib2woImRlZmVycmVkSGFuZGxlIik7Y29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2w9U3ltYm9sKCJvbmxvYWRzdGFydCIpO2NvbnN0IHhock9uUHJvZ3Jlc3NTeW1ib2w9U3ltYm9sKCJvbnByb2dyZXNzIik7Y29uc3QgeGhyT25BYm9ydFN5bWJvbD1TeW1ib2woIm9uYWJvcnQiKTtjb25zdCB4aHJPbkVycm9yU3ltYm9sPVN5bWJvbCgib25lcnJvciIpO2NvbnN0IHhock9uTG9hZFN5bWJvbD1TeW1ib2woIm9ubG9hZCIpO2NvbnN0IHhock9uVGltZW91dFN5bWJvbD1TeW1ib2woIm9udGltZW91dCIpO2NvbnN0IHhock9uTG9hZEVuZFN5bWJvbD1TeW1ib2woIm9ubG9hZGVuZCIpO2NvbnN0IHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpO2NvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2w9U3ltYm9sKCJyZWFkeVN0YXRlIik7Y29uc3QgeGhyVGltZW91dFN5bWJvbD1TeW1ib2woInRpbWVvdXQiKTtjb25zdCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2w9U3ltYm9sKCJ3aXRoQ3JlZGVudGlhbHMiKTtjb25zdCB4aHJVcGxvYWRTeW1ib2w9U3ltYm9sKCJ1cGxvYWQiKTtjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2w9U3ltYm9sKCJyZXNwb25zZVR5cGUiKTtjb25zdCBkZWZpbmVFdmVudD0ob2JqLHN5bWJvbCk9Pntjb25zdCB0eXBlPXN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixzeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZnVuY3Rpb24oZXZlbnQpe2NvbnN0IGhhbmRsZXI9dGhpc1tzeW1ib2xdO2lmKGhhbmRsZXIpe2hhbmRsZXIuY2FsbCh0aGlzLGV2ZW50KX19KX07Y29uc3QgY2hhbmdlUmVhZHlTdGF0ZT0oeGhyLHJlYWR5U3RhdGUpPT57eGhyW3hoclJlYWR5U3RhdGVTeW1ib2xdPXJlYWR5U3RhdGU7eGhyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZWFkeXN0YXRlY2hhbmdlIikpfTtsZXQgaXNTZWFsZWQ9dHJ1ZTtjbGFzcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IGV4dGVuZHMgRXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSYmISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIil9ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTdGFydFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblByb2dyZXNzU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uQWJvcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25FcnJvclN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25UaW1lb3V0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uTG9hZEVuZFN5bWJvbCl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdfXNldCBvbmxvYWRzdGFydCh2YWx1ZSl7dGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF09dmFsdWV9Z2V0IG9ucHJvZ3Jlc3MoKXtyZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXX1zZXQgb25wcm9ncmVzcyh2YWx1ZSl7dGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXT12YWx1ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3hock9uQWJvcnRTeW1ib2xdfXNldCBvbmFib3J0KHZhbHVlKXt0aGlzW3hock9uQWJvcnRTeW1ib2xdPXZhbHVlfWdldCBvbmVycm9yKCl7cmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF19c2V0IG9uZXJyb3IodmFsdWUpe3RoaXNbeGhyT25FcnJvclN5bWJvbF09dmFsdWV9Z2V0IG9udGltZW91dCgpe3JldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF19c2V0IG9udGltZW91dCh2YWx1ZSl7dGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdPXZhbHVlfWdldCBvbmxvYWRlbmQoKXtyZXR1cm4gdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdfXNldCBvbmxvYWRlbmQodmFsdWUpe3RoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXT12YWx1ZX19ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfXN1cGVyKCl9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQ9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpYTUxIdHRwUmVxdWVzdFVwbG9hZCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lzU2VhbGVkPWZhbHNlO2NvbnN0IHhoclVwbG9hZD1uZXcgWE1MSHR0cFJlcXVlc3RVcGxvYWQ7aXNTZWFsZWQ9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6bnVsbCx3cml0YWJsZTp0cnVlfSk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclJlYWR5U3RhdGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOnhoclVuc2VudCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVGltZW91dFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6MCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpmYWxzZSx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVXBsb2FkU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVcGxvYWQsd3JpdGFibGU6ZmFsc2V9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZXNwb25zZVR5cGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiIiLHdyaXRhYmxlOnRydWV9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXX1zZXQgb25yZWFkeXN0YXRlY2hhbmdlKHZhbHVlKXt0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF09dmFsdWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXX1vcGVuKG1ldGhvZCx1cmwpe3N3aXRjaCh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKXtjYXNlIHhoclVuc2VudDpjYXNlIHhockRvbmU6e2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJPcGVuZWQpO2JyZWFrfX19c2V0UmVxdWVzdEhlYWRlcihuYW1lLHZhbHVlKXt9c2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKXt9Z2V0IHRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXX1zZXQgdGltZW91dCh2YWx1ZSl7dGhpc1t4aHJUaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgd2l0aENyZWRlbnRpYWxzKCl7cmV0dXJuIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXX1zZXQgd2l0aENyZWRlbnRpYWxzKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJPcGVuZWQ6e2JyZWFrfWRlZmF1bHQ6e3Rocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICd3aXRoQ3JlZGVudGlhbHMnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIFVOU0VOVCBvciBPUEVORUQuIil9fXRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXT0hIXZhbHVlfWdldCB1cGxvYWQoKXtyZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdfXNlbmQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT09PW51bGwpe3RoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdPXNldFRpbWVvdXQoKCk9Pnt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJEb25lKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImVycm9yIikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX0sMCl9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpfX1hYm9ydCgpe2lmKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF09PT14aHJPcGVuZWQmJnRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdIT09bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdKTt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJVbnNlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgiYWJvcnQiKSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJsb2FkZW5kIikpfX1nZXQgcmVzcG9uc2VVUkwoKXtyZXR1cm4iIn1nZXQgc3RhdHVzKCl7cmV0dXJuIDB9Z2V0IHN0YXR1c1RleHQoKXtyZXR1cm4iIn1nZXRSZXNwb25zZUhlYWRlcihuYW1lKXtyZXR1cm4gbnVsbH1vdmVycmlkZU1pbWVUeXBlKG1pbWUpe31nZXQgcmVzcG9uc2VUeXBlKCl7cmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXX1zZXQgcmVzcG9uc2VUeXBlKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJEb25lOnt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAncmVzcG9uc2VUeXBlJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBMT0FESU5HIG9yIERPTkUuIil9fXN3aXRjaCh2YWx1ZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnt0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF09dmFsdWU7YnJlYWt9fX1nZXQgcmVzcG9uc2UoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO3JldHVybiByZXNwb25zZVR5cGU9PT0iInx8cmVzcG9uc2VUeXBlPT09InRleHQiPyIiOm51bGx9Z2V0IHJlc3BvbnNlVGV4dCgpe2NvbnN0IHJlc3BvbnNlVHlwZT10aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07aWYocmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Iil7cmV0dXJuIiJ9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCB0aGUgJ3Jlc3BvbnNlVGV4dCcgcHJvcGVydHkgZnJvbSAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3QncyAncmVzcG9uc2VUeXBlJyBpcyAnJyBvciAndGV4dCcgKHdhcyAnYXJyYXlidWZmZXInKS4iKX19Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiVU5TRU5UIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJVbnNlbnR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyT3BlbmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJIRUFERVJTX1JFQ0VJVkVEIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJIZWFkZXJzUmVjZWl2ZWR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkxPQURJTkciLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockxvYWRpbmd9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkRPTkUiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockRvbmV9KTtleHBvcnRzLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3Qsd3JpdGFibGU6dHJ1ZX19KSgkX19fbW9ja180MWRkMGFiNWY1MGY4MTk4KTtjb25zdCAkX19fbW9ja19jNmU2MWQ5MmI5NDllMzQ5PXt9OyhleHBvcnRzPT57InVzZSBzdHJpY3QiO2xldCBpc1NlYWxlZD1mYWxzZTtjbGFzcyBTdG9yYWdle2NvbnN0cnVjdG9yKCl7aWYoaXNTZWFsZWQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKX19Z2V0IGxlbmd0aCgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGh9a2V5KGluZGV4KXtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRoaXMpO2lmKGluZGV4PDB8fGluZGV4Pj1rZXlzLmxlbmd0aCl7cmV0dXJuIG51bGx9cmV0dXJuIGtleXNbaW5kZXhdfWdldEl0ZW0oa2V5KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsa2V5KT90aGlzW2tleV06bnVsbH1zZXRJdGVtKGtleSx2YWx1ZSl7dGhpc1trZXldPVN0cmluZyh2YWx1ZSl9cmVtb3ZlSXRlbShrZXkpe2RlbGV0ZSB0aGlzW2tleV19Y2xlYXIoKXtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRoaXMpO2Zvcihjb25zdCBrZXkgb2Yga2V5cyl7ZGVsZXRlIHRoaXNba2V5XX19fWV4cG9ydHMuU3RvcmFnZT17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlN0b3JhZ2Usd3JpdGFibGU6dHJ1ZX07Y29uc3QgbG9jYWxTdG9yYWdlPW5ldyBTdG9yYWdlO2V4cG9ydHMubG9jYWxTdG9yYWdlPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsZ2V0KCl7cmV0dXJuIGxvY2FsU3RvcmFnZX19O2NvbnN0IHNlc3Npb25TdG9yYWdlPW5ldyBTdG9yYWdlO2V4cG9ydHMuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSxnZXQoKXtyZXR1cm4gc2Vzc2lvblN0b3JhZ2V9fTtpc1NlYWxlZD10cnVlfSkoJF9fX21vY2tfYzZlNjFkOTJiOTQ5ZTM0OSk7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiYic3RyaW5nIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpbi5kKHIsbyxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiBuLmQodCwiYSIsdCksdH0sbi5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxuLnA9Ii8iLG4obi5zPTE5Nil9KFtmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oOTkpfSwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKG4oMTExKSkscihuKDExMikpLHIobigxMTMpKSxyKG4oMTE0KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscihuKDU0KSkscihuKDExNSkpLHIobig1NSkpLHIobig1NikpLHIobigxMTYpKSxyKG4oMTE3KSkscihuKDM4KSkscihuKDU3KSkscihuKDExOCkpLHIobigxMTkpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDcxKSxvPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gaShlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09by5jYWxsKGUpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgZX1mdW5jdGlvbiBhKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PT10eXBlb2YgZX1mdW5jdGlvbiBjKGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1vLmNhbGwoZSl9ZnVuY3Rpb24gdShlLHQpe2lmKG51bGwhPT1lJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBlKWlmKCJvYmplY3QiIT09dHlwZW9mIGUmJihlPVtlXSksaShlKSlmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdC5jYWxsKG51bGwsZVtuXSxuLGUpO2Vsc2UgZm9yKHZhciBvIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJnQuY2FsbChudWxsLGVbb10sbyxlKX1lLmV4cG9ydHM9e2lzQXJyYXk6aSxpc0FycmF5QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1vLmNhbGwoZSl9LGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIXMoZSkmJm51bGwhPT1lLmNvbnN0cnVjdG9yJiYhcyhlLmNvbnN0cnVjdG9yKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfSxpc0Zvcm1EYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIEZvcm1EYXRhJiZlIGluc3RhbmNlb2YgRm9ybURhdGF9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIEFycmF5QnVmZmVyJiZBcnJheUJ1ZmZlci5pc1ZpZXc/QXJyYXlCdWZmZXIuaXNWaWV3KGUpOmUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlfSxpc051bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBlfSxpc09iamVjdDphLGlzVW5kZWZpbmVkOnMsaXNEYXRlOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PW8uY2FsbChlKX0saXNGaWxlOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEZpbGVdIj09PW8uY2FsbChlKX0saXNCbG9iOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEJsb2JdIj09PW8uY2FsbChlKX0saXNGdW5jdGlvbjpjLGlzU3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpJiZjKGUucGlwZSl9LGlzVVJMU2VhcmNoUGFyYW1zOmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIFVSTFNlYXJjaFBhcmFtcyYmZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtc30saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PT10eXBlb2YgbmF2aWdhdG9yfHwiUmVhY3ROYXRpdmUiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOYXRpdmVTY3JpcHQiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOUyIhPT1uYXZpZ2F0b3IucHJvZHVjdCkmJigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDp1LG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiBuKG4scil7Im9iamVjdCI9PT10eXBlb2YgdFtyXSYmIm9iamVjdCI9PT10eXBlb2Ygbj90W3JdPWUodFtyXSxuKTp0W3JdPW59Zm9yKHZhciByPTAsbz1hcmd1bWVudHMubGVuZ3RoO3I8bztyKyspdShhcmd1bWVudHNbcl0sbik7cmV0dXJuIHR9LGRlZXBNZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gbihuLHIpeyJvYmplY3QiPT09dHlwZW9mIHRbcl0mJiJvYmplY3QiPT09dHlwZW9mIG4/dFtyXT1lKHRbcl0sbik6dFtyXT0ib2JqZWN0Ij09PXR5cGVvZiBuP2Uoe30sbik6bn1mb3IodmFyIHI9MCxvPWFyZ3VtZW50cy5sZW5ndGg7cjxvO3IrKyl1KGFyZ3VtZW50c1tyXSxuKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdSh0LGZ1bmN0aW9uKHQsbyl7ZVtvXT1uJiYiZnVuY3Rpb24iPT09dHlwZW9mIHQ/cih0LG4pOnR9KSxlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL15ccyovLCIiKS5yZXBsYWNlKC9ccyokLywiIil9fX0sLCwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDI5KSxvPW4oMTAzKSxpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5yZXNldD1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNtcElkLGRlbGV0ZSB0aGlzLmNtcFZlcnNpb24sZGVsZXRlIHRoaXMuZXZlbnRTdGF0dXMsZGVsZXRlIHRoaXMuZ2RwckFwcGxpZXMsZGVsZXRlIHRoaXMudGNNb2RlbCxkZWxldGUgdGhpcy50Y1N0cmluZyxkZWxldGUgdGhpcy50Y2ZQb2xpY3lWZXJzaW9uLHRoaXMuY21wU3RhdHVzPXIuQ21wU3RhdHVzLkxPQURJTkcsdGhpcy5kaXNhYmxlZD0hMSx0aGlzLmRpc3BsYXlTdGF0dXM9ci5EaXNwbGF5U3RhdHVzLkhJRERFTix0aGlzLmV2ZW50UXVldWUuY2xlYXIoKX0sZS5hcGlWZXJzaW9uPSIyIixlLmV2ZW50UXVldWU9bmV3IG8uRXZlbnRMaXN0ZW5lclF1ZXVlLGUuY21wU3RhdHVzPXIuQ21wU3RhdHVzLkxPQURJTkcsZS5kaXNhYmxlZD0hMSxlLmRpc3BsYXlTdGF0dXM9ci5EaXNwbGF5U3RhdHVzLkhJRERFTixlfSgpO3QuQ21wQXBpTW9kZWw9aX0sLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX3ZhbHVlc3x8ZnVuY3Rpb24oZSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLG49dCYmZVt0XSxyPTA7aWYobilyZXR1cm4gbi5jYWxsKGUpO2lmKGUmJiJudW1iZXIiPT10eXBlb2YgZS5sZW5ndGgpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmcj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbcisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD8iT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iOiJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWUuZGVlcENsb25lKGVbbl0pO3ZvaWQgMCE9PXImJih0W25dPXIpfSksdH0sZS5wcm90b3R5cGUuZGVlcENsb25lPWZ1bmN0aW9uKGUpe3ZhciB0LG4sbz10eXBlb2YgZTtpZigibnVtYmVyIj09PW98fCJzdHJpbmciPT09b3x8ImJvb2xlYW4iPT09bylyZXR1cm4gZTtpZihudWxsIT09ZSYmIm9iamVjdCI9PT1vKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5jbG9uZSlyZXR1cm4gZS5jbG9uZSgpO2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZShlLmdldFRpbWUoKSk7aWYodm9pZCAwIT09ZVtTeW1ib2wuaXRlcmF0b3JdKXt2YXIgaT1bXTt0cnl7Zm9yKHZhciBzPXIoZSksYT1zLm5leHQoKTshYS5kb25lO2E9cy5uZXh0KCkpe3ZhciBjPWEudmFsdWU7aS5wdXNoKHRoaXMuZGVlcENsb25lKGMpKX19Y2F0Y2goZSl7dD17ZXJyb3I6ZX19ZmluYWxseXt0cnl7YSYmIWEuZG9uZSYmKG49cy5yZXR1cm4pJiZuLmNhbGwocyl9ZmluYWxseXtpZih0KXRocm93IHQuZXJyb3J9fXJldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/aTpuZXcgZS5jb25zdHJ1Y3RvcihpKX12YXIgdT17fTtmb3IodmFyIHAgaW4gZSllLmhhc093blByb3BlcnR5KHApJiYodVtwXT10aGlzLmRlZXBDbG9uZShlW3BdKSk7cmV0dXJuIHV9fSxlfSgpO3QuQ2xvbmVhYmxlPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oNSksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1wYXJzZUludChlLDEwKSksKG49ZS50b1N0cmluZygyKSkubGVuZ3RoPnR8fGU8MCl0aHJvdyBuZXcgci5FbmNvZGluZ0Vycm9yKGUrIiB0b28gbGFyZ2UgdG8gZW5jb2RlIGludG8gIit0KTtyZXR1cm4gbi5sZW5ndGg8dCYmKG49IjAiLnJlcGVhdCh0LW4ubGVuZ3RoKStuKSxufSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2lmKHQhPT1lLmxlbmd0aCl0aHJvdyBuZXcgci5EZWNvZGluZ0Vycm9yKCJpbnZhbGlkIGJpdCBsZW5ndGgiKTtyZXR1cm4gcGFyc2VJbnQoZSwyKX0sZX0oKTt0LkludEVuY29kZXI9b30sLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxvPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKShmdW5jdGlvbihvLGkpe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP28oZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKGZ1bmN0aW9uKGUpe2UodCl9KSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pfSxpPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGkscz17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoMSZvWzBdKXRocm93IG9bMV07cmV0dXJuIG9bMV19LHRyeXM6W10sb3BzOltdfTtyZXR1cm4gaT17bmV4dDphKDApLHRocm93OmEoMSkscmV0dXJuOmEoMil9LCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihpW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGk7ZnVuY3Rpb24gYShpKXtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpO2Zvcig7czspdHJ5e2lmKG49MSxyJiYobz0yJmlbMF0/ci5yZXR1cm46aVswXT9yLnRocm93fHwoKG89ci5yZXR1cm4pJiZvLmNhbGwociksMCk6ci5uZXh0KSYmIShvPW8uY2FsbChyLGlbMV0pKS5kb25lKXJldHVybiBvO3N3aXRjaChyPTAsbyYmKGk9WzImaVswXSxvLnZhbHVlXSksaVswXSl7Y2FzZSAwOmNhc2UgMTpvPWk7YnJlYWs7Y2FzZSA0OnJldHVybiBzLmxhYmVsKysse3ZhbHVlOmlbMV0sZG9uZTohMX07Y2FzZSA1OnMubGFiZWwrKyxyPWlbMV0saT1bMF07Y29udGludWU7Y2FzZSA3Omk9cy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoISgobz0obz1zLnRyeXMpLmxlbmd0aD4wJiZvW28ubGVuZ3RoLTFdKXx8NiE9PWlbMF0mJjIhPT1pWzBdKSl7cz0wO2NvbnRpbnVlfWlmKDM9PT1pWzBdJiYoIW98fGlbMV0+b1swXSYmaVsxXTxvWzNdKSl7cy5sYWJlbD1pWzFdO2JyZWFrfWlmKDY9PT1pWzBdJiZzLmxhYmVsPG9bMV0pe3MubGFiZWw9b1sxXSxvPWk7YnJlYWt9aWYobyYmcy5sYWJlbDxvWzJdKXtzLmxhYmVsPW9bMl0scy5vcHMucHVzaChpKTticmVha31vWzJdJiZzLm9wcy5wb3AoKSxzLnRyeXMucG9wKCk7Y29udGludWV9aT10LmNhbGwoZSxzKX1jYXRjaChlKXtpPVs2LGVdLHI9MH1maW5hbGx5e249bz0wfWlmKDUmaVswXSl0aHJvdyBpWzFdO3JldHVybnt2YWx1ZTppWzBdP2lbMV06dm9pZCAwLGRvbmU6ITB9fShbaSxhXSl9fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPW4oMTUpLGE9big1KSxjPW4oNjUpLHU9big2KSxwPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7dmFyIHI9ZS5jYWxsKHRoaXMpfHx0aGlzO3IuaXNSZWFkeV89ITEsci5pc0xhdGVzdD0hMTt2YXIgbz10LmJhc2VVcmw7aWYoci5sYW5nXz10LkRFRkFVTFRfTEFOR1VBR0Usci5pc1ZlbmRvckxpc3Qobikpci5wb3B1bGF0ZShuKSxyLnJlYWR5UHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKTtlbHNle2lmKCFvKXRocm93IG5ldyBhLkdWTEVycm9yKCJtdXN0IHNwZWNpZnkgR1ZMLmJhc2VVcmwgYmVmb3JlIGxvYWRpbmcgR1ZMIGpzb24iKTtpZihuPjApe3ZhciBpPW47dC5DQUNIRS5oYXMoaSk/KHIucG9wdWxhdGUodC5DQUNIRS5nZXQoaSkpLHIucmVhZHlQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpKToobys9dC52ZXJzaW9uZWRGaWxlbmFtZS5yZXBsYWNlKCJbVkVSU0lPTl0iLGkrIiIpLHIucmVhZHlQcm9taXNlPXIuZmV0Y2hKc29uKG8pKX1lbHNlIHQuQ0FDSEUuaGFzKHQuTEFURVNUX0NBQ0hFX0tFWSk/KHIucG9wdWxhdGUodC5DQUNIRS5nZXQodC5MQVRFU1RfQ0FDSEVfS0VZKSksci5yZWFkeVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkpOihyLmlzTGF0ZXN0PSEwLHIucmVhZHlQcm9taXNlPXIuZmV0Y2hKc29uKG8rdC5sYXRlc3RGaWxlbmFtZSkpfXJldHVybiByfXJldHVybiByKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImJhc2VVcmwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYXNlVXJsX30sc2V0OmZ1bmN0aW9uKGUpe2lmKC9eaHR0cHM/OlwvXC92ZW5kb3JsaXN0XC5jb25zZW5zdVwub3JnXC8vLnRlc3QoZSkpdGhyb3cgbmV3IGEuR1ZMRXJyb3IoIkludmFsaWQgYmFzZVVybCEgIFlvdSBtYXkgbm90IHB1bGwgZGlyZWN0bHkgZnJvbSB2ZW5kb3JsaXN0LmNvbnNlbnN1Lm9yZyBhbmQgbXVzdCBwcm92aWRlIHlvdXIgb3duIGNhY2hlIik7ZS5sZW5ndGg+MCYmIi8iIT09ZVtlLmxlbmd0aC0xXSYmKGUrPSIvIiksdGhpcy5iYXNlVXJsXz1lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZW1wdHlMYW5ndWFnZUNhY2hlPWZ1bmN0aW9uKGUpe3ZhciBuPSExO3JldHVybiB2b2lkIDA9PT1lJiZ0LkxBTkdVQUdFX0NBQ0hFLnNpemU+MD8odC5MQU5HVUFHRV9DQUNIRT1uZXcgTWFwLG49ITApOiJzdHJpbmciPT10eXBlb2YgZSYmdGhpcy5jb25zZW50TGFuZ3VhZ2VzLmhhcyhlLnRvVXBwZXJDYXNlKCkpJiYodC5MQU5HVUFHRV9DQUNIRS5kZWxldGUoZS50b1VwcGVyQ2FzZSgpKSxuPSEwKSxufSx0LmVtcHR5Q2FjaGU9ZnVuY3Rpb24oZSl7dmFyIG49ITE7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTA/KHQuQ0FDSEUuZGVsZXRlKGUpLG49ITApOnZvaWQgMD09PWUmJih0LkNBQ0hFPW5ldyBNYXAsbj0hMCksbn0sdC5wcm90b3R5cGUuY2FjaGVMYW5ndWFnZT1mdW5jdGlvbigpe3QuTEFOR1VBR0VfQ0FDSEUuaGFzKHRoaXMubGFuZ18pfHx0LkxBTkdVQUdFX0NBQ0hFLnNldCh0aGlzLmxhbmdfLHtwdXJwb3Nlczp0aGlzLnB1cnBvc2VzLHNwZWNpYWxQdXJwb3Nlczp0aGlzLnNwZWNpYWxQdXJwb3NlcyxmZWF0dXJlczp0aGlzLmZlYXR1cmVzLHNwZWNpYWxGZWF0dXJlczp0aGlzLnNwZWNpYWxGZWF0dXJlcyxzdGFja3M6dGhpcy5zdGFja3N9KX0sdC5wcm90b3R5cGUuZmV0Y2hKc29uPWZ1bmN0aW9uKGUpe3JldHVybiBvKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0LG47cmV0dXJuIGkodGhpcyxmdW5jdGlvbihyKXtzd2l0Y2goci5sYWJlbCl7Y2FzZSAwOnJldHVybiByLnRyeXMucHVzaChbMCwyLCwzXSksdD10aGlzLnBvcHVsYXRlLFs0LGMuSnNvbi5mZXRjaChlKV07Y2FzZSAxOnJldHVybiB0LmFwcGx5KHRoaXMsW3Iuc2VudCgpXSksWzMsM107Y2FzZSAyOnRocm93IG49ci5zZW50KCksbmV3IGEuR1ZMRXJyb3Iobi5tZXNzYWdlKTtjYXNlIDM6cmV0dXJuWzJdfX0pfSl9LHQucHJvdG90eXBlLmdldEpzb249ZnVuY3Rpb24oKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7Z3ZsU3BlY2lmaWNhdGlvblZlcnNpb246dGhpcy5ndmxTcGVjaWZpY2F0aW9uVmVyc2lvbix2ZW5kb3JMaXN0VmVyc2lvbjp0aGlzLnZlbmRvckxpc3RWZXJzaW9uLHRjZlBvbGljeVZlcnNpb246dGhpcy50Y2ZQb2xpY3lWZXJzaW9uLGxhc3RVcGRhdGVkOnRoaXMubGFzdFVwZGF0ZWQscHVycG9zZXM6dGhpcy5wdXJwb3NlcyxzcGVjaWFsUHVycG9zZXM6dGhpcy5zcGVjaWFsUHVycG9zZXMsZmVhdHVyZXM6dGhpcy5mZWF0dXJlcyxzcGVjaWFsRmVhdHVyZXM6dGhpcy5zcGVjaWFsRmVhdHVyZXMsc3RhY2tzOnRoaXMuc3RhY2tzLHZlbmRvcnM6dGhpcy5mdWxsVmVuZG9yTGlzdH0pKX0sdC5wcm90b3R5cGUuY2hhbmdlTGFuZ3VhZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIG4scixvLHMsYztyZXR1cm4gaSh0aGlzLGZ1bmN0aW9uKGkpe3N3aXRjaChpLmxhYmVsKXtjYXNlIDA6aWYobj1lLnRvVXBwZXJDYXNlKCksIXQuY29uc2VudExhbmd1YWdlcy5oYXMobikpcmV0dXJuWzMsNl07aWYobj09PXRoaXMubGFuZ18pcmV0dXJuWzMsNV07aWYodGhpcy5sYW5nXz1uLCF0LkxBTkdVQUdFX0NBQ0hFLmhhcyhuKSlyZXR1cm5bMywxXTtmb3IobyBpbiByPXQuTEFOR1VBR0VfQ0FDSEUuZ2V0KG4pKXIuaGFzT3duUHJvcGVydHkobykmJih0aGlzW29dPXJbb10pO3JldHVyblszLDVdO2Nhc2UgMTpzPXQuYmFzZVVybCt0Lmxhbmd1YWdlRmlsZW5hbWUucmVwbGFjZSgiW0xBTkddIixlKSxpLmxhYmVsPTI7Y2FzZSAyOnJldHVybiBpLnRyeXMucHVzaChbMiw0LCw1XSksWzQsdGhpcy5mZXRjaEpzb24ocyldO2Nhc2UgMzpyZXR1cm4gaS5zZW50KCksdGhpcy5jYWNoZUxhbmd1YWdlKCksWzMsNV07Y2FzZSA0OnRocm93IGM9aS5zZW50KCksbmV3IGEuR1ZMRXJyb3IoInVuYWJsZSB0byBsb2FkIGxhbmd1YWdlOiAiK2MubWVzc2FnZSk7Y2FzZSA1OnJldHVyblszLDddO2Nhc2UgNjp0aHJvdyBuZXcgYS5HVkxFcnJvcigidW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgIitlKTtjYXNlIDc6cmV0dXJuWzJdfX0pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGFuZ3VhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYW5nX30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pc1ZlbmRvckxpc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUudmVuZG9yc30sdC5wcm90b3R5cGUucG9wdWxhdGU9ZnVuY3Rpb24oZSl7dGhpcy5wdXJwb3Nlcz1lLnB1cnBvc2VzLHRoaXMuc3BlY2lhbFB1cnBvc2VzPWUuc3BlY2lhbFB1cnBvc2VzLHRoaXMuZmVhdHVyZXM9ZS5mZWF0dXJlcyx0aGlzLnNwZWNpYWxGZWF0dXJlcz1lLnNwZWNpYWxGZWF0dXJlcyx0aGlzLnN0YWNrcz1lLnN0YWNrcyx0aGlzLmlzVmVuZG9yTGlzdChlKSYmKHRoaXMuZ3ZsU3BlY2lmaWNhdGlvblZlcnNpb249ZS5ndmxTcGVjaWZpY2F0aW9uVmVyc2lvbix0aGlzLnRjZlBvbGljeVZlcnNpb249ZS50Y2ZQb2xpY3lWZXJzaW9uLHRoaXMudmVuZG9yTGlzdFZlcnNpb249ZS52ZW5kb3JMaXN0VmVyc2lvbix0aGlzLmxhc3RVcGRhdGVkPWUubGFzdFVwZGF0ZWQsInN0cmluZyI9PXR5cGVvZiB0aGlzLmxhc3RVcGRhdGVkJiYodGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZSh0aGlzLmxhc3RVcGRhdGVkKSksdGhpcy52ZW5kb3JzXz1lLnZlbmRvcnMsdGhpcy5mdWxsVmVuZG9yTGlzdD1lLnZlbmRvcnMsdGhpcy5tYXBWZW5kb3JzKCksdGhpcy5pc1JlYWR5Xz0hMCx0aGlzLmlzTGF0ZXN0JiZ0LkNBQ0hFLnNldCh0LkxBVEVTVF9DQUNIRV9LRVksdGhpcy5nZXRKc29uKCkpLHQuQ0FDSEUuaGFzKHRoaXMudmVuZG9yTGlzdFZlcnNpb24pfHx0LkNBQ0hFLnNldCh0aGlzLnZlbmRvckxpc3RWZXJzaW9uLHRoaXMuZ2V0SnNvbigpKSksdGhpcy5jYWNoZUxhbmd1YWdlKCl9LHQucHJvdG90eXBlLm1hcFZlbmRvcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmJ5UHVycG9zZVZlbmRvck1hcD17fSx0aGlzLmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXA9e30sdGhpcy5ieUZlYXR1cmVWZW5kb3JNYXA9e30sdGhpcy5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwPXt9LE9iamVjdC5rZXlzKHRoaXMucHVycG9zZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5ieVB1cnBvc2VWZW5kb3JNYXBbZV09e2xlZ0ludDpuZXcgU2V0LGNvbnNlbnQ6bmV3IFNldCxmbGV4aWJsZTpuZXcgU2V0fX0pLE9iamVjdC5rZXlzKHRoaXMuc3BlY2lhbFB1cnBvc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYnlTcGVjaWFsUHVycG9zZVZlbmRvck1hcFtlXT1uZXcgU2V0fSksT2JqZWN0LmtleXModGhpcy5mZWF0dXJlcykuZm9yRWFjaChmdW5jdGlvbihlKXt0LmJ5RmVhdHVyZVZlbmRvck1hcFtlXT1uZXcgU2V0fSksT2JqZWN0LmtleXModGhpcy5zcGVjaWFsRmVhdHVyZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwW2VdPW5ldyBTZXR9KSxBcnJheS5pc0FycmF5KGUpfHwoZT1PYmplY3Qua2V5cyh0aGlzLmZ1bGxWZW5kb3JMaXN0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuK2V9KSksdGhpcy52ZW5kb3JJZHM9bmV3IFNldChlKSx0aGlzLnZlbmRvcnNfPWUucmVkdWNlKGZ1bmN0aW9uKGUsbil7dmFyIHI9dC52ZW5kb3JzX1siIituXTtyZXR1cm4gciYmdm9pZCAwPT09ci5kZWxldGVkRGF0ZSYmKHIucHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmJ5UHVycG9zZVZlbmRvck1hcFtlKyIiXS5jb25zZW50LmFkZChuKX0pLHIuc3BlY2lhbFB1cnBvc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5ieVNwZWNpYWxQdXJwb3NlVmVuZG9yTWFwW2UrIiJdLmFkZChuKX0pLHIubGVnSW50UHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmJ5UHVycG9zZVZlbmRvck1hcFtlKyIiXS5sZWdJbnQuYWRkKG4pfSksci5mbGV4aWJsZVB1cnBvc2VzJiZyLmZsZXhpYmxlUHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmJ5UHVycG9zZVZlbmRvck1hcFtlKyIiXS5mbGV4aWJsZS5hZGQobil9KSxyLmZlYXR1cmVzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5ieUZlYXR1cmVWZW5kb3JNYXBbZSsiIl0uYWRkKG4pfSksci5zcGVjaWFsRmVhdHVyZXMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmJ5U3BlY2lhbEZlYXR1cmVWZW5kb3JNYXBbZSsiIl0uYWRkKG4pfSksZVtuXT1yKSxlfSx7fSl9LHQucHJvdG90eXBlLmdldEZpbHRlcmVkVmVuZG9ycz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLHM9e307cmV0dXJuKCJwdXJwb3NlIj09PWUmJm4/dGhpc1siYnkiK2krIlZlbmRvck1hcCJdW3QrIiJdW25dOnRoaXNbImJ5Iisocj8iU3BlY2lhbCI6IiIpK2krIlZlbmRvck1hcCJdW3QrIiJdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3NbZSsiIl09by52ZW5kb3JzW2UrIiJdfSksc30sdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhDb25zZW50UHVycG9zZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoInB1cnBvc2UiLGUsImNvbnNlbnQiKX0sdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhMZWdJbnRQdXJwb3NlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEZpbHRlcmVkVmVuZG9ycygicHVycG9zZSIsZSwibGVnSW50Iil9LHQucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoRmxleGlibGVQdXJwb3NlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEZpbHRlcmVkVmVuZG9ycygicHVycG9zZSIsZSwiZmxleGlibGUiKX0sdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhTcGVjaWFsUHVycG9zZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoInB1cnBvc2UiLGUsdm9pZCAwLCEwKX0sdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhGZWF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEZpbHRlcmVkVmVuZG9ycygiZmVhdHVyZSIsZSl9LHQucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoU3BlY2lhbEZlYXR1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCJmZWF0dXJlIixlLHZvaWQgMCwhMCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidmVuZG9ycyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlbmRvcnNffSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLm5hcnJvd1ZlbmRvcnNUbz1mdW5jdGlvbihlKXt0aGlzLm1hcFZlbmRvcnMoZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNSZWFkeSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzUmVhZHlffSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuZ2V0SnNvbigpKX0sdC5pc0luc3RhbmNlT2Y9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5uYXJyb3dWZW5kb3JzVG99LHQuTEFOR1VBR0VfQ0FDSEU9bmV3IE1hcCx0LkNBQ0hFPW5ldyBNYXAsdC5MQVRFU1RfQ0FDSEVfS0VZPTAsdC5ERUZBVUxUX0xBTkdVQUdFPSJFTiIsdC5jb25zZW50TGFuZ3VhZ2VzPW5ldyB1LkNvbnNlbnRMYW5ndWFnZXMsdC5sYXRlc3RGaWxlbmFtZT0idmVuZG9yLWxpc3QuanNvbiIsdC52ZXJzaW9uZWRGaWxlbmFtZT0iYXJjaGl2ZXMvdmVuZG9yLWxpc3QtdltWRVJTSU9OXS5qc29uIix0Lmxhbmd1YWdlRmlsZW5hbWU9InB1cnBvc2VzLVtMQU5HXS5qc29uIix0fShzLkNsb25lYWJsZSk7dC5HVkw9cH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigzNiksbz1uKDYpLGk9bigxNikscz1uKDMzKSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLGk9IiI7cmV0dXJuIGU9ci5TZW1hbnRpY1ByZUVuY29kZXIucHJvY2VzcyhlLHQpLChvPUFycmF5LmlzQXJyYXkobnVsbD09PShuPXQpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnNlZ21lbnRzKT90LnNlZ21lbnRzOm5ldyByLlNlZ21lbnRTZXF1ZW5jZShlLHQpWyIiK2UudmVyc2lvbl0pLmZvckVhY2goZnVuY3Rpb24odCxuKXt2YXIgcz0iIjtuPG8ubGVuZ3RoLTEmJihzPSIuIiksaSs9ci5TZWdtZW50RW5jb2Rlci5lbmNvZGUoZSx0KStzfSksaX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNwbGl0KCIuIiksYT1uLmxlbmd0aDt0fHwodD1uZXcgcy5UQ01vZGVsKTtmb3IodmFyIGM9MDtjPGE7YysrKXt2YXIgdT1uW2NdLHA9ci5CYXNlNjRVcmwuZGVjb2RlKHUuY2hhckF0KDApKS5zdWJzdHIoMCxyLkJpdExlbmd0aC5zZWdtZW50VHlwZSksbD1vLlNlZ21lbnRJRHMuSURfVE9fS0VZW2kuSW50RW5jb2Rlci5kZWNvZGUocCxyLkJpdExlbmd0aC5zZWdtZW50VHlwZSkudG9TdHJpbmcoKV07ci5TZWdtZW50RW5jb2Rlci5kZWNvZGUodSx0LGwpfXJldHVybiB0fSxlfSgpO3QuVENTdHJpbmc9YX0sLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5lbmNvZGU9ZnVuY3Rpb24oZSl7cmV0dXJuK2UrIiJ9LGUuZGVjb2RlPWZ1bmN0aW9uKGUpe3JldHVybiIxIj09PWV9LGV9KCk7dC5Cb29sZWFuRW5jb2Rlcj1yfSwsLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIobig0OSkpLHIobigxMDQpKSxyKG4oMTA1KSkscihuKDI4KSkscihuKDUwKSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMTMpO3QuUmVzcG9uc2U9ZnVuY3Rpb24oKXt0aGlzLmNtcElkPXIuQ21wQXBpTW9kZWwuY21wSWQsdGhpcy5jbXBWZXJzaW9uPXIuQ21wQXBpTW9kZWwuY21wVmVyc2lvbix0aGlzLmdkcHJBcHBsaWVzPXIuQ21wQXBpTW9kZWwuZ2RwckFwcGxpZXMsdGhpcy50Y2ZQb2xpY3lWZXJzaW9uPXIuQ21wQXBpTW9kZWwudGNmUG9saWN5VmVyc2lvbn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscihuKDEwMCkpLHIobigxMDEpKSxyKG4oMTAyKSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMzEpLGk9bigyNykscz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gcih0LGUpLHQucHJvdG90eXBlLnJlc3BvbmQ9ZnVuY3Rpb24oKXt0aGlzLnRocm93SWZQYXJhbUludmFsaWQoKSx0aGlzLmludm9rZUNhbGxiYWNrKG5ldyBpLlRDRGF0YSh0aGlzLnBhcmFtLHRoaXMubGlzdGVuZXJJZCkpfSx0LnByb3RvdHlwZS50aHJvd0lmUGFyYW1JbnZhbGlkPWZ1bmN0aW9uKCl7aWYoISh2b2lkIDA9PT10aGlzLnBhcmFtfHxBcnJheS5pc0FycmF5KHRoaXMucGFyYW0pJiZ0aGlzLnBhcmFtLmV2ZXJ5KE51bWJlci5pc0ludGVnZXIpKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgUGFyYW1ldGVyIil9LHR9KG8uQ29tbWFuZCk7dC5HZXRUQ0RhdGFDb21tYW5kPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixyKXt0aGlzLnN1Y2Nlc3M9ITAsT2JqZWN0LmFzc2lnbih0aGlzLHtjYWxsYmFjazplLGxpc3RlbmVySWQ6bixwYXJhbTp0LG5leHQ6cn0pO3RyeXt0aGlzLnJlc3BvbmQoKX1jYXRjaChlKXt0aGlzLmludm9rZUNhbGxiYWNrKG51bGwpfX1yZXR1cm4gZS5wcm90b3R5cGUuaW52b2tlQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbCE9PWU7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMubmV4dD90aGlzLmNhbGxiYWNrKHRoaXMubmV4dCxlLHQpOnRoaXMuY2FsbGJhY2soZSx0KX0sZX0oKTt0LkNvbW1hbmQ9cn0sLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTUpLGk9big1KSxzPW4oMjApLGE9big2KSxjPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLmlzU2VydmljZVNwZWNpZmljXz0hMSxuLnN1cHBvcnRPT0JfPSEwLG4udXNlTm9uU3RhbmRhcmRTdGFja3NfPSExLG4ucHVycG9zZU9uZVRyZWF0bWVudF89ITEsbi5wdWJsaXNoZXJDb3VudHJ5Q29kZV89IkFBIixuLnZlcnNpb25fPTIsbi5jb25zZW50U2NyZWVuXz0wLG4ucG9saWN5VmVyc2lvbl89MixuLmNvbnNlbnRMYW5ndWFnZV89IkVOIixuLmNtcElkXz0wLG4uY21wVmVyc2lvbl89MCxuLnZlbmRvckxpc3RWZXJzaW9uXz0wLG4ubnVtQ3VzdG9tUHVycG9zZXNfPTAsbi5zcGVjaWFsRmVhdHVyZU9wdGlucz1uZXcgYS5WZWN0b3Isbi5wdXJwb3NlQ29uc2VudHM9bmV3IGEuVmVjdG9yLG4ucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHM9bmV3IGEuVmVjdG9yLG4ucHVibGlzaGVyQ29uc2VudHM9bmV3IGEuVmVjdG9yLG4ucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cz1uZXcgYS5WZWN0b3Isbi5wdWJsaXNoZXJDdXN0b21Db25zZW50cz1uZXcgYS5WZWN0b3Isbi5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzPW5ldyBhLlZlY3RvcixuLnZlbmRvckNvbnNlbnRzPW5ldyBhLlZlY3RvcixuLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHM9bmV3IGEuVmVjdG9yLG4udmVuZG9yc0Rpc2Nsb3NlZD1uZXcgYS5WZWN0b3Isbi52ZW5kb3JzQWxsb3dlZD1uZXcgYS5WZWN0b3Isbi5wdWJsaXNoZXJSZXN0cmljdGlvbnM9bmV3IGEuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yLHQmJihuLmd2bD10KSxuLmNyZWF0ZWQ9bmV3IERhdGUsbi51cGRhdGVkKCksbn1yZXR1cm4gcih0LGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZ3ZsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3ZsX30sc2V0OmZ1bmN0aW9uKGUpe3MuR1ZMLmlzSW5zdGFuY2VPZihlKXx8KGU9bmV3IHMuR1ZMKGUpKSx0aGlzLmd2bF89ZSx0aGlzLnB1Ymxpc2hlclJlc3RyaWN0aW9ucy5ndmw9ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNtcElkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY21wSWRffSxzZXQ6ZnVuY3Rpb24oZSl7aWYoIShOdW1iZXIuaXNJbnRlZ2VyKCtlKSYmZT4xKSl0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoImNtcElkIixlKTt0aGlzLmNtcElkXz0rZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNtcFZlcnNpb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbXBWZXJzaW9uX30sc2V0OmZ1bmN0aW9uKGUpe2lmKCEoTnVtYmVyLmlzSW50ZWdlcigrZSkmJmU+LTEpKXRocm93IG5ldyBpLlRDTW9kZWxFcnJvcigiY21wVmVyc2lvbiIsZSk7dGhpcy5jbXBWZXJzaW9uXz0rZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNvbnNlbnRTY3JlZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zZW50U2NyZWVuX30sc2V0OmZ1bmN0aW9uKGUpe2lmKCEoTnVtYmVyLmlzSW50ZWdlcigrZSkmJmU+LTEpKXRocm93IG5ldyBpLlRDTW9kZWxFcnJvcigiY29uc2VudFNjcmVlbiIsZSk7dGhpcy5jb25zZW50U2NyZWVuXz0rZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNvbnNlbnRMYW5ndWFnZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnNlbnRMYW5ndWFnZV99LHNldDpmdW5jdGlvbihlKXt0aGlzLmNvbnNlbnRMYW5ndWFnZV89ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInB1Ymxpc2hlckNvdW50cnlDb2RlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVibGlzaGVyQ291bnRyeUNvZGVffSxzZXQ6ZnVuY3Rpb24oZSl7aWYoIS9eKFtBLXpdKXsyfSQvLnRlc3QoZSkpdGhyb3cgbmV3IGkuVENNb2RlbEVycm9yKCJwdWJsaXNoZXJDb3VudHJ5Q29kZSIsZSk7dGhpcy5wdWJsaXNoZXJDb3VudHJ5Q29kZV89ZS50b1VwcGVyQ2FzZSgpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidmVuZG9yTGlzdFZlcnNpb24iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ndmw/dGhpcy5ndmwudmVuZG9yTGlzdFZlcnNpb246dGhpcy52ZW5kb3JMaXN0VmVyc2lvbl99LHNldDpmdW5jdGlvbihlKXtpZigoZT0rZT4+MCk8MCl0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoInZlbmRvckxpc3RWZXJzaW9uIixlKTt0aGlzLnZlbmRvckxpc3RWZXJzaW9uXz1lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicG9saWN5VmVyc2lvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmd2bD90aGlzLmd2bC50Y2ZQb2xpY3lWZXJzaW9uOnRoaXMucG9saWN5VmVyc2lvbl99LHNldDpmdW5jdGlvbihlKXtpZih0aGlzLnBvbGljeVZlcnNpb25fPXBhcnNlSW50KGUsMTApLHRoaXMucG9saWN5VmVyc2lvbl88MCl0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoInBvbGljeVZlcnNpb24iLGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidmVyc2lvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlcnNpb25ffSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy52ZXJzaW9uXz1wYXJzZUludChlLDEwKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzU2VydmljZVNwZWNpZmljIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNTZXJ2aWNlU3BlY2lmaWNffSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5pc1NlcnZpY2VTcGVjaWZpY189ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInVzZU5vblN0YW5kYXJkU3RhY2tzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXNlTm9uU3RhbmRhcmRTdGFja3NffSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy51c2VOb25TdGFuZGFyZFN0YWNrc189ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInN1cHBvcnRPT0IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdXBwb3J0T09CX30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuc3VwcG9ydE9PQl89ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInB1cnBvc2VPbmVUcmVhdG1lbnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXJwb3NlT25lVHJlYXRtZW50X30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMucHVycG9zZU9uZVRyZWF0bWVudF89ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5zZXRBbGxWZW5kb3JDb25zZW50cz1mdW5jdGlvbigpe3RoaXMudmVuZG9yQ29uc2VudHMuc2V0KHRoaXMuZ3ZsLnZlbmRvcnMpfSx0LnByb3RvdHlwZS51bnNldEFsbFZlbmRvckNvbnNlbnRzPWZ1bmN0aW9uKCl7dGhpcy52ZW5kb3JDb25zZW50cy5lbXB0eSgpfSx0LnByb3RvdHlwZS5zZXRBbGxWZW5kb3JzRGlzY2xvc2VkPWZ1bmN0aW9uKCl7dGhpcy52ZW5kb3JzRGlzY2xvc2VkLnNldCh0aGlzLmd2bC52ZW5kb3JzKX0sdC5wcm90b3R5cGUudW5zZXRBbGxWZW5kb3JzRGlzY2xvc2VkPWZ1bmN0aW9uKCl7dGhpcy52ZW5kb3JzRGlzY2xvc2VkLmVtcHR5KCl9LHQucHJvdG90eXBlLnNldEFsbFZlbmRvcnNBbGxvd2VkPWZ1bmN0aW9uKCl7dGhpcy52ZW5kb3JzQWxsb3dlZC5zZXQodGhpcy5ndmwudmVuZG9ycyl9LHQucHJvdG90eXBlLnVuc2V0QWxsVmVuZG9yc0FsbG93ZWQ9ZnVuY3Rpb24oKXt0aGlzLnZlbmRvcnNBbGxvd2VkLmVtcHR5KCl9LHQucHJvdG90eXBlLnNldEFsbFZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHM9ZnVuY3Rpb24oKXt0aGlzLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMuc2V0KHRoaXMuZ3ZsLnZlbmRvcnMpfSx0LnByb3RvdHlwZS51bnNldEFsbFZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHM9ZnVuY3Rpb24oKXt0aGlzLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMuZW1wdHkoKX0sdC5wcm90b3R5cGUuc2V0QWxsUHVycG9zZUNvbnNlbnRzPWZ1bmN0aW9uKCl7dGhpcy5wdXJwb3NlQ29uc2VudHMuc2V0KHRoaXMuZ3ZsLnB1cnBvc2VzKX0sdC5wcm90b3R5cGUudW5zZXRBbGxQdXJwb3NlQ29uc2VudHM9ZnVuY3Rpb24oKXt0aGlzLnB1cnBvc2VDb25zZW50cy5lbXB0eSgpfSx0LnByb3RvdHlwZS5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cz1mdW5jdGlvbigpe3RoaXMucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMuc2V0KHRoaXMuZ3ZsLnB1cnBvc2VzKX0sdC5wcm90b3R5cGUudW5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cz1mdW5jdGlvbigpe3RoaXMucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMuZW1wdHkoKX0sdC5wcm90b3R5cGUuc2V0QWxsU3BlY2lhbEZlYXR1cmVPcHRpbnM9ZnVuY3Rpb24oKXt0aGlzLnNwZWNpYWxGZWF0dXJlT3B0aW5zLnNldCh0aGlzLmd2bC5zcGVjaWFsRmVhdHVyZXMpfSx0LnByb3RvdHlwZS51bnNldEFsbFNwZWNpYWxGZWF0dXJlT3B0aW5zPWZ1bmN0aW9uKCl7dGhpcy5zcGVjaWFsRmVhdHVyZU9wdGlucy5lbXB0eSgpfSx0LnByb3RvdHlwZS5zZXRBbGw9ZnVuY3Rpb24oKXt0aGlzLnNldEFsbFZlbmRvckNvbnNlbnRzKCksdGhpcy5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cygpLHRoaXMuc2V0QWxsU3BlY2lhbEZlYXR1cmVPcHRpbnMoKSx0aGlzLnNldEFsbFB1cnBvc2VDb25zZW50cygpLHRoaXMuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cygpfSx0LnByb3RvdHlwZS51bnNldEFsbD1mdW5jdGlvbigpe3RoaXMudW5zZXRBbGxWZW5kb3JDb25zZW50cygpLHRoaXMudW5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cygpLHRoaXMudW5zZXRBbGxTcGVjaWFsRmVhdHVyZU9wdGlucygpLHRoaXMudW5zZXRBbGxQdXJwb3NlQ29uc2VudHMoKSx0aGlzLnVuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cygpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm51bUN1c3RvbVB1cnBvc2VzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5udW1DdXN0b21QdXJwb3Nlc187aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLmN1c3RvbVB1cnBvc2VzKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzLmN1c3RvbVB1cnBvc2VzKS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuK2UtK3R9KTtlPXBhcnNlSW50KHQucG9wKCksMTApfXJldHVybiBlfSxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5udW1DdXN0b21QdXJwb3Nlc189cGFyc2VJbnQoZSwxMCksdGhpcy5udW1DdXN0b21QdXJwb3Nlc188MCl0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoIm51bUN1c3RvbVB1cnBvc2VzIixlKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS51cGRhdGVkPWZ1bmN0aW9uKCl7dGhpcy5sYXN0VXBkYXRlZD1uZXcgRGF0ZX0sdC5jb25zZW50TGFuZ3VhZ2VzPXMuR1ZMLmNvbnNlbnRMYW5ndWFnZXMsdH0oby5DbG9uZWFibGUpO3QuVENNb2RlbD1jfSwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscihuKDUzKSkscihuKDM3KSkscihuKDEyMCkpLHIobigxMjQpKSxyKG4oNTgpKSxyKG4oNjQpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9big2KSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe312YXIgdCxuLG8saSxzLGEsYyx1LHAsbCxkLGYsaCx2LHksZyxtLGI7cmV0dXJuIHQ9ci5GaWVsZHMuY21wSWQsbj1yLkZpZWxkcy5jbXBWZXJzaW9uLG89ci5GaWVsZHMuY29uc2VudExhbmd1YWdlLGk9ci5GaWVsZHMuY29uc2VudFNjcmVlbixzPXIuRmllbGRzLmNyZWF0ZWQsYT1yLkZpZWxkcy5pc1NlcnZpY2VTcGVjaWZpYyxjPXIuRmllbGRzLmxhc3RVcGRhdGVkLHU9ci5GaWVsZHMucG9saWN5VmVyc2lvbixwPXIuRmllbGRzLnB1Ymxpc2hlckNvdW50cnlDb2RlLGw9ci5GaWVsZHMucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cyxkPXIuRmllbGRzLnB1Ymxpc2hlckNvbnNlbnRzLGY9ci5GaWVsZHMucHVycG9zZUNvbnNlbnRzLGg9ci5GaWVsZHMucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMsdj1yLkZpZWxkcy5wdXJwb3NlT25lVHJlYXRtZW50LHk9ci5GaWVsZHMuc3BlY2lhbEZlYXR1cmVPcHRpbnMsZz1yLkZpZWxkcy51c2VOb25TdGFuZGFyZFN0YWNrcyxtPXIuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLGI9ci5GaWVsZHMudmVyc2lvbixlW3RdPTEyLGVbbl09MTIsZVtvXT0xMixlW2ldPTYsZVtzXT0zNixlW2FdPTEsZVtjXT0zNixlW3VdPTYsZVtwXT0xMixlW2xdPTI0LGVbZF09MjQsZVtmXT0yNCxlW2hdPTI0LGVbdl09MSxlW3ldPTEyLGVbZ109MSxlW21dPTEyLGVbYl09NixlLmFueUJvb2xlYW49MSxlLmVuY29kaW5nVHlwZT0xLGUubWF4SWQ9MTYsZS5udW1DdXN0b21QdXJwb3Nlcz02LGUubnVtRW50cmllcz0xMixlLm51bVJlc3RyaWN0aW9ucz0xMixlLnB1cnBvc2VJZD02LGUucmVzdHJpY3Rpb25UeXBlPTIsZS5zZWdtZW50VHlwZT0zLGUuc2luZ2xlT3JSYW5nZT0xLGUudmVuZG9ySWQ9MTYsZX0oKTt0LkJpdExlbmd0aD1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwocj10LlJlc3RyaWN0aW9uVHlwZXx8KHQuUmVzdHJpY3Rpb25UeXBlPXt9KSlbci5OT1RfQUxMT1dFRD0wXT0iTk9UX0FMTE9XRUQiLHJbci5SRVFVSVJFX0NPTlNFTlQ9MV09IlJFUVVJUkVfQ09OU0VOVCIscltyLlJFUVVJUkVfTEk9Ml09IlJFUVVJUkVfTEkifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDIzKSxvPW4oNSksaT1uKDYpLHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmVuY29kZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0iIixvPTE7bzw9dDtvKyspbis9ci5Cb29sZWFuRW5jb2Rlci5lbmNvZGUoZS5oYXMobykpO3JldHVybiBufSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2lmKGUubGVuZ3RoIT09dCl0aHJvdyBuZXcgby5EZWNvZGluZ0Vycm9yKCJiaXRmaWVsZCBlbmNvZGluZyBsZW5ndGggbWlzbWF0Y2giKTtmb3IodmFyIG49bmV3IGkuVmVjdG9yLHM9MTtzPD10O3MrKylyLkJvb2xlYW5FbmNvZGVyLmRlY29kZShlW3MtMV0pJiZuLnNldChzKTtyZXR1cm4gbi5iaXRMZW5ndGg9ZS5sZW5ndGgsbn0sZX0oKTt0LkZpeGVkVmVjdG9yRW5jb2Rlcj1zfSwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZnVuY3Rpb24oZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9KG4oNDgpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksKHI9dC5UQ0ZDb21tYW5kfHwodC5UQ0ZDb21tYW5kPXt9KSkuUElORz0icGluZyIsci5HRVRfVENfREFUQT0iZ2V0VENEYXRhIixyLkdFVF9JTl9BUFBfVENfREFUQT0iZ2V0SW5BcHBUQ0RhdGEiLHIuR0VUX1ZFTkRPUl9MSVNUPSJnZXRWZW5kb3JMaXN0IixyLkFERF9FVkVOVF9MSVNURU5FUj0iYWRkRXZlbnRMaXN0ZW5lciIsci5SRU1PVkVfRVZFTlRfTElTVEVORVI9InJlbW92ZUV2ZW50TGlzdGVuZXIifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuKGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSh0LG4pfTtyZXR1cm4gZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWUodCxuKSx0LnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDI4KSxpPW4oMjkpLHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5jbXBTdGF0dXM9aS5DbXBTdGF0dXMuRVJST1IsdH1yZXR1cm4gcih0LGUpLHR9KG8uUmVzcG9uc2UpO3QuRGlzYWJsZWQ9c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxvPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihlLHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighbilyZXR1cm4gZTt2YXIgcixvLGk9bi5jYWxsKGUpLHM9W107dHJ5e2Zvcig7KHZvaWQgMD09PXR8fHQtLSA+MCkmJiEocj1pLm5leHQoKSkuZG9uZTspcy5wdXNoKHIudmFsdWUpfWNhdGNoKGUpe289e2Vycm9yOmV9fWZpbmFsbHl7dHJ5e3ImJiFyLmRvbmUmJihuPWkucmV0dXJuKSYmbi5jYWxsKGkpfWZpbmFsbHl7aWYobyl0aHJvdyBvLmVycm9yfX1yZXR1cm4gc30saT10aGlzJiZ0aGlzLl9fc3ByZWFkfHxmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllPWUuY29uY2F0KG8oYXJndW1lbnRzW3RdKSk7cmV0dXJuIGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDEzKSxhPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXt2YXIgcj1lLmNhbGwodGhpcyl8fHRoaXM7aWYoci5ldmVudFN0YXR1cz1zLkNtcEFwaU1vZGVsLmV2ZW50U3RhdHVzLHIuY21wU3RhdHVzPXMuQ21wQXBpTW9kZWwuY21wU3RhdHVzLHIubGlzdGVuZXJJZD1uLHMuQ21wQXBpTW9kZWwuZ2RwckFwcGxpZXMpe3ZhciBvPXMuQ21wQXBpTW9kZWwudGNNb2RlbDtyLnRjU3RyaW5nPXMuQ21wQXBpTW9kZWwudGNTdHJpbmcsci5pc1NlcnZpY2VTcGVjaWZpYz1vLmlzU2VydmljZVNwZWNpZmljLHIudXNlTm9uU3RhbmRhcmRTdGFja3M9by51c2VOb25TdGFuZGFyZFN0YWNrcyxyLnB1cnBvc2VPbmVUcmVhdG1lbnQ9by5wdXJwb3NlT25lVHJlYXRtZW50LHIucHVibGlzaGVyQ0M9by5wdWJsaXNoZXJDb3VudHJ5Q29kZSxyLm91dE9mQmFuZD17YWxsb3dlZFZlbmRvcnM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnZlbmRvcnNBbGxvd2VkLHQpLGRpc2Nsb3NlZFZlbmRvcnM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnZlbmRvcnNEaXNjbG9zZWQsdCl9LHIucHVycG9zZT17Y29uc2VudHM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnB1cnBvc2VDb25zZW50cyksbGVnaXRpbWF0ZUludGVyZXN0czpyLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMpfSxyLnZlbmRvcj17Y29uc2VudHM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnZlbmRvckNvbnNlbnRzLHQpLGxlZ2l0aW1hdGVJbnRlcmVzdHM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMsdCl9LHIuc3BlY2lhbEZlYXR1cmVPcHRpbnM9ci5jcmVhdGVWZWN0b3JGaWVsZChvLnNwZWNpYWxGZWF0dXJlT3B0aW5zKSxyLnB1Ymxpc2hlcj17Y29uc2VudHM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnB1Ymxpc2hlckNvbnNlbnRzKSxsZWdpdGltYXRlSW50ZXJlc3RzOnIuY3JlYXRlVmVjdG9yRmllbGQoby5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzKSxjdXN0b21QdXJwb3NlOntjb25zZW50czpyLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMpLGxlZ2l0aW1hdGVJbnRlcmVzdHM6ci5jcmVhdGVWZWN0b3JGaWVsZChvLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMpfSxyZXN0cmljdGlvbnM6ci5jcmVhdGVSZXN0cmljdGlvbnMoby5wdWJsaXNoZXJSZXN0cmljdGlvbnMpfX1yZXR1cm4gcn1yZXR1cm4gcih0LGUpLHQucHJvdG90eXBlLmNyZWF0ZVJlc3RyaWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD17fTtpZihlLm51bVJlc3RyaWN0aW9ucz4wKWZvcih2YXIgbj1lLmdldE1heFZlbmRvcklkKCkscj1mdW5jdGlvbihuKXt2YXIgcj1uLnRvU3RyaW5nKCk7ZS5nZXRSZXN0cmljdGlvbnMobikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnB1cnBvc2VJZC50b1N0cmluZygpO3Rbbl18fCh0W25dPXt9KSx0W25dW3JdPWUucmVzdHJpY3Rpb25UeXBlfSl9LG89MTtvPD1uO28rKylyKG8pO3JldHVybiB0fSx0LnByb3RvdHlwZS5jcmVhdGVWZWN0b3JGaWVsZD1mdW5jdGlvbihlLHQpe3JldHVybiB0P3QucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbisiIl09ZS5oYXMoK24pLHR9LHt9KTppKGUpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlW3RbMF0udG9TdHJpbmcoMTApXT10WzFdLGV9LHt9KX0sdH0obigyOCkuUmVzcG9uc2UpO3QuVENEYXRhPWF9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX3JlYWR8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiBlO3ZhciByLG8saT1uLmNhbGwoZSkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09dHx8dC0tID4wKSYmIShyPWkubmV4dCgpKS5kb25lOylzLnB1c2goci52YWx1ZSl9Y2F0Y2goZSl7bz17ZXJyb3I6ZX19ZmluYWxseXt0cnl7ciYmIXIuZG9uZSYmKG49aS5yZXR1cm4pJiZuLmNhbGwoaSl9ZmluYWxseXtpZihvKXRocm93IG8uZXJyb3J9fXJldHVybiBzfSxvPXRoaXMmJnRoaXMuX19zcHJlYWR8fGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWU9ZS5jb25jYXQocihhcmd1bWVudHNbdF0pKTtyZXR1cm4gZX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oNDcpLHM9bigxMDcpLGE9bigxMyksYz1uKDQ5KSx1PW4oMTI3KTt0LkFQSV9LRVk9Il9fdGNmYXBpIjt2YXIgcD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIG4scixvO2lmKGUpe3ZhciBzPWkuVENGQ29tbWFuZC5BRERfRVZFTlRfTElTVEVORVI7aWYobnVsbD09PShuPWUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuW3NdKXRocm93IG5ldyBFcnJvcigiQnVpbHQtSW4gQ3VzdG9tIENvbW1tYW5kIGZvciAiK3MrIiBub3QgYWxsb3dlZDogVXNlICIraS5UQ0ZDb21tYW5kLkdFVF9UQ19EQVRBKyIgaW5zdGVhZCIpO2lmKHM9aS5UQ0ZDb21tYW5kLlJFTU9WRV9FVkVOVF9MSVNURU5FUixudWxsPT09KHI9ZSl8fHZvaWQgMD09PXI/dm9pZCAwOnJbc10pdGhyb3cgbmV3IEVycm9yKCJCdWlsdC1JbiBDdXN0b20gQ29tbW1hbmQgZm9yICIrcysiIG5vdCBhbGxvd2VkIik7KG51bGw9PT0obz1lKXx8dm9pZCAwPT09bz92b2lkIDA6b1tpLlRDRkNvbW1hbmQuR0VUX1RDX0RBVEFdKSYmKGVbaS5UQ0ZDb21tYW5kLkFERF9FVkVOVF9MSVNURU5FUl09ZVtpLlRDRkNvbW1hbmQuR0VUX1RDX0RBVEFdLGVbaS5UQ0ZDb21tYW5kLlJFTU9WRV9FVkVOVF9MSVNURU5FUl09ZVtpLlRDRkNvbW1hbmQuR0VUX1RDX0RBVEFdKSx0aGlzLmN1c3RvbUNvbW1hbmRzPWV9dHJ5e3RoaXMuY2FsbFF1ZXVlPXdpbmRvd1t0LkFQSV9LRVldKCl8fFtdfWNhdGNoKGUpe3RoaXMuY2FsbFF1ZXVlPVtdfWZpbmFsbHl7d2luZG93W3QuQVBJX0tFWV09dGhpcy5hcGlDYWxsLmJpbmQodGhpcyksdGhpcy5wdXJnZVF1ZXVlZENhbGxzKCl9fXJldHVybiBlLnByb3RvdHlwZS5hcGlDYWxsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIscD1bXSxsPTM7bDxhcmd1bWVudHMubGVuZ3RoO2wrKylwW2wtM109YXJndW1lbnRzW2xdO2lmKCJzdHJpbmciIT10eXBlb2YgZSluKG51bGwsITEpO2Vsc2UgaWYodS5TdXBwb3J0ZWRWZXJzaW9ucy5oYXModCkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayBmdW5jdGlvbiIpO2EuQ21wQXBpTW9kZWwuZGlzYWJsZWQ/bihuZXcgYy5EaXNhYmxlZCwhMSk6dGhpcy5pc0N1c3RvbUNvbW1hbmQoZSl8fHRoaXMuaXNCdWlsdEluQ29tbWFuZChlKT90aGlzLmlzQ3VzdG9tQ29tbWFuZChlKSYmIXRoaXMuaXNCdWlsdEluQ29tbWFuZChlKT8ocj10aGlzLmN1c3RvbUNvbW1hbmRzKVtlXS5hcHBseShyLG8oW25dLHApKTplPT09aS5UQ0ZDb21tYW5kLlBJTkc/dGhpcy5pc0N1c3RvbUNvbW1hbmQoZSk/bmV3IHMuQ29tbWFuZE1hcFtlXSh0aGlzLmN1c3RvbUNvbW1hbmRzW2VdLHBbMF0sbnVsbCxuKTpuZXcgcy5Db21tYW5kTWFwW2VdKG4scFswXSk6dm9pZCAwPT09YS5DbXBBcGlNb2RlbC50Y01vZGVsP3RoaXMuY2FsbFF1ZXVlLnB1c2gobyhbZSx0LG5dLHApKTp0aGlzLmlzQ3VzdG9tQ29tbWFuZChlKSYmdGhpcy5pc0J1aWx0SW5Db21tYW5kKGUpP25ldyBzLkNvbW1hbmRNYXBbZV0odGhpcy5jdXN0b21Db21tYW5kc1tlXSxwWzBdLG51bGwsbik6bmV3IHMuQ29tbWFuZE1hcFtlXShuLHBbMF0pOm4obnVsbCwhMSl9ZWxzZSBuKG51bGwsITEpfSxlLnByb3RvdHlwZS5wdXJnZVF1ZXVlZENhbGxzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jYWxsUXVldWU7dGhpcy5jYWxsUXVldWU9W10sZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dpbmRvd1t0LkFQSV9LRVldLmFwcGx5KHdpbmRvdyxvKGUpKX0pfSxlLnByb3RvdHlwZS5pc0N1c3RvbUNvbW1hbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY3VzdG9tQ29tbWFuZHMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmN1c3RvbUNvbW1hbmRzW2VdfSxlLnByb3RvdHlwZS5pc0J1aWx0SW5Db21tYW5kPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1zLkNvbW1hbmRNYXBbZV19LGV9KCk7dC5DYWxsUmVzcG9uZGVyPXB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscihuKDM2KSkscihuKDUpKSxyKG4oNikpLHIobigxNSkpLHIobigyMCkpLHIobig2NSkpLHIobigzMykpLHIobigyMSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDUpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmVuY29kZT1mdW5jdGlvbihlKXtpZighL15bMC0xXSskLy50ZXN0KGUpKXRocm93IG5ldyByLkVuY29kaW5nRXJyb3IoIkludmFsaWQgYml0RmllbGQiKTt2YXIgdD1lLmxlbmd0aCV0aGlzLkxDTTtlKz10PyIwIi5yZXBlYXQodGhpcy5MQ00tdCk6IiI7Zm9yKHZhciBuPSIiLG89MDtvPGUubGVuZ3RoO28rPXRoaXMuQkFTSVMpbis9dGhpcy5ESUNUW3BhcnNlSW50KGUuc3Vic3RyKG8sdGhpcy5CQVNJUyksMildO3JldHVybiBufSxlLmRlY29kZT1mdW5jdGlvbihlKXtpZighL15bQS1aYS16MC05XC1fXSskLy50ZXN0KGUpKXRocm93IG5ldyByLkRlY29kaW5nRXJyb3IoIkludmFsaWRseSBlbmNvZGVkIEJhc2U2NFVSTCBzdHJpbmciKTtmb3IodmFyIHQ9IiIsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz10aGlzLlJFVkVSU0VfRElDVC5nZXQoZVtuXSkudG9TdHJpbmcoMik7dCs9IjAiLnJlcGVhdCh0aGlzLkJBU0lTLW8ubGVuZ3RoKStvfXJldHVybiB0fSxlLkRJQ1Q9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8iLGUuUkVWRVJTRV9ESUNUPW5ldyBNYXAoW1siQSIsMF0sWyJCIiwxXSxbIkMiLDJdLFsiRCIsM10sWyJFIiw0XSxbIkYiLDVdLFsiRyIsNl0sWyJIIiw3XSxbIkkiLDhdLFsiSiIsOV0sWyJLIiwxMF0sWyJMIiwxMV0sWyJNIiwxMl0sWyJOIiwxM10sWyJPIiwxNF0sWyJQIiwxNV0sWyJRIiwxNl0sWyJSIiwxN10sWyJTIiwxOF0sWyJUIiwxOV0sWyJVIiwyMF0sWyJWIiwyMV0sWyJXIiwyMl0sWyJYIiwyM10sWyJZIiwyNF0sWyJaIiwyNV0sWyJhIiwyNl0sWyJiIiwyN10sWyJjIiwyOF0sWyJkIiwyOV0sWyJlIiwzMF0sWyJmIiwzMV0sWyJnIiwzMl0sWyJoIiwzM10sWyJpIiwzNF0sWyJqIiwzNV0sWyJrIiwzNl0sWyJsIiwzN10sWyJtIiwzOF0sWyJuIiwzOV0sWyJvIiw0MF0sWyJwIiw0MV0sWyJxIiw0Ml0sWyJyIiw0M10sWyJzIiw0NF0sWyJ0Iiw0NV0sWyJ1Iiw0Nl0sWyJ2Iiw0N10sWyJ3Iiw0OF0sWyJ4Iiw0OV0sWyJ5Iiw1MF0sWyJ6Iiw1MV0sWyIwIiw1Ml0sWyIxIiw1M10sWyIyIiw1NF0sWyIzIiw1NV0sWyI0Iiw1Nl0sWyI1Iiw1N10sWyI2Iiw1OF0sWyI3Iiw1OV0sWyI4Iiw2MF0sWyI5Iiw2MV0sWyItIiw2Ml0sWyJfIiw2M11dKSxlLkJBU0lTPTYsZS5MQ009MjQsZX0oKTt0LkJhc2U2NFVybD1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuKGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSh0LG4pfTtyZXR1cm4gZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWUodCxuKSx0LnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnJvb3Q9bnVsbCx0fXJldHVybiByKHQsZSksdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLnJvb3R9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt2YXIgdCxuPXt2YWx1ZTplLGxlZnQ6bnVsbCxyaWdodDpudWxsfTtpZih0aGlzLmlzRW1wdHkoKSl0aGlzLnJvb3Q9bjtlbHNlIGZvcih0PXRoaXMucm9vdDs7KWlmKGU8dC52YWx1ZSl7aWYobnVsbD09PXQubGVmdCl7dC5sZWZ0PW47YnJlYWt9dD10LmxlZnR9ZWxzZXtpZighKGU+dC52YWx1ZSkpYnJlYWs7aWYobnVsbD09PXQucmlnaHQpe3QucmlnaHQ9bjticmVha310PXQucmlnaHR9fSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD10aGlzLnJvb3Q7dDspaWYodC5sZWZ0KXtmb3IodmFyIG49dC5sZWZ0O24ucmlnaHQmJm4ucmlnaHQhPXQ7KW49bi5yaWdodDtuLnJpZ2h0PT10PyhuLnJpZ2h0PW51bGwsZS5wdXNoKHQudmFsdWUpLHQ9dC5yaWdodCk6KG4ucmlnaHQ9dCx0PXQubGVmdCl9ZWxzZSBlLnB1c2godC52YWx1ZSksdD10LnJpZ2h0O3JldHVybiBlfSx0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ITEsbj10aGlzLnJvb3Q7bjspe2lmKG4udmFsdWU9PT1lKXt0PSEwO2JyZWFrfWU+bi52YWx1ZT9uPW4ucmlnaHQ6ZTxuLnZhbHVlJiYobj1uLmxlZnQpfXJldHVybiB0fSx0LnByb3RvdHlwZS5taW49ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHZvaWQgMD09PWUmJihlPXRoaXMucm9vdCk7ZTspZS5sZWZ0P2U9ZS5sZWZ0Oih0PWUudmFsdWUsZT1udWxsKTtyZXR1cm4gdH0sdC5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih2b2lkIDA9PT1lJiYoZT10aGlzLnJvb3QpO2U7KWUucmlnaHQ/ZT1lLnJpZ2h0Oih0PWUudmFsdWUsZT1udWxsKTtyZXR1cm4gdH0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9dGhpcy5yb290KTtmb3IodmFyIG49bnVsbCxyPSJsZWZ0Ijt0OylpZihlPHQudmFsdWUpbj10LHQ9dC5sZWZ0LHI9ImxlZnQiO2Vsc2UgaWYoZT50LnZhbHVlKW49dCx0PXQucmlnaHQscj0icmlnaHQiO2Vsc2V7aWYodC5sZWZ0fHx0LnJpZ2h0KWlmKHQubGVmdClpZih0LnJpZ2h0KXt2YXIgbz10aGlzLm1pbih0LnJpZ2h0KTt0aGlzLnJlbW92ZShvLHQucmlnaHQpLHQudmFsdWU9b31lbHNlIG4/bltyXT10LmxlZnQ6dGhpcy5yb290PXQubGVmdDtlbHNlIG4/bltyXT10LnJpZ2h0OnRoaXMucm9vdD10LnJpZ2h0O2Vsc2Ugbj9uW3JdPW51bGw6dGhpcy5yb290PW51bGw7dD1udWxsfX0sdH0obigxNSkuQ2xvbmVhYmxlKTt0LkJpbmFyeVNlYXJjaFRyZWU9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmNtcElkPSJjbXBJZCIsZS5jbXBWZXJzaW9uPSJjbXBWZXJzaW9uIixlLmNvbnNlbnRMYW5ndWFnZT0iY29uc2VudExhbmd1YWdlIixlLmNvbnNlbnRTY3JlZW49ImNvbnNlbnRTY3JlZW4iLGUuY3JlYXRlZD0iY3JlYXRlZCIsZS5zdXBwb3J0T09CPSJzdXBwb3J0T09CIixlLmlzU2VydmljZVNwZWNpZmljPSJpc1NlcnZpY2VTcGVjaWZpYyIsZS5sYXN0VXBkYXRlZD0ibGFzdFVwZGF0ZWQiLGUubnVtQ3VzdG9tUHVycG9zZXM9Im51bUN1c3RvbVB1cnBvc2VzIixlLnBvbGljeVZlcnNpb249InBvbGljeVZlcnNpb24iLGUucHVibGlzaGVyQ291bnRyeUNvZGU9InB1Ymxpc2hlckNvdW50cnlDb2RlIixlLnB1Ymxpc2hlckN1c3RvbUNvbnNlbnRzPSJwdWJsaXNoZXJDdXN0b21Db25zZW50cyIsZS5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzPSJwdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzIixlLnB1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHM9InB1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMiLGUucHVibGlzaGVyQ29uc2VudHM9InB1Ymxpc2hlckNvbnNlbnRzIixlLnB1Ymxpc2hlclJlc3RyaWN0aW9ucz0icHVibGlzaGVyUmVzdHJpY3Rpb25zIixlLnB1cnBvc2VDb25zZW50cz0icHVycG9zZUNvbnNlbnRzIixlLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzPSJwdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cyIsZS5wdXJwb3NlT25lVHJlYXRtZW50PSJwdXJwb3NlT25lVHJlYXRtZW50IixlLnNwZWNpYWxGZWF0dXJlT3B0aW5zPSJzcGVjaWFsRmVhdHVyZU9wdGlucyIsZS51c2VOb25TdGFuZGFyZFN0YWNrcz0idXNlTm9uU3RhbmRhcmRTdGFja3MiLGUudmVuZG9yQ29uc2VudHM9InZlbmRvckNvbnNlbnRzIixlLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHM9InZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMiLGUudmVuZG9yTGlzdFZlcnNpb249InZlbmRvckxpc3RWZXJzaW9uIixlLnZlbmRvcnNBbGxvd2VkPSJ2ZW5kb3JzQWxsb3dlZCIsZS52ZW5kb3JzRGlzY2xvc2VkPSJ2ZW5kb3JzRGlzY2xvc2VkIixlLnZlcnNpb249InZlcnNpb24iLGV9KCk7dC5GaWVsZHM9cn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxNSksaT1uKDUpLHM9bigzOCksYT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7dmFyIHI9ZS5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiB2b2lkIDAhPT10JiYoci5wdXJwb3NlSWQ9dCksdm9pZCAwIT09biYmKHIucmVzdHJpY3Rpb25UeXBlPW4pLHJ9cmV0dXJuIHIodCxlKSx0LnVuSGFzaD1mdW5jdGlvbihlKXt2YXIgbj1lLnNwbGl0KHRoaXMuaGFzaFNlcGFyYXRvcikscj1uZXcgdDtpZigyIT09bi5sZW5ndGgpdGhyb3cgbmV3IGkuVENNb2RlbEVycm9yKCJoYXNoIixlKTtyZXR1cm4gci5wdXJwb3NlSWQ9cGFyc2VJbnQoblswXSwxMCksci5yZXN0cmljdGlvblR5cGU9cGFyc2VJbnQoblsxXSwxMCkscn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJoYXNoIix7Z2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNWYWxpZCgpKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGhhc2ggaW52YWxpZCBQdXJwb3NlUmVzdHJpY3Rpb24iKTtyZXR1cm4iIit0aGlzLnB1cnBvc2VJZCt0Lmhhc2hTZXBhcmF0b3IrdGhpcy5yZXN0cmljdGlvblR5cGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwdXJwb3NlSWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXJwb3NlSWRffSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5wdXJwb3NlSWRfPWV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHRoaXMucHVycG9zZUlkKSYmdGhpcy5wdXJwb3NlSWQ+MCYmKHRoaXMucmVzdHJpY3Rpb25UeXBlPT09cy5SZXN0cmljdGlvblR5cGUuTk9UX0FMTE9XRUR8fHRoaXMucmVzdHJpY3Rpb25UeXBlPT09cy5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9DT05TRU5UfHx0aGlzLnJlc3RyaWN0aW9uVHlwZT09PXMuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfTEkpfSx0LnByb3RvdHlwZS5pc1NhbWVBcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXJwb3NlSWQ9PT1lLnB1cnBvc2VJZCYmdGhpcy5yZXN0cmljdGlvblR5cGU9PT1lLnJlc3RyaWN0aW9uVHlwZX0sdC5oYXNoU2VwYXJhdG9yPSItIix0fShvLkNsb25lYWJsZSk7dC5QdXJwb3NlUmVzdHJpY3Rpb249YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksKHI9dC5TZWdtZW50fHwodC5TZWdtZW50PXt9KSkuQ09SRT0iY29yZSIsci5WRU5ET1JTX0RJU0NMT1NFRD0idmVuZG9yc0Rpc2Nsb3NlZCIsci5WRU5ET1JTX0FMTE9XRUQ9InZlbmRvcnNBbGxvd2VkIixyLlBVQkxJU0hFUl9UQz0icHVibGlzaGVyVEMifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIobigyMykpLHIobig1OSkpLHIobigxMjEpKSxyKG4oMzkpKSxyKG4oMTYpKSxyKG4oNjApKSxyKG4oNjEpKSxyKG4oNjMpKSxyKG4oNjIpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigxNiksbz1uKDUpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiByLkludEVuY29kZXIuZW5jb2RlKE1hdGgucm91bmQoZS5nZXRUaW1lKCkvMTAwKSx0KX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0IT09ZS5sZW5ndGgpdGhyb3cgbmV3IG8uRGVjb2RpbmdFcnJvcigiaW52YWxpZCBiaXQgbGVuZ3RoIik7dmFyIG49bmV3IERhdGU7cmV0dXJuIG4uc2V0VGltZSgxMDAqci5JbnRFbmNvZGVyLmRlY29kZShlLHQpKSxufSxlfSgpO3QuRGF0ZUVuY29kZXI9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigxNiksbz1uKDUpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmVuY29kZT1mdW5jdGlvbihlLHQpe3ZhciBuPShlPWUudG9VcHBlckNhc2UoKSkuY2hhckNvZGVBdCgwKS02NSxpPWUuY2hhckNvZGVBdCgxKS02NTtpZihuPDB8fG4+MjV8fGk8MHx8aT4yNSl0aHJvdyBuZXcgby5FbmNvZGluZ0Vycm9yKCJpbnZhbGlkIGxhbmd1YWdlIGNvZGU6ICIrZSk7aWYodCUyPT0xKXRocm93IG5ldyBvLkVuY29kaW5nRXJyb3IoIm51bUJpdHMgbXVzdCBiZSBldmVuLCAiK3QrIiBpcyBub3QgdmFsaWQiKTtyZXR1cm4gdC89MixyLkludEVuY29kZXIuZW5jb2RlKG4sdCkrci5JbnRFbmNvZGVyLmVuY29kZShpLHQpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2lmKHQhPT1lLmxlbmd0aHx8ZS5sZW5ndGglMil0aHJvdyBuZXcgby5EZWNvZGluZ0Vycm9yKCJpbnZhbGlkIGJpdCBsZW5ndGggZm9yIGxhbmd1YWdlIik7dmFyIG49ZS5sZW5ndGgvMixpPXIuSW50RW5jb2Rlci5kZWNvZGUoZS5zbGljZSgwLG4pLG4pKzY1LHM9ci5JbnRFbmNvZGVyLmRlY29kZShlLnNsaWNlKG4pLG4pKzY1O3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpK1N0cmluZy5mcm9tQ2hhckNvZGUocyl9LGV9KCk7dC5MYW5nRW5jb2Rlcj1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDM3KSxvPW4oMjMpLGk9big1KSxzPW4oMTYpLGE9big2KSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5lbmNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9cy5JbnRFbmNvZGVyLmVuY29kZShlLm51bVJlc3RyaWN0aW9ucyxyLkJpdExlbmd0aC5udW1SZXN0cmljdGlvbnMpO3JldHVybiBlLmlzRW1wdHkoKXx8ZS5nZXRSZXN0cmljdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QrPXMuSW50RW5jb2Rlci5lbmNvZGUobi5wdXJwb3NlSWQsci5CaXRMZW5ndGgucHVycG9zZUlkKSx0Kz1zLkludEVuY29kZXIuZW5jb2RlKG4ucmVzdHJpY3Rpb25UeXBlLHIuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSk7Zm9yKHZhciBpPWUuZ2V0VmVuZG9ycyhuKSxhPWkubGVuZ3RoLGM9MCx1PTAscD0iIixsPWZ1bmN0aW9uKHQpe3ZhciBuPWlbdF07MD09PXUmJihjKyssdT1uKTt2YXIgbD1pW2EtMV0sZD1lLmd2bC52ZW5kb3JJZHM7aWYodD09PWEtMXx8aVt0KzFdPmZ1bmN0aW9uKGUpe2Zvcig7KytlPD1sJiYhZC5oYXMoZSk7KTtyZXR1cm4gZX0obikpe3ZhciBmPSEobj09PXUpO3ArPW8uQm9vbGVhbkVuY29kZXIuZW5jb2RlKGYpLHArPXMuSW50RW5jb2Rlci5lbmNvZGUodSxyLkJpdExlbmd0aC52ZW5kb3JJZCksZiYmKHArPXMuSW50RW5jb2Rlci5lbmNvZGUobixyLkJpdExlbmd0aC52ZW5kb3JJZCkpLHU9MH19LGQ9MDtkPGE7ZCsrKWwoZCk7dCs9cy5JbnRFbmNvZGVyLmVuY29kZShjLHIuQml0TGVuZ3RoLm51bUVudHJpZXMpLHQrPXB9KSx0fSxlLmRlY29kZT1mdW5jdGlvbihlKXt2YXIgdD0wLG49bmV3IGEuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yLGM9cy5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cih0LHIuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9ucyksci5CaXRMZW5ndGgubnVtUmVzdHJpY3Rpb25zKTt0Kz1yLkJpdExlbmd0aC5udW1SZXN0cmljdGlvbnM7Zm9yKHZhciB1PTA7dTxjO3UrKyl7dmFyIHA9cy5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cih0LHIuQml0TGVuZ3RoLnB1cnBvc2VJZCksci5CaXRMZW5ndGgucHVycG9zZUlkKTt0Kz1yLkJpdExlbmd0aC5wdXJwb3NlSWQ7dmFyIGw9cy5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cih0LHIuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSksci5CaXRMZW5ndGgucmVzdHJpY3Rpb25UeXBlKTt0Kz1yLkJpdExlbmd0aC5yZXN0cmljdGlvblR5cGU7dmFyIGQ9bmV3IGEuUHVycG9zZVJlc3RyaWN0aW9uKHAsbCksZj1zLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsci5CaXRMZW5ndGgubnVtRW50cmllcyksci5CaXRMZW5ndGgubnVtRW50cmllcyk7dCs9ci5CaXRMZW5ndGgubnVtRW50cmllcztmb3IodmFyIGg9MDtoPGY7aCsrKXt2YXIgdj1vLkJvb2xlYW5FbmNvZGVyLmRlY29kZShlLnN1YnN0cih0LHIuQml0TGVuZ3RoLmFueUJvb2xlYW4pKTt0Kz1yLkJpdExlbmd0aC5hbnlCb29sZWFuO3ZhciB5PXMuSW50RW5jb2Rlci5kZWNvZGUoZS5zdWJzdHIodCxyLkJpdExlbmd0aC52ZW5kb3JJZCksci5CaXRMZW5ndGgudmVuZG9ySWQpO2lmKHQrPXIuQml0TGVuZ3RoLnZlbmRvcklkLHYpe3ZhciBnPXMuSW50RW5jb2Rlci5kZWNvZGUoZS5zdWJzdHIodCxyLkJpdExlbmd0aC52ZW5kb3JJZCksci5CaXRMZW5ndGgudmVuZG9ySWQpO2lmKHQrPXIuQml0TGVuZ3RoLnZlbmRvcklkLGc8eSl0aHJvdyBuZXcgaS5EZWNvZGluZ0Vycm9yKCJJbnZhbGlkIFJhbmdlRW50cnk6IGVuZFZlbmRvcklkICIrZysiIGlzIGxlc3MgdGhhbiAiK3kpO2Zvcih2YXIgbT15O208PWc7bSsrKW4uYWRkKG0sZCl9ZWxzZSBuLmFkZCh5LGQpfX1yZXR1cm4gbi5iaXRMZW5ndGg9dCxufSxlfSgpO3QuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yRW5jb2Rlcj1jfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDYpLG89bigzNiksaT1uKDE2KSxzPW4oMjMpLGE9bigzOSksYz1uKDYzKSx1PW4oNSkscD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuZW5jb2RlPWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj1bXSxhPWkuSW50RW5jb2Rlci5lbmNvZGUoZS5tYXhJZCxvLkJpdExlbmd0aC5tYXhJZCksdT0iIixwPW8uQml0TGVuZ3RoLm1heElkK28uQml0TGVuZ3RoLmVuY29kaW5nVHlwZSxsPXArZS5tYXhJZCxkPTIqby5CaXRMZW5ndGgudmVuZG9ySWQrby5CaXRMZW5ndGguc2luZ2xlT3JSYW5nZStvLkJpdExlbmd0aC5udW1FbnRyaWVzLGY9cCtvLkJpdExlbmd0aC5udW1FbnRyaWVzO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oaSxhKXt1Kz1zLkJvb2xlYW5FbmNvZGVyLmVuY29kZShpKSwodD1lLm1heElkPmQmJmY8bCkmJmkmJihlLmhhcyhhKzEpPzA9PT1yLmxlbmd0aCYmKHIucHVzaChhKSxmKz1vLkJpdExlbmd0aC5zaW5nbGVPclJhbmdlLGYrPW8uQml0TGVuZ3RoLnZlbmRvcklkKTooci5wdXNoKGEpLGYrPW8uQml0TGVuZ3RoLnZlbmRvcklkLG4ucHVzaChyKSxyPVtdKSl9KSx0PyhhKz1jLlZlY3RvckVuY29kaW5nVHlwZS5SQU5HRSsiIixhKz10aGlzLmJ1aWxkUmFuZ2VFbmNvZGluZyhuKSk6KGErPWMuVmVjdG9yRW5jb2RpbmdUeXBlLkZJRUxEKyIiLGErPXUpLGF9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scD0wLGw9aS5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cihwLG8uQml0TGVuZ3RoLm1heElkKSxvLkJpdExlbmd0aC5tYXhJZCk7cCs9by5CaXRMZW5ndGgubWF4SWQ7dmFyIGQ9aS5JbnRFbmNvZGVyLmRlY29kZShlLmNoYXJBdChwKSxvLkJpdExlbmd0aC5lbmNvZGluZ1R5cGUpO2lmKHArPW8uQml0TGVuZ3RoLmVuY29kaW5nVHlwZSxkPT09Yy5WZWN0b3JFbmNvZGluZ1R5cGUuUkFOR0Upe2lmKG49bmV3IHIuVmVjdG9yLDE9PT10KXtpZigiMSI9PT1lLnN1YnN0cihwLDEpKXRocm93IG5ldyB1LkRlY29kaW5nRXJyb3IoIlVuYWJsZSB0byBkZWNvZGUgZGVmYXVsdCBjb25zZW50PTEiKTtwKyt9dmFyIGY9aS5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cihwLG8uQml0TGVuZ3RoLm51bUVudHJpZXMpLG8uQml0TGVuZ3RoLm51bUVudHJpZXMpO3ArPW8uQml0TGVuZ3RoLm51bUVudHJpZXM7Zm9yKHZhciBoPTA7aDxmO2grKyl7dmFyIHY9cy5Cb29sZWFuRW5jb2Rlci5kZWNvZGUoZS5jaGFyQXQocCkpO3ArPW8uQml0TGVuZ3RoLnNpbmdsZU9yUmFuZ2U7dmFyIHk9aS5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cihwLG8uQml0TGVuZ3RoLnZlbmRvcklkKSxvLkJpdExlbmd0aC52ZW5kb3JJZCk7aWYocCs9by5CaXRMZW5ndGgudmVuZG9ySWQsdil7dmFyIGc9aS5JbnRFbmNvZGVyLmRlY29kZShlLnN1YnN0cihwLG8uQml0TGVuZ3RoLnZlbmRvcklkKSxvLkJpdExlbmd0aC52ZW5kb3JJZCk7cCs9by5CaXRMZW5ndGgudmVuZG9ySWQ7Zm9yKHZhciBtPXk7bTw9ZzttKyspbi5zZXQobSl9ZWxzZSBuLnNldCh5KX19ZWxzZXt2YXIgYj1lLnN1YnN0cihwLGwpO3ArPWwsbj1hLkZpeGVkVmVjdG9yRW5jb2Rlci5kZWNvZGUoYixsKX1yZXR1cm4gbi5iaXRMZW5ndGg9cCxufSxlLmJ1aWxkUmFuZ2VFbmNvZGluZz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPWkuSW50RW5jb2Rlci5lbmNvZGUodCxvLkJpdExlbmd0aC5udW1FbnRyaWVzKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PTE9PT1lLmxlbmd0aDtuKz1zLkJvb2xlYW5FbmNvZGVyLmVuY29kZSghdCksbis9aS5JbnRFbmNvZGVyLmVuY29kZShlWzBdLG8uQml0TGVuZ3RoLnZlbmRvcklkKSx0fHwobis9aS5JbnRFbmNvZGVyLmVuY29kZShlWzFdLG8uQml0TGVuZ3RoLnZlbmRvcklkKSl9KSxufSxlfSgpO3QuVmVuZG9yVmVjdG9yRW5jb2Rlcj1wfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwocj10LlZlY3RvckVuY29kaW5nVHlwZXx8KHQuVmVjdG9yRW5jb2RpbmdUeXBlPXt9KSlbci5GSUVMRD0wXT0iRklFTEQiLHJbci5SQU5HRT0xXT0iUkFOR0UifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIobigxMjIpKSxyKG4oMTIzKSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5hYnNDYWxsPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihvLGkpe3ZhciBzPW5ldyBYTUxIdHRwUmVxdWVzdDtzLndpdGhDcmVkZW50aWFscz1uLHMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXtpZihzLnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpaWYocy5zdGF0dXM+PTIwMCYmcy5zdGF0dXM8MzAwKXt2YXIgZT1zLnJlc3BvbnNlO2lmKCJzdHJpbmciPT10eXBlb2YgZSl0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe31vKGUpfWVsc2UgaShuZXcgRXJyb3IoIkhUVFAgU3RhdHVzOiAiK3Muc3RhdHVzKyIgcmVzcG9uc2UgdHlwZTogIitzLnJlc3BvbnNlVHlwZSkpfSkscy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtpKG5ldyBFcnJvcigiZXJyb3IiKSl9KSxzLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixmdW5jdGlvbigpe2kobmV3IEVycm9yKCJhYm9ydGVkIikpfSksbnVsbD09PXQ/cy5vcGVuKCJHRVQiLGUsITApOnMub3BlbigiUE9TVCIsZSwhMCkscy5yZXNwb25zZVR5cGU9Impzb24iLHMudGltZW91dD1yLHMub250aW1lb3V0PWZ1bmN0aW9uKCl7aShuZXcgRXJyb3IoIlRpbWVvdXQgIityKyJtcyAiK2UpKX0scy5zZW5kKHQpfSl9LGUucG9zdD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITEpLHZvaWQgMD09PXImJihyPTApLHRoaXMuYWJzQ2FsbChlLEpTT04uc3RyaW5naWZ5KHQpLG4scil9LGUuZmV0Y2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10JiYodD0hMSksdm9pZCAwPT09biYmKG49MCksdGhpcy5hYnNDYWxsKGUsbnVsbCx0LG4pfSxlfSgpO3QuSnNvbj1yfSxmdW5jdGlvbihlLHQpe30sZnVuY3Rpb24oZSx0KXt9LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQpe30sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9WyJlbiIsImZyIiwiZGUiLCJpdCIsImVzIiwiZGEiLCJubCIsImVsIiwiaHUiLCJwdCIsInJvIiwiZmkiLCJwbCIsInNrIiwic3YiLCJubyIsInJ1IiwiYmciLCJjYSIsImNzIiwiZXQiLCJociIsImx0IiwibHYiLCJtdCIsInNsIiwidHIiLCJ6aCJdfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09YXJndW1lbnRzW3JdO3JldHVybiBlLmFwcGx5KHQsbil9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDcpO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgaTtpZihuKWk9bih0KTtlbHNlIGlmKHIuaXNVUkxTZWFyY2hQYXJhbXModCkpaT10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgcz1bXTtyLmZvckVhY2godCxmdW5jdGlvbihlLHQpe251bGwhPT1lJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBlJiYoci5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sci5mb3JFYWNoKGUsZnVuY3Rpb24oZSl7ci5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6ci5pc09iamVjdChlKSYmKGU9SlNPTi5zdHJpbmdpZnkoZSkpLHMucHVzaChvKHQpKyI9IitvKGUpKX0pKX0pLGk9cy5qb2luKCImIil9aWYoaSl7dmFyIGE9ZS5pbmRleE9mKCIjIik7LTEhPT1hJiYoZT1lLnNsaWNlKDAsYSkpLGUrPSgtMT09PWUuaW5kZXhPZigiPyIpPyI/IjoiJiIpK2l9cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe3ZhciByPW4oNyksbz1uKDEzNCksaT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIHMoZSx0KXshci5pc1VuZGVmaW5lZChlKSYmci5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgYT17YWRhcHRlcjpmdW5jdGlvbigpe2NvbnN0ICRfX19vbGRfYjc5ZWFlMGMzNjk3M2ZiYz17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpO3RyeXtpZigkX19fb2xkX2I3OWVhZTBjMzY5NzNmYmMpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fbW9ja180MWRkMGFiNWY1MGY4MTk4LlhNTEh0dHBSZXF1ZXN0KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4oInVuZGVmaW5lZCIhPT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fCJ1bmRlZmluZWQiIT09dHlwZW9mIHQmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkmJihlPW4oNzUpKSxlfS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtpZigkX19fb2xkX2I3OWVhZTBjMzY5NzNmYmMpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fb2xkX2I3OWVhZTBjMzY5NzNmYmMpfX0oKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBvKHQsIkFjY2VwdCIpLG8odCwiQ29udGVudC1UeXBlIiksci5pc0Zvcm1EYXRhKGUpfHxyLmlzQXJyYXlCdWZmZXIoZSl8fHIuaXNCdWZmZXIoZSl8fHIuaXNTdHJlYW0oZSl8fHIuaXNGaWxlKGUpfHxyLmlzQmxvYihlKT9lOnIuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6ci5pc1VSTFNlYXJjaFBhcmFtcyhlKT8ocyh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6ci5pc09iamVjdChlKT8ocyh0LCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiKSxKU09OLnN0cmluZ2lmeShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXtpZigic3RyaW5nIj09PXR5cGVvZiBlKXRyeXtlPUpTT04ucGFyc2UoZSl9Y2F0Y2godCl7fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtyLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sZnVuY3Rpb24oZSl7YS5oZWFkZXJzW2VdPXt9fSksci5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7YS5oZWFkZXJzW2VdPXIubWVyZ2UoaSl9KSxlLmV4cG9ydHM9YX0pLmNhbGwodGhpcyxuKDEzMykpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyksbz1uKDEzNSksaT1uKDcyKSxzPW4oMTM3KSxhPW4oMTQwKSxjPW4oMTQxKSx1PW4oNzYpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxwKXt2YXIgbD1lLmRhdGEsZD1lLmhlYWRlcnM7ci5pc0Zvcm1EYXRhKGwpJiZkZWxldGUgZFsiQ29udGVudC1UeXBlIl07dmFyIGY9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGg9ZS5hdXRoLnVzZXJuYW1lfHwiIix2PWUuYXV0aC5wYXNzd29yZHx8IiI7ZC5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoaCsiOiIrdil9dmFyIHk9cyhlLmJhc2VVUkwsZS51cmwpO2lmKGYub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLGkoeSxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0LGYub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoZiYmND09PWYucmVhZHlTdGF0ZSYmKDAhPT1mLnN0YXR1c3x8Zi5yZXNwb25zZVVSTCYmMD09PWYucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkpe3ZhciBuPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj9hKGYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwscj17ZGF0YTplLnJlc3BvbnNlVHlwZSYmInRleHQiIT09ZS5yZXNwb25zZVR5cGU/Zi5yZXNwb25zZTpmLnJlc3BvbnNlVGV4dCxzdGF0dXM6Zi5zdGF0dXMsc3RhdHVzVGV4dDpmLnN0YXR1c1RleHQsaGVhZGVyczpuLGNvbmZpZzplLHJlcXVlc3Q6Zn07byh0LHAsciksZj1udWxsfX0sZi5vbmFib3J0PWZ1bmN0aW9uKCl7ZiYmKHAodSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtwKHUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxmKSksZj1udWxsfSxmLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PSJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLHAodSh0LGUsIkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sci5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgZz1uKDE0MiksbT0oZS53aXRoQ3JlZGVudGlhbHN8fGMoeSkpJiZlLnhzcmZDb29raWVOYW1lP2cucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7bSYmKGRbZS54c3JmSGVhZGVyTmFtZV09bSl9aWYoInNldFJlcXVlc3RIZWFkZXIiaW4gZiYmci5mb3JFYWNoKGQsZnVuY3Rpb24oZSx0KXsidW5kZWZpbmVkIj09PXR5cGVvZiBsJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgZFt0XTpmLnNldFJlcXVlc3RIZWFkZXIodCxlKX0pLHIuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoZi53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksZS5yZXNwb25zZVR5cGUpdHJ5e2YucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlfWNhdGNoKGIpe2lmKCJqc29uIiE9PWUucmVzcG9uc2VUeXBlKXRocm93IGJ9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmZi5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PT10eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzJiZmLnVwbG9hZCYmZi51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24oZSl7ZiYmKGYuYWJvcnQoKSxwKGUpLGY9bnVsbCl9KSx2b2lkIDA9PT1sJiYobD1udWxsKSxmLnNlbmQobCl9KX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMzYpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvLGkpe3ZhciBzPW5ldyBFcnJvcihlKTtyZXR1cm4gcihzLHQsbixvLGkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49e30sbz1bInVybCIsIm1ldGhvZCIsInBhcmFtcyIsImRhdGEiXSxpPVsiaGVhZGVycyIsImF1dGgiLCJwcm94eSJdLHM9WyJiYXNlVVJMIiwidXJsIiwidHJhbnNmb3JtUmVxdWVzdCIsInRyYW5zZm9ybVJlc3BvbnNlIiwicGFyYW1zU2VyaWFsaXplciIsInRpbWVvdXQiLCJ3aXRoQ3JlZGVudGlhbHMiLCJhZGFwdGVyIiwicmVzcG9uc2VUeXBlIiwieHNyZkNvb2tpZU5hbWUiLCJ4c3JmSGVhZGVyTmFtZSIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJtYXhDb250ZW50TGVuZ3RoIiwidmFsaWRhdGVTdGF0dXMiLCJtYXhSZWRpcmVjdHMiLCJodHRwQWdlbnQiLCJodHRwc0FnZW50IiwiY2FuY2VsVG9rZW4iLCJzb2NrZXRQYXRoIl07ci5mb3JFYWNoKG8sZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPT10eXBlb2YgdFtlXSYmKG5bZV09dFtlXSl9KSxyLmZvckVhY2goaSxmdW5jdGlvbihvKXtyLmlzT2JqZWN0KHRbb10pP25bb109ci5kZWVwTWVyZ2UoZVtvXSx0W29dKToidW5kZWZpbmVkIiE9PXR5cGVvZiB0W29dP25bb109dFtvXTpyLmlzT2JqZWN0KGVbb10pP25bb109ci5kZWVwTWVyZ2UoZVtvXSk6InVuZGVmaW5lZCIhPT10eXBlb2YgZVtvXSYmKG5bb109ZVtvXSl9KSxyLmZvckVhY2gocyxmdW5jdGlvbihyKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB0W3JdP25bcl09dFtyXToidW5kZWZpbmVkIiE9PXR5cGVvZiBlW3JdJiYobltyXT1lW3JdKX0pO3ZhciBhPW8uY29uY2F0KGkpLmNvbmNhdChzKSxjPU9iamVjdC5rZXlzKHQpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PWEuaW5kZXhPZihlKX0pO3JldHVybiByLmZvckVhY2goYyxmdW5jdGlvbihyKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB0W3JdP25bcl09dFtyXToidW5kZWZpbmVkIiE9PXR5cGVvZiBlW3JdJiYobltyXT1lW3JdKX0pLG59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5tZXNzYWdlPWV9ci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sci5wcm90b3R5cGUuX19DQU5DRUxfXz0hMCxlLmV4cG9ydHM9cn0sLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscihuKDQ3KSkscihuKDI3KSkscihuKDI5KSkscihuKDEwNikpO3ZhciBvPW4oNTEpO3QuQVBJX0tFWT1vLkFQSV9LRVl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMjgpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0iZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgMTYgMTcnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgc3R5bGU9J21hcmdpbi1yaWdodDogNXB4OyBoZWlnaHQ6IDE3cHg7JyUzRSUzQ2cgaWQ9J1BhZ2UtMScgc3Ryb2tlPSdub25lJyBzdHJva2Utd2lkdGg9JzEnIGZpbGw9J25vbmUnIGZpbGwtcnVsZT0nZXZlbm9kZCclM0UlM0NnIGlkPSdjb2cnIGZpbGw9JyUyM0ZGRkZGRicgZmlsbC1ydWxlPSdub256ZXJvJyUzRSUzQ3BhdGggZD0nTTE1LjU5NjkxNyw5Ljk4MzI2OTM4IEwxNC41MDQxMDc5LDkuMzM3OTg4MTYgQzE0LjU3MjgwNjQsOC43ODE1Mzg2IDE0LjU3MjgwNjQsOC4yMTg0NjE0IDE0LjUwNDEwNzksNy42NjIwMTE4NCBMMTUuNTk2OTE3LDcuMDE2NzMwNjIgQzE1LjkxNzgyMjksNi44MjcyNjI1OSAxNi4wNzI2MTI0LDYuNDM3NDI3MzIgMTUuOTY3MDg0OCw2LjA3NDE1NDYgQzE1LjU5MTI4NzEsNC43ODAzMzYxMSAxNC45MjIzNjQ2LDMuNjE1NzMxNTMgMTQuMDM5MDAyMSwyLjY2MDYxMTEzIEMxMy43ODMxNzU1LDIuMzg0MDE3OTcgMTMuMzc0OTA1MywyLjMyMzQ4OTY1IDEzLjA1MjUyNDksMi41MTM4NDg4MSBMMTEuOTYxMzI0MywzLjE1ODEzNjA4IEMxMS41MjQ4NTE5LDIuODE4NDAxMTcgMTEuMDQ4MTIyMSwyLjUzNjQ4NjYzIDEwLjU0MjQ4MiwyLjMxOTEwMjU1IEwxMC41NDI0ODIsMS4wMjk5MTEwOCBDMTAuNTQyNDgyLDAuNjQ4NDM4NzMzIDEwLjI4NjA1MjIsMC4zMTY4Njk2ODMgOS45MjMwNTU5MiwwLjIyOTAyNDc5MiBDOC42NjE1NSwtMC4wNzYzMjQ0NiA3LjMzODcxODA5LC0wLjA3NjM1ODczNDIgNi4wNzY5NDQwOCwwLjIyOTAyNDc5MiBDNS43MTM5ODEzMSwwLjMxNjg2OTY4MyA1LjQ1NzUxOCwwLjY0ODQwNDQ1OCA1LjQ1NzUxOCwxLjAyOTkxMTA4IEw1LjQ1NzUxOCwyLjMxOTEwMjU1IEM0Ljk1MTg3NDA2LDIuNTM2NDc4NzIgNC40NzUxNDMzNCwyLjgxODM5MzgyIDQuMDM4Njc1NzIsMy4xNTgxMzYwOCBMMi45NDc0NzUxMSwyLjUxMzg0ODgxIEMyLjYyNTA2MTIyLDIuMzIzNDg5NjUgMi4yMTY3OTA5NCwyLjM4NDAxNzk3IDEuOTYwOTk3ODYsMi42NjA2MTExMyBDMS4wNzc2MzU0MiwzLjYxNTczMTUzIDAuNDA4NzEyODksNC43ODAzNzAzOCAwLjAzMjkxNTIyMzYsNi4wNzQxNTQ2IEMtMC4wNzI2MTI0MDcsNi40Mzc0MjczMiAwLjA4MjE3NzA4OTksNi44MjcyMjgzMiAwLjQwMzA4Mjk2Miw3LjAxNjczMDYyIEwxLjQ5NTg5MjEyLDcuNjYyMDExODQgQzEuNDI3MTkzNTYsOC4yMTg0NjE0IDEuNDI3MTkzNTYsOC43ODE1Mzg2IDEuNDk1ODkyMTIsOS4zMzc5ODgxNiBMMC40MDMwODI5NjIsOS45ODMyNjkzOCBDMC4wODIxNzcwODk5LDEwLjE3MjczNzQgLTAuMDcyNjEyNDA3LDEwLjU2MjU3MjcgMC4wMzI5MTUyMjM2LDEwLjkyNTg0NTQgQzAuNDA4NzEyODksMTIuMjE5NjI5NiAxLjA3NzYzNTQyLDEzLjM4NDI2ODUgMS45NjA5OTc4NiwxNC4zMzkzODg5IEMyLjIxNjgyNDQ1LDE0LjYxNTk4MiAyLjYyNTA5NDc0LDE0LjY3NjUxMDMgMi45NDc0NzUxMSwxNC40ODYxODU1IEw0LjAzODY3NTcyLDEzLjg0MTg5ODIgQzQuNDc1MTQwOTYsMTQuMTgxNjM0OSA0Ljk1MTg3MjQzLDE0LjQ2MzUzODkgNS40NTc1MTgsMTQuNjgwODk3NSBMNS40NTc1MTgsMTUuOTcwMDg4OSBDNS40NTc1MTgsMTYuMzUxNTYxMyA1LjcxMzk0NzgsMTYuNjgzMTMwMyA2LjA3Njk0NDA4LDE2Ljc3MDk3NTIgQzcuMzM4NDgzNTEsMTcuMDc2MzI0NSA4LjY2MTI4MTkxLDE3LjA3NjM1ODcgOS45MjMwNTU5MiwxNi43NzA5NzUyIEMxMC4yODYwMTg3LDE2LjY4MzEzMDMgMTAuNTQyNDgyLDE2LjM1MTU5NTUgMTAuNTQyNDgyLDE1Ljk3MDA4ODkgTDEwLjU0MjQ4MiwxNC42ODA4OTc1IEMxMS4wNDgxMTgzLDE0LjQ2MzUxOTggMTEuNTI0ODQ3NSwxNC4xODE2MTcxIDExLjk2MTMyNDMsMTMuODQxODk4MiBMMTMuMDUyNTI0OSwxNC40ODYxODU1IEMxMy4zNzQ5MDUzLDE0LjY3NjU0NDYgMTMuNzgzMTc1NSwxNC42MTYwMTYzIDE0LjAzOTAwMjEsMTQuMzM5Mzg4OSBDMTQuOTIyMzY0NiwxMy4zODQyNjg1IDE1LjU5MTI4NzEsMTIuMjE5NjI5NiAxNS45NjcwODQ4LDEwLjkyNTg0NTQgQzE2LjA3MjYxMjQsMTAuNTYyNTcyNyAxNS45MTc4MjI5LDEwLjE3Mjc3MTcgMTUuNTk2OTE3LDkuOTgzMjY5MzggWiBNMTMuNDAyNjE5MywxMy40MjY0OTQzIEwxMS44NTA3MzY0LDEyLjUxMDAwMSBDMTAuOTQ2MzI4OCwxMy4zMDA3NDIxIDEwLjYyNTU5MDUsMTMuNDk5NzA0MSA5LjQ3MDExNDg0LDEzLjkxNzI2NzMgTDkuNDcwMTE0ODQsMTUuNzUwMjE5NiBDOC41MDAyNDgwOCwxNS45NTQ4MzczIDcuNDk5NzUxOTIsMTUuOTU0ODM3MyA2LjUyOTg4NTE2LDE1Ljc1MDIxOTYgTDYuNTI5ODg1MTYsMTMuOTE3MjY3MyBDNS40MDMxOTU5LDEzLjUxMDEyMzUgNS4wNzY5OTUyMiwxMy4zMjEwNjY4IDQuMTQ5MjYzNTgsMTIuNTEwMDAxIEwyLjU5NzM4MDc1LDEzLjQyNjQ5NDMgQzEuOTM2ODY5NiwxMi42NjkzNzYzIDEuNDM0OTAxMjQsMTEuNzgxNzA3NiAxLjEyNTI1NTIyLDEwLjgyMzA5MTIgTDIuNjc3ODA4MjgsOS45MDY1OTc4OSBDMi40NTg4MTA4LDguNjkyNzA2OTQgMi40NTg3MTAyNyw4LjMwNzkwOTk5IDIuNjc3ODA4MjgsNy4wOTM0MDIxMSBMMS4xMjUyNTUyMiw2LjE3NjkwODc5IEMxLjQzNDkwMTI0LDUuMjE4MjkyNDIgMS45MzY5MDMxMSw0LjMzMDU4OTQ2IDIuNTk3MzgwNzUsMy41NzMxMjg2NCBMNC4xNDkyNjM1OCw0LjQ5MDMwNzQ1IEM1LjA2NjcwNzIsMy42ODcxMjQ3OCA1LjM5MTI5OTMzLDMuNDk0MTI2NSA2LjUyOTg4NTE2LDMuMDgyNjk4NDYgTDYuNTI5ODg1MTYsMS4yNDk3ODAzNyBDNy40OTk3MTc3NCwxLjA0NDgyMDU5IDguNTAwMjgyMjYsMS4wNDQ4MjA1OSA5LjQ3MDExNDg0LDEuMjQ5NzgwMzcgTDkuNDcwMTE0ODQsMy4wODI3MzI3NCBDMTAuNjA4NzY3NywzLjQ5NDE5NTA1IDEwLjkzMzM5MzMsMy42ODcyMjc2IDExLjg1MDczNjQsNC40OTAzNDE3MiBMMTMuNDAyNjE5MywzLjU3MzE2MjkxIEMxNC4wNjMwOTY5LDQuMzMwNTg5NDYgMTQuNTY1MDk4OCw1LjIxODI5MjQyIDE0Ljg3NDc0NDgsNi4xNzY5NDMwNiBMMTMuMzIyMTkxNyw3LjA5MzQzNjM4IEMxMy41NDEyMjI3LDguMzA3NjM1OCAxMy41NDEyODk3LDguNjkyMTI0MjggMTMuMzIyMTkxNyw5LjkwNjYzMjE3IEwxNC44NzQ3NDQ4LDEwLjgyMzEyNTUgQzE0LjU2NTA5ODgsMTEuNzgxNzA3NiAxNC4wNjMxMzA0LDEyLjY2OTQxMDUgMTMuNDAyNjE5MywxMy40MjY0OTQzIFogTTgsNS4yMDk2ODk1OCBDNi4yMjYwNzAxNCw1LjIwOTY4OTU4IDQuNzgyODk4NTMsNi42ODU3MDk5NiA0Ljc4Mjg5ODUzLDguNTAwMDE3MTQgQzQuNzgyODk4NTMsMTAuMzE0MzI0MyA2LjIyNjA3MDE0LDExLjc5MDM0NDcgOCwxMS43OTAzNDQ3IEM5Ljc3MzkyOTg2LDExLjc5MDM0NDcgMTEuMjE3MTAxNSwxMC4zMTQzMjQzIDExLjIxNzEwMTUsOC41MDAwMTcxNCBDMTEuMjE3MTAxNSw2LjY4NTcwOTk2IDkuNzczOTI5ODYsNS4yMDk2ODk1OCA4LDUuMjA5Njg5NTggWiBNOCwxMC42OTM1Njg4IEM2LjgxNzM4MDA5LDEwLjY5MzU2ODggNS44NTUyNjU2OCw5LjcwOTU1NTI2IDUuODU1MjY1NjgsOC41MDAwMTcxNCBDNS44NTUyNjU2OCw3LjI5MDQ3OTAyIDYuODE3MzgwMDksNi4zMDY0NjU0MyA4LDYuMzA2NDY1NDMgQzkuMTgyNjE5OTEsNi4zMDY0NjU0MyAxMC4xNDQ3MzQzLDcuMjkwNDc5MDIgMTAuMTQ0NzM0Myw4LjUwMDAxNzE0IEMxMC4xNDQ3MzQzLDkuNzA5NTU1MjYgOS4xODI2MTk5MSwxMC42OTM1Njg4IDgsMTAuNjkzNTY4OCBaJyBpZD0nU2hhcGUnJTNFJTNDL3BhdGglM0UlM0MvZyUzRSUzQy9nJTNFJTNDL3N2ZyUzRSJ9LCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO3ZhciB0PU9iamVjdC5wcm90b3R5cGUsbj10Lmhhc093blByb3BlcnR5LHI9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LG89ci5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGk9ci5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPXIudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiBhKGUsdCxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLGVbdF19dHJ5e2Eoe30sIiIpfWNhdGNoKFApe2E9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW59fWZ1bmN0aW9uIGMoZSx0LG4scil7dmFyIG89dCYmdC5wcm90b3R5cGUgaW5zdGFuY2VvZiBsP3Q6bCxpPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLHM9bmV3IFMocnx8W10pO3JldHVybiBpLl9pbnZva2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSJzdXNwZW5kZWRTdGFydCI7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYoImV4ZWN1dGluZyI9PT1yKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKCJjb21wbGV0ZWQiPT09cil7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gTCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIHM9bi5kZWxlZ2F0ZTtpZihzKXt2YXIgYT1DKHMsbik7aWYoYSl7aWYoYT09PXApY29udGludWU7cmV0dXJuIGF9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZigic3VzcGVuZGVkU3RhcnQiPT09cil0aHJvdyByPSJjb21wbGV0ZWQiLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj0iZXhlY3V0aW5nIjt2YXIgYz11KGUsdCxuKTtpZigibm9ybWFsIj09PWMudHlwZSl7aWYocj1uLmRvbmU/ImNvbXBsZXRlZCI6InN1c3BlbmRlZFlpZWxkIixjLmFyZz09PXApY29udGludWU7cmV0dXJue3ZhbHVlOmMuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09Yy50eXBlJiYocj0iY29tcGxldGVkIixuLm1ldGhvZD0idGhyb3ciLG4uYXJnPWMuYXJnKX19fShlLG4scyksaX1mdW5jdGlvbiB1KGUsdCxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOmUuY2FsbCh0LG4pfX1jYXRjaChQKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpQfX19ZS53cmFwPWM7dmFyIHA9e307ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGYoKXt9dmFyIGg9e307aFtvXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgdj1PYmplY3QuZ2V0UHJvdG90eXBlT2YseT12JiZ2KHYoSShbXSkpKTt5JiZ5IT09dCYmbi5jYWxsKHksbykmJihoPXkpO3ZhciBnPWYucHJvdG90eXBlPWwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaCk7ZnVuY3Rpb24gbShlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24odCl7YShlLHQsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2ludm9rZSh0LGUpfSl9KX1mdW5jdGlvbiBiKGUsdCl7dmFyIHI7dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gcygpe3JldHVybiBuZXcgdChmdW5jdGlvbihyLHMpeyFmdW5jdGlvbiByKG8saSxzLGEpe3ZhciBjPXUoZVtvXSxlLGkpO2lmKCJ0aHJvdyIhPT1jLnR5cGUpe3ZhciBwPWMuYXJnLGw9cC52YWx1ZTtyZXR1cm4gbCYmIm9iamVjdCI9PT10eXBlb2YgbCYmbi5jYWxsKGwsIl9fYXdhaXQiKT90LnJlc29sdmUobC5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKGUpe3IoIm5leHQiLGUscyxhKX0sZnVuY3Rpb24oZSl7cigidGhyb3ciLGUscyxhKX0pOnQucmVzb2x2ZShsKS50aGVuKGZ1bmN0aW9uKGUpe3AudmFsdWU9ZSxzKHApfSxmdW5jdGlvbihlKXtyZXR1cm4gcigidGhyb3ciLGUscyxhKX0pfWEoYy5hcmcpfShvLGkscixzKX0pfXJldHVybiByPXI/ci50aGVuKHMscyk6cygpfX1mdW5jdGlvbiBDKGUsdCl7dmFyIG49ZS5pdGVyYXRvclt0Lm1ldGhvZF07aWYodm9pZCAwPT09bil7aWYodC5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT10Lm1ldGhvZCl7aWYoZS5pdGVyYXRvci5yZXR1cm4mJih0Lm1ldGhvZD0icmV0dXJuIix0LmFyZz12b2lkIDAsQyhlLHQpLCJ0aHJvdyI9PT10Lm1ldGhvZCkpcmV0dXJuIHA7dC5tZXRob2Q9InRocm93Iix0LmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIHB9dmFyIHI9dShuLGUuaXRlcmF0b3IsdC5hcmcpO2lmKCJ0aHJvdyI9PT1yLnR5cGUpcmV0dXJuIHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9ci5hcmcsdC5kZWxlZ2F0ZT1udWxsLHA7dmFyIG89ci5hcmc7cmV0dXJuIG8/by5kb25lPyh0W2UucmVzdWx0TmFtZV09by52YWx1ZSx0Lm5leHQ9ZS5uZXh0TG9jLCJyZXR1cm4iIT09dC5tZXRob2QmJih0Lm1ldGhvZD0ibmV4dCIsdC5hcmc9dm9pZCAwKSx0LmRlbGVnYXRlPW51bGwscCk6bzoodC5tZXRob2Q9InRocm93Iix0LmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLHQuZGVsZWdhdGU9bnVsbCxwKX1mdW5jdGlvbiBfKGUpe3ZhciB0PXt0cnlMb2M6ZVswXX07MSBpbiBlJiYodC5jYXRjaExvYz1lWzFdKSwyIGluIGUmJih0LmZpbmFsbHlMb2M9ZVsyXSx0LmFmdGVyTG9jPWVbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKHQpfWZ1bmN0aW9uIEUoZSl7dmFyIHQ9ZS5jb21wbGV0aW9ufHx7fTt0LnR5cGU9Im5vcm1hbCIsZGVsZXRlIHQuYXJnLGUuY29tcGxldGlvbj10fWZ1bmN0aW9uIFMoZSl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLGUuZm9yRWFjaChfLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIEkoZSl7aWYoZSl7dmFyIHQ9ZVtvXTtpZih0KXJldHVybiB0LmNhbGwoZSk7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBlLm5leHQpcmV0dXJuIGU7aWYoIWlzTmFOKGUubGVuZ3RoKSl7dmFyIHI9LTEsaT1mdW5jdGlvbiB0KCl7Zm9yKDsrK3I8ZS5sZW5ndGg7KWlmKG4uY2FsbChlLHIpKXJldHVybiB0LnZhbHVlPWVbcl0sdC5kb25lPSExLHQ7cmV0dXJuIHQudmFsdWU9dm9pZCAwLHQuZG9uZT0hMCx0fTtyZXR1cm4gaS5uZXh0PWl9fXJldHVybntuZXh0Okx9fWZ1bmN0aW9uIEwoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiBkLnByb3RvdHlwZT1nLmNvbnN0cnVjdG9yPWYsZi5jb25zdHJ1Y3Rvcj1kLGQuZGlzcGxheU5hbWU9YShmLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksZS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PSJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4hIXQmJih0PT09ZHx8IkdlbmVyYXRvckZ1bmN0aW9uIj09PSh0LmRpc3BsYXlOYW1lfHx0Lm5hbWUpKX0sZS5tYXJrPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsZik6KGUuX19wcm90b19fPWYsYShlLHMsIkdlbmVyYXRvckZ1bmN0aW9uIikpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZyksZX0sZS5hd3JhcD1mdW5jdGlvbihlKXtyZXR1cm57X19hd2FpdDplfX0sbShiLnByb3RvdHlwZSksYi5wcm90b3R5cGVbaV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5Bc3luY0l0ZXJhdG9yPWIsZS5hc3luYz1mdW5jdGlvbih0LG4scixvLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBzPW5ldyBiKGModCxuLHIsbyksaSk7cmV0dXJuIGUuaXNHZW5lcmF0b3JGdW5jdGlvbihuKT9zOnMubmV4dCgpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZT9lLnZhbHVlOnMubmV4dCgpfSl9LG0oZyksYShnLHMsIkdlbmVyYXRvciIpLGdbb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSxlLmtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKG4pO3JldHVybiB0LnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDt0Lmxlbmd0aDspe3ZhciByPXQucG9wKCk7aWYociBpbiBlKXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sZS52YWx1ZXM9SSxTLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UyxyZXNldDpmdW5jdGlvbihlKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD12b2lkIDAsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9dm9pZCAwLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKEUpLCFlKWZvcih2YXIgdCBpbiB0aGlzKSJ0Ij09PXQuY2hhckF0KDApJiZuLmNhbGwodGhpcyx0KSYmIWlzTmFOKCt0LnNsaWNlKDEpKSYmKHRoaXNbdF09dm9pZCAwKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgZT10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZG9uZSl0aHJvdyBlO3ZhciB0PXRoaXM7ZnVuY3Rpb24gcihuLHIpe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz1lLHQubmV4dD1uLHImJih0Lm1ldGhvZD0ibmV4dCIsdC5hcmc9dm9pZCAwKSwhIXJ9Zm9yKHZhciBvPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIGk9dGhpcy50cnlFbnRyaWVzW29dLHM9aS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWkudHJ5TG9jKXJldHVybiByKCJlbmQiKTtpZihpLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgYT1uLmNhbGwoaSwiY2F0Y2hMb2MiKSxjPW4uY2FsbChpLCJmaW5hbGx5TG9jIik7aWYoYSYmYyl7aWYodGhpcy5wcmV2PGkuY2F0Y2hMb2MpcmV0dXJuIHIoaS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGkuZmluYWxseUxvYylyZXR1cm4gcihpLmZpbmFsbHlMb2MpfWVsc2UgaWYoYSl7aWYodGhpcy5wcmV2PGkuY2F0Y2hMb2MpcmV0dXJuIHIoaS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGkuZmluYWxseUxvYylyZXR1cm4gcihpLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3I+PTA7LS1yKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbcl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmbi5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT1lfHwiY29udGludWUiPT09ZSkmJmkudHJ5TG9jPD10JiZ0PD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBzPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBzLnR5cGU9ZSxzLmFyZz10LGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLHApOnRoaXMuY29tcGxldGUocyl9LGNvbXBsZXRlOmZ1bmN0aW9uKGUsdCl7aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4iYnJlYWsiPT09ZS50eXBlfHwiY29udGludWUiPT09ZS50eXBlP3RoaXMubmV4dD1lLmFyZzoicmV0dXJuIj09PWUudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPWUuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT1lLnR5cGUmJnQmJih0aGlzLm5leHQ9dCkscH0sZmluaXNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7dD49MDstLXQpe3ZhciBuPXRoaXMudHJ5RW50cmllc1t0XTtpZihuLmZpbmFsbHlMb2M9PT1lKXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxFKG4pLHB9fSxjYXRjaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgbj10aGlzLnRyeUVudHJpZXNbdF07aWYobi50cnlMb2M9PT1lKXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7RShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkkoZSkscmVzdWx0TmFtZTp0LG5leHRMb2M6bn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz12b2lkIDApLHB9fSxlfShlLmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9cn1jYXRjaChvKXtGdW5jdGlvbigiciIsInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShyKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLChyPXQuQ21wU3RhdHVzfHwodC5DbXBTdGF0dXM9e30pKS5TVFVCPSJzdHViIixyLkxPQURJTkc9ImxvYWRpbmciLHIuTE9BREVEPSJsb2FkZWQiLHIuRVJST1I9ImVycm9yIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksKHI9dC5EaXNwbGF5U3RhdHVzfHwodC5EaXNwbGF5U3RhdHVzPXt9KSkuVklTSUJMRT0idmlzaWJsZSIsci5ISURERU49ImhpZGRlbiIsci5ESVNBQkxFRD0iZGlzYWJsZWQifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwocj10LkV2ZW50U3RhdHVzfHwodC5FdmVudFN0YXR1cz17fSkpLlRDX0xPQURFRD0idGNsb2FkZWQiLHIuQ01QX1VJX1NIT1dOPSJjbXB1aXNob3duIixyLlVTRVJfQUNUSU9OX0NPTVBMRVRFPSJ1c2VyYWN0aW9uY29tcGxldGUifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDMwKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuZXZlbnRRdWV1ZT1uZXcgTWFwLHRoaXMucXVldWVOdW1iZXI9MH1yZXR1cm4gZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV2ZW50UXVldWUuc2V0KHRoaXMucXVldWVOdW1iZXIsZSksdGhpcy5xdWV1ZU51bWJlcisrfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZXZlbnRRdWV1ZS5kZWxldGUoZSl9LGUucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50UXVldWUuZm9yRWFjaChmdW5jdGlvbihlLHQpe25ldyByLkdldFRDRGF0YUNvbW1hbmQoZS5jYWxsYmFjayxlLnBhcmFtLHQsZS5uZXh0KX0pfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucXVldWVOdW1iZXI9MCx0aGlzLmV2ZW50UXVldWUuY2xlYXIoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXZlbnRRdWV1ZS5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KCk7dC5FdmVudExpc3RlbmVyUXVldWU9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxvPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihlLHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighbilyZXR1cm4gZTt2YXIgcixvLGk9bi5jYWxsKGUpLHM9W107dHJ5e2Zvcig7KHZvaWQgMD09PXR8fHQtLSA+MCkmJiEocj1pLm5leHQoKSkuZG9uZTspcy5wdXNoKHIudmFsdWUpfWNhdGNoKGUpe289e2Vycm9yOmV9fWZpbmFsbHl7dHJ5e3ImJiFyLmRvbmUmJihuPWkucmV0dXJuKSYmbi5jYWxsKGkpfWZpbmFsbHl7aWYobyl0aHJvdyBvLmVycm9yfX1yZXR1cm4gc30saT10aGlzJiZ0aGlzLl9fc3ByZWFkfHxmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllPWUuY29uY2F0KG8oYXJndW1lbnRzW3RdKSk7cmV0dXJuIGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBkZWxldGUgbi5vdXRPZkJhbmQsbn1yZXR1cm4gcih0LGUpLHQucHJvdG90eXBlLmNyZWF0ZVZlY3RvckZpZWxkPWZ1bmN0aW9uKGUpe3JldHVybiBpKGUpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlKyh0WzFdPyIxIjoiMCIpfSwiIil9LHQucHJvdG90eXBlLmNyZWF0ZVJlc3RyaWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD17fTtpZihlLm51bVJlc3RyaWN0aW9ucz4wKXt2YXIgbj1lLmdldE1heFZlbmRvcklkKCk7ZS5nZXRSZXN0cmljdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZS5wdXJwb3NlSWQudG9TdHJpbmcoKV09Il8iLnJlcGVhdChuKX0pO2Zvcih2YXIgcj1mdW5jdGlvbihuKXt2YXIgcj1uKzE7ZS5nZXRSZXN0cmljdGlvbnMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj1lLnJlc3RyaWN0aW9uVHlwZS50b1N0cmluZygpLG89ZS5wdXJwb3NlSWQudG9TdHJpbmcoKSxpPXRbb10uc3Vic3RyKDAsbikscz10W29dLnN1YnN0cihuKzEpO3Rbb109aStyK3N9KX0sbz0wO288bjtvKyspcihvKX1yZXR1cm4gdH0sdH0obig1MCkuVENEYXRhKTt0LkluQXBwVENEYXRhPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTMpLGk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PWUuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gdC5jbXBMb2FkZWQ9ITAsdC5jbXBTdGF0dXM9by5DbXBBcGlNb2RlbC5jbXBTdGF0dXMsdC5kaXNwbGF5U3RhdHVzPW8uQ21wQXBpTW9kZWwuZGlzcGxheVN0YXR1cyx0LmFwaVZlcnNpb249IiIrby5DbXBBcGlNb2RlbC5hcGlWZXJzaW9uLG8uQ21wQXBpTW9kZWwudGNNb2RlbCYmby5DbXBBcGlNb2RlbC50Y01vZGVsLnZlbmRvckxpc3RWZXJzaW9uJiYodC5ndmxWZXJzaW9uPStvLkNtcEFwaU1vZGVsLnRjTW9kZWwudmVuZG9yTGlzdFZlcnNpb24pLHR9cmV0dXJuIHIodCxlKSx0fShuKDI4KS5SZXNwb25zZSk7dC5QaW5nPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMTMpLG89bigyOSksaT1uKDUxKSxzPW4oNTIpLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuLG8pe3ZvaWQgMD09PW4mJihuPSExKSx0aGlzLm51bVVwZGF0ZXM9MCx0aGlzLnRocm93SWZJbnZhbGlkSW50KGUsImNtcElkIiwyKSx0aGlzLnRocm93SWZJbnZhbGlkSW50KHQsImNtcFZlcnNpb24iLDApLHIuQ21wQXBpTW9kZWwuY21wSWQ9ZSxyLkNtcEFwaU1vZGVsLmNtcFZlcnNpb249dCx0aGlzLmlzU2VydmljZVNwZWNpZmljPSEhbix0aGlzLmNhbGxSZXNwb25kZXI9bmV3IGkuQ2FsbFJlc3BvbmRlcihvKX1yZXR1cm4gZS5wcm90b3R5cGUudGhyb3dJZkludmFsaWRJbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCEoIm51bWJlciI9PXR5cGVvZiBlJiZOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj1uKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgIit0KyI6ICIrZSl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PSExKSxyLkNtcEFwaU1vZGVsLmRpc2FibGVkKXRocm93IG5ldyBFcnJvcigiQ21wQXBpIERpc2FibGVkIik7ci5DbXBBcGlNb2RlbC5jbXBTdGF0dXM9by5DbXBTdGF0dXMuTE9BREVELHQ/KHIuQ21wQXBpTW9kZWwuZGlzcGxheVN0YXR1cz1vLkRpc3BsYXlTdGF0dXMuVklTSUJMRSxyLkNtcEFwaU1vZGVsLmV2ZW50U3RhdHVzPW8uRXZlbnRTdGF0dXMuQ01QX1VJX1NIT1dOKTp2b2lkIDA9PT1yLkNtcEFwaU1vZGVsLnRjTW9kZWw/KHIuQ21wQXBpTW9kZWwuZGlzcGxheVN0YXR1cz1vLkRpc3BsYXlTdGF0dXMuRElTQUJMRUQsci5DbXBBcGlNb2RlbC5ldmVudFN0YXR1cz1vLkV2ZW50U3RhdHVzLlRDX0xPQURFRCk6KHIuQ21wQXBpTW9kZWwuZGlzcGxheVN0YXR1cz1vLkRpc3BsYXlTdGF0dXMuSElEREVOLHIuQ21wQXBpTW9kZWwuZXZlbnRTdGF0dXM9by5FdmVudFN0YXR1cy5VU0VSX0FDVElPTl9DT01QTEVURSksci5DbXBBcGlNb2RlbC5nZHByQXBwbGllcz1udWxsIT09ZSxyLkNtcEFwaU1vZGVsLmdkcHJBcHBsaWVzPygiIj09PWU/KHIuQ21wQXBpTW9kZWwudGNNb2RlbD1uZXcgcy5UQ01vZGVsLHIuQ21wQXBpTW9kZWwudGNNb2RlbC5jbXBJZD1yLkNtcEFwaU1vZGVsLmNtcElkLHIuQ21wQXBpTW9kZWwudGNNb2RlbC5jbXBWZXJzaW9uPXIuQ21wQXBpTW9kZWwuY21wVmVyc2lvbik6ci5DbXBBcGlNb2RlbC50Y01vZGVsPXMuVENTdHJpbmcuZGVjb2RlKGUpLHIuQ21wQXBpTW9kZWwudGNNb2RlbC5pc1NlcnZpY2VTcGVjaWZpYz10aGlzLmlzU2VydmljZVNwZWNpZmljLHIuQ21wQXBpTW9kZWwudGNmUG9saWN5VmVyc2lvbj0rci5DbXBBcGlNb2RlbC50Y01vZGVsLnBvbGljeVZlcnNpb24sci5DbXBBcGlNb2RlbC50Y1N0cmluZz1lKTpyLkNtcEFwaU1vZGVsLnRjTW9kZWw9bnVsbCwwPT09dGhpcy5udW1VcGRhdGVzP3RoaXMuY2FsbFJlc3BvbmRlci5wdXJnZVF1ZXVlZENhbGxzKCk6ci5DbXBBcGlNb2RlbC5ldmVudFF1ZXVlLmV4ZWMoKSx0aGlzLm51bVVwZGF0ZXMrK30sZS5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3IuQ21wQXBpTW9kZWwuZGlzYWJsZWQ9ITAsci5DbXBBcGlNb2RlbC5jbXBTdGF0dXM9by5DbXBTdGF0dXMuRVJST1J9LGV9KCk7dC5DbXBBcGk9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigxMDgpLG89bigzMCksaT1uKDEwOSkscz1uKDExMCksYT1uKDEyNSksYz1uKDEyNiksdT1uKDQ4KSxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe312YXIgdCxuLHAsbCxkLGY7cmV0dXJuIHQ9dS5UQ0ZDb21tYW5kLlBJTkcsbj11LlRDRkNvbW1hbmQuR0VUX1RDX0RBVEEscD11LlRDRkNvbW1hbmQuR0VUX0lOX0FQUF9UQ19EQVRBLGw9dS5UQ0ZDb21tYW5kLkdFVF9WRU5ET1JfTElTVCxkPXUuVENGQ29tbWFuZC5BRERfRVZFTlRfTElTVEVORVIsZj11LlRDRkNvbW1hbmQuUkVNT1ZFX0VWRU5UX0xJU1RFTkVSLGVbdF09ci5QaW5nQ29tbWFuZCxlW25dPW8uR2V0VENEYXRhQ29tbWFuZCxlW3BdPWkuR2V0SW5BcHBUQ0RhdGFDb21tYW5kLGVbbF09cy5HZXRWZW5kb3JMaXN0Q29tbWFuZCxlW2RdPWEuQWRkRXZlbnRMaXN0ZW5lckNvbW1hbmQsZVtmXT1jLlJlbW92ZUV2ZW50TGlzdGVuZXJDb21tYW5kLGV9KCk7dC5Db21tYW5kTWFwPXB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMjcpLGk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIodCxlKSx0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKCl7dGhpcy5pbnZva2VDYWxsYmFjayhuZXcgby5QaW5nKX0sdH0obigzMSkuQ29tbWFuZCk7dC5QaW5nQ29tbWFuZD1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuKGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSh0LG4pfTtyZXR1cm4gZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWUodCxuKSx0LnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDMwKSxpPW4oMjcpLHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIodCxlKSx0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKCl7dGhpcy50aHJvd0lmUGFyYW1JbnZhbGlkKCksdGhpcy5pbnZva2VDYWxsYmFjayhuZXcgaS5JbkFwcFRDRGF0YSh0aGlzLnBhcmFtKSl9LHR9KG8uR2V0VENEYXRhQ29tbWFuZCk7dC5HZXRJbkFwcFRDRGF0YUNvbW1hbmQ9c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxMyksaT1uKDMxKSxzPW4oNTIpLGE9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIodCxlKSx0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49by5DbXBBcGlNb2RlbC50Y01vZGVsLHI9bi52ZW5kb3JMaXN0VmVyc2lvbjt2b2lkIDA9PT10aGlzLnBhcmFtJiYodGhpcy5wYXJhbT1yKSwoZT10aGlzLnBhcmFtPT09ciYmbi5ndmw/bi5ndmw6bmV3IHMuR1ZMKHRoaXMucGFyYW0pKS5yZWFkeVByb21pc2UudGhlbihmdW5jdGlvbigpe3QuaW52b2tlQ2FsbGJhY2soZS5nZXRKc29uKCkpfSl9LHR9KGkuQ29tbWFuZCk7dC5HZXRWZW5kb3JMaXN0Q29tbWFuZD1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuKGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSh0LG4pfTtyZXR1cm4gZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWUodCxuKSx0LnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLm5hbWU9IkRlY29kaW5nRXJyb3IiLG59cmV0dXJuIHIodCxlKSx0fShFcnJvcik7dC5EZWNvZGluZ0Vycm9yPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4ubmFtZT0iRW5jb2RpbmdFcnJvciIsbn1yZXR1cm4gcih0LGUpLHR9KEVycm9yKTt0LkVuY29kaW5nRXJyb3I9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5uYW1lPSJHVkxFcnJvciIsbn1yZXR1cm4gcih0LGUpLHR9KEVycm9yKTt0LkdWTEVycm9yPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIpe3ZvaWQgMD09PXImJihyPSIiKTt2YXIgbz1lLmNhbGwodGhpcywiaW52YWxpZCB2YWx1ZSAiK24rIiBwYXNzZWQgZm9yICIrdCsiICIrcil8fHRoaXM7cmV0dXJuIG8ubmFtZT0iVENNb2RlbEVycm9yIixvfXJldHVybiByKHQsZSksdH0oRXJyb3IpO3QuVENNb2RlbEVycm9yPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmxhbmdTZXQuaGFzKHQpfSxlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2UubGFuZ1NldC5mb3JFYWNoKHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5sYW5nU2V0LnNpemV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5sYW5nU2V0PW5ldyBTZXQoWyJCRyIsIkNBIiwiQ1MiLCJEQSIsIkRFIiwiRUwiLCJFTiIsIkVTIiwiRVQiLCJGSSIsIkZSIiwiSFIiLCJIVSIsIklUIiwiSkEiLCJMVCIsIkxWIiwiTVQiLCJOTCIsIk5PIiwiUEwiLCJQVCIsIlJPIiwiUlUiLCJTSyIsIlNMIiwiU1YiLCJUUiIsIlpIIl0pLGV9KCk7dC5Db25zZW50TGFuZ3VhZ2VzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCksbz10aGlzJiZ0aGlzLl9fdmFsdWVzfHxmdW5jdGlvbihlKXt2YXIgdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3Isbj10JiZlW3RdLHI9MDtpZihuKXJldHVybiBuLmNhbGwoZSk7aWYoZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aClyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybiBlJiZyPj1lLmxlbmd0aCYmKGU9dm9pZCAwKSx7dmFsdWU6ZSYmZVtyKytdLGRvbmU6IWV9fX07dGhyb3cgbmV3IFR5cGVFcnJvcih0PyJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiI6IlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oNTYpLHM9big1NCksYT1uKDM4KSxjPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuYml0TGVuZ3RoPTAsdC5tYXA9bmV3IE1hcCx0fXJldHVybiByKHQsZSksdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm1hcC5oYXMoZSl9LHQucHJvdG90eXBlLmlzT2tUb0hhdmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89ITA7aWYobnVsbD09PShyPXRoaXMuZ3ZsKXx8dm9pZCAwPT09cj92b2lkIDA6ci52ZW5kb3JzKXt2YXIgaT10aGlzLmd2bC52ZW5kb3JzW25dO2lmKGkpaWYoZT09PWEuUmVzdHJpY3Rpb25UeXBlLk5PVF9BTExPV0VEKW89aS5sZWdJbnRQdXJwb3Nlcy5pbmNsdWRlcyh0KXx8aS5wdXJwb3Nlcy5pbmNsdWRlcyh0KTtlbHNlIGlmKGkuZmxleGlibGVQdXJwb3Nlcy5sZW5ndGgpc3dpdGNoKGUpe2Nhc2UgYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9DT05TRU5UOm89aS5mbGV4aWJsZVB1cnBvc2VzLmluY2x1ZGVzKHQpJiZpLmxlZ0ludFB1cnBvc2VzLmluY2x1ZGVzKHQpO2JyZWFrO2Nhc2UgYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9MSTpvPWkuZmxleGlibGVQdXJwb3Nlcy5pbmNsdWRlcyh0KSYmaS5wdXJwb3Nlcy5pbmNsdWRlcyh0KX1lbHNlIG89ITE7ZWxzZSBvPSExfXJldHVybiBvfSx0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmlzT2tUb0hhdmUodC5yZXN0cmljdGlvblR5cGUsdC5wdXJwb3NlSWQsZSkpe3ZhciBuPXQuaGFzaDt0aGlzLmhhcyhuKXx8KHRoaXMubWFwLnNldChuLG5ldyBzLkJpbmFyeVNlYXJjaFRyZWUpLHRoaXMuYml0TGVuZ3RoPTApLHRoaXMubWFwLmdldChuKS5hZGQoZSl9fSx0LnByb3RvdHlwZS5yZXN0cmljdFB1cnBvc2VUb0xlZ2FsQmFzaXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuZ3ZsLnZlbmRvcklkcyxuPWUuaGFzaCxyPWZ1bmN0aW9uKCl7dmFyIGUsbixyO3RyeXtmb3IodmFyIGk9byh0KSxzPWkubmV4dCgpOyFzLmRvbmU7cz1pLm5leHQoKSlyPXMudmFsdWV9Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7cyYmIXMuZG9uZSYmKG49aS5yZXR1cm4pJiZuLmNhbGwoaSl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fXJldHVybiByfSgpLGk9MTtpPD1yO2krKyl0aGlzLmhhcyhuKXx8KHRoaXMubWFwLnNldChuLG5ldyBzLkJpbmFyeVNlYXJjaFRyZWUpLHRoaXMuYml0TGVuZ3RoPTApLHRoaXMubWFwLmdldChuKS5hZGQoaSl9LHQucHJvdG90eXBlLmdldFZlbmRvcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107aWYoZSl7dmFyIG49ZS5oYXNoO3RoaXMuaGFzKG4pJiYodD10aGlzLm1hcC5nZXQobikuZ2V0KCkpfWVsc2V7dmFyIHI9bmV3IFNldDt0aGlzLm1hcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZ2V0KCkuZm9yRWFjaChmdW5jdGlvbihlKXtyLmFkZChlKX0pfSksdD1BcnJheS5mcm9tKHIpfXJldHVybiB0fSx0LnByb3RvdHlwZS5nZXRSZXN0cmljdGlvblR5cGU9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gdGhpcy5nZXRSZXN0cmljdGlvbnMoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnB1cnBvc2VJZD09PXQmJih2b2lkIDA9PT1ufHxuPmUucmVzdHJpY3Rpb25UeXBlKSYmKG49ZS5yZXN0cmljdGlvblR5cGUpfSksbn0sdC5wcm90b3R5cGUudmVuZG9ySGFzUmVzdHJpY3Rpb249ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49ITEscj10aGlzLmdldFJlc3RyaWN0aW9ucyhlKSxvPTA7bzxyLmxlbmd0aCYmIW47bysrKW49dC5pc1NhbWVBcyhyW29dKTtyZXR1cm4gbn0sdC5wcm90b3R5cGUuZ2V0TWF4VmVuZG9ySWQ9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiB0aGlzLm1hcC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2U9TWF0aC5tYXgodC5tYXgoKSxlKX0pLGV9LHQucHJvdG90eXBlLmdldFJlc3RyaWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbihuLHIpe2U/bi5jb250YWlucyhlKSYmdC5wdXNoKGkuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChyKSk6dC5wdXNoKGkuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChyKSl9KSx0fSx0LnByb3RvdHlwZS5nZXRQdXJwb3Nlcz1mdW5jdGlvbigpe3ZhciBlPW5ldyBTZXQ7cmV0dXJuIHRoaXMubWFwLmZvckVhY2goZnVuY3Rpb24odCxuKXtlLmFkZChpLlB1cnBvc2VSZXN0cmljdGlvbi51bkhhc2gobikucHVycG9zZUlkKX0pLEFycmF5LmZyb20oZSl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQuaGFzaCxyPXRoaXMubWFwLmdldChuKTtyJiYoci5yZW1vdmUoZSksci5pc0VtcHR5KCkmJih0aGlzLm1hcC5kZWxldGUobiksdGhpcy5iaXRMZW5ndGg9MCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImd2bCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmd2bF99LHNldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZ3ZsX3x8KHRoaXMuZ3ZsXz1lLHRoaXMubWFwLmZvckVhY2goZnVuY3Rpb24oZSxuKXt2YXIgcj1pLlB1cnBvc2VSZXN0cmljdGlvbi51bkhhc2gobik7ZS5nZXQoKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QuaXNPa1RvSGF2ZShyLnJlc3RyaWN0aW9uVHlwZSxyLnB1cnBvc2VJZCxuKXx8ZS5yZW1vdmUobil9KX0pKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1hcC5zaXplfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm51bVJlc3RyaWN0aW9ucyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcC5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9KG4oMTUpLkNsb25lYWJsZSk7dC5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3I9Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksKHI9dC5EZXZpY2VEaXNjbG9zdXJlU3RvcmFnZUFjY2Vzc1R5cGV8fCh0LkRldmljZURpc2Nsb3N1cmVTdG9yYWdlQWNjZXNzVHlwZT17fSkpLkNPT0tJRT0iY29va2llIixyLldFQj0id2ViIixyLkFQUD0iYXBwIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big1NyksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuSURfVE9fS0VZPVtvLlNlZ21lbnQuQ09SRSxvLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRUQsby5TZWdtZW50LlZFTkRPUlNfQUxMT1dFRCxvLlNlZ21lbnQuUFVCTElTSEVSX1RDXSxlLktFWV9UT19JRD0oKHI9e30pW28uU2VnbWVudC5DT1JFXT0wLHJbby5TZWdtZW50LlZFTkRPUlNfRElTQ0xPU0VEXT0xLHJbby5TZWdtZW50LlZFTkRPUlNfQUxMT1dFRF09MixyW28uU2VnbWVudC5QVUJMSVNIRVJfVENdPTMsciksZX0oKTt0LlNlZ21lbnRJRHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybihlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkodCxuKX07cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1lKHQsbiksdC5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooci5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHIpfX0oKSxvPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGkscz17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoMSZvWzBdKXRocm93IG9bMV07cmV0dXJuIG9bMV19LHRyeXM6W10sb3BzOltdfTtyZXR1cm4gaT17bmV4dDphKDApLHRocm93OmEoMSkscmV0dXJuOmEoMil9LCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihpW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGk7ZnVuY3Rpb24gYShpKXtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpO2Zvcig7czspdHJ5e2lmKG49MSxyJiYobz0yJmlbMF0/ci5yZXR1cm46aVswXT9yLnRocm93fHwoKG89ci5yZXR1cm4pJiZvLmNhbGwociksMCk6ci5uZXh0KSYmIShvPW8uY2FsbChyLGlbMV0pKS5kb25lKXJldHVybiBvO3N3aXRjaChyPTAsbyYmKGk9WzImaVswXSxvLnZhbHVlXSksaVswXSl7Y2FzZSAwOmNhc2UgMTpvPWk7YnJlYWs7Y2FzZSA0OnJldHVybiBzLmxhYmVsKysse3ZhbHVlOmlbMV0sZG9uZTohMX07Y2FzZSA1OnMubGFiZWwrKyxyPWlbMV0saT1bMF07Y29udGludWU7Y2FzZSA3Omk9cy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoISgobz0obz1zLnRyeXMpLmxlbmd0aD4wJiZvW28ubGVuZ3RoLTFdKXx8NiE9PWlbMF0mJjIhPT1pWzBdKSl7cz0wO2NvbnRpbnVlfWlmKDM9PT1pWzBdJiYoIW98fGlbMV0+b1swXSYmaVsxXTxvWzNdKSl7cy5sYWJlbD1pWzFdO2JyZWFrfWlmKDY9PT1pWzBdJiZzLmxhYmVsPG9bMV0pe3MubGFiZWw9b1sxXSxvPWk7YnJlYWt9aWYobyYmcy5sYWJlbDxvWzJdKXtzLmxhYmVsPW9bMl0scy5vcHMucHVzaChpKTticmVha31vWzJdJiZzLm9wcy5wb3AoKSxzLnRyeXMucG9wKCk7Y29udGludWV9aT10LmNhbGwoZSxzKX1jYXRjaChlKXtpPVs2LGVdLHI9MH1maW5hbGx5e249bz0wfWlmKDUmaVswXSl0aHJvdyBpWzFdO3JldHVybnt2YWx1ZTppWzBdP2lbMV06dm9pZCAwLGRvbmU6ITB9fShbaSxhXSl9fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMTUpLHM9big1KSxhPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuYml0TGVuZ3RoPTAsdC5tYXhJZF89MCx0LnNldF89bmV3IFNldCx0fXJldHVybiByKHQsZSksdC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBvKHRoaXMsZnVuY3Rpb24odCl7c3dpdGNoKHQubGFiZWwpe2Nhc2UgMDplPTEsdC5sYWJlbD0xO2Nhc2UgMTpyZXR1cm4gZTw9dGhpcy5tYXhJZD9bNCxbZSx0aGlzLmhhcyhlKV1dOlszLDRdO2Nhc2UgMjp0LnNlbnQoKSx0LmxhYmVsPTM7Y2FzZSAzOnJldHVybiBlKyssWzMsMV07Y2FzZSA0OnJldHVyblsyXX19KX0sdC5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0Xy52YWx1ZXMoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJtYXhJZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heElkX30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0Xy5oYXMoZSl9LHQucHJvdG90eXBlLnVuc2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQudW5zZXQoZSl9KToib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy51bnNldChPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuK2V9KSk6KHRoaXMuc2V0Xy5kZWxldGUoZSksdGhpcy5iaXRMZW5ndGg9MCxlPT09dGhpcy5tYXhJZCYmKHRoaXMubWF4SWRfPTAsdGhpcy5zZXRfLmZvckVhY2goZnVuY3Rpb24oZSl7dC5tYXhJZF89TWF0aC5tYXgodC5tYXhJZCxlKX0pKSl9LHQucHJvdG90eXBlLmlzSW50TWFwPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj0ib2JqZWN0Ij09dHlwZW9mIGU7cmV0dXJuIG4mJk9iamVjdC5rZXlzKGUpLmV2ZXJ5KGZ1bmN0aW9uKG4pe3ZhciByPU51bWJlci5pc0ludGVnZXIocGFyc2VJbnQobiwxMCkpO3JldHVybihyPXImJnQuaXNWYWxpZE51bWJlcihlW25dLmlkKSkmJnZvaWQgMCE9PWVbbl0ubmFtZX0pfSx0LnByb3RvdHlwZS5pc1ZhbGlkTnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKT4wfSx0LnByb3RvdHlwZS5pc1NldD1mdW5jdGlvbihlKXt2YXIgdD0hMTtyZXR1cm4gZSBpbnN0YW5jZW9mIFNldCYmKHQ9QXJyYXkuZnJvbShlKS5ldmVyeSh0aGlzLmlzVmFsaWROdW1iZXIpKSx0fSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihBcnJheS5pc0FycmF5KGUpKWUuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXQoZSl9KTtlbHNlIGlmKHRoaXMuaXNTZXQoZSkpdGhpcy5zZXQoQXJyYXkuZnJvbShlKSk7ZWxzZSBpZih0aGlzLmlzSW50TWFwKGUpKXRoaXMuc2V0KE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4rZX0pKTtlbHNle2lmKCF0aGlzLmlzVmFsaWROdW1iZXIoZSkpdGhyb3cgbmV3IHMuVENNb2RlbEVycm9yKCJzZXQoKSIsZSwibXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGFycmF5LCBwb3NpdGl2ZSBpbnRlZ2VyLCBTZXQ8bnVtYmVyPiwgb3IgSW50TWFwIik7dGhpcy5zZXRfLmFkZChlKSx0aGlzLm1heElkXz1NYXRoLm1heCh0aGlzLm1heElkLGUpLHRoaXMuYml0TGVuZ3RoPTB9fSx0LnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3RoaXMuc2V0Xz1uZXcgU2V0fSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8PXRoaXMubWF4SWQ7dCsrKWUodGhpcy5oYXModCksdCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldF8uc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5zZXRBbGw9ZnVuY3Rpb24oZSl7dGhpcy5zZXQoZSl9LHR9KGkuQ2xvbmVhYmxlKTt0LlZlY3Rvcj1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDUzKSxvPW4oMzcpLGk9big1OCkscz1uKDY0KSxhPW4oNSksYz1uKDU1KSx1PW4oNikscD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scz10aGlzO3RyeXtuPXRoaXMuZmllbGRTZXF1ZW5jZVsiIitlLnZlcnNpb25dW3RdfWNhdGNoKG4pe3Rocm93IG5ldyBhLkVuY29kaW5nRXJyb3IoIlVuYWJsZSB0byBlbmNvZGUgdmVyc2lvbjogIitlLnZlcnNpb24rIiwgc2VnbWVudDogIit0KX12YXIgcD0iIjtyZXR1cm4gdCE9PXUuU2VnbWVudC5DT1JFJiYocD1pLkludEVuY29kZXIuZW5jb2RlKHUuU2VnbWVudElEcy5LRVlfVE9fSURbdF0sby5CaXRMZW5ndGguc2VnbWVudFR5cGUpKSxuLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9ZVtuXSx1PWkuRmllbGRFbmNvZGVyTWFwW25dLGw9by5CaXRMZW5ndGhbbl07dm9pZCAwPT09bCYmcy5pc1B1Ymxpc2hlckN1c3RvbShuKSYmKGw9K2VbYy5GaWVsZHMubnVtQ3VzdG9tUHVycG9zZXNdKTt0cnl7cCs9dS5lbmNvZGUocixsKX1jYXRjaChlKXt0aHJvdyBuZXcgYS5FbmNvZGluZ0Vycm9yKCJFcnJvciBlbmNvZGluZyAiK3QrIi0+IituKyI6ICIrZS5tZXNzYWdlKX19KSxyLkJhc2U2NFVybC5lbmNvZGUocCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzLHA9ci5CYXNlNjRVcmwuZGVjb2RlKGUpLGw9MDtyZXR1cm4gbj09PXUuU2VnbWVudC5DT1JFJiYodC52ZXJzaW9uPWkuSW50RW5jb2Rlci5kZWNvZGUocC5zdWJzdHIobCxvLkJpdExlbmd0aFtjLkZpZWxkcy52ZXJzaW9uXSksby5CaXRMZW5ndGhbYy5GaWVsZHMudmVyc2lvbl0pKSxuIT09dS5TZWdtZW50LkNPUkUmJihsKz1vLkJpdExlbmd0aC5zZWdtZW50VHlwZSksdGhpcy5maWVsZFNlcXVlbmNlWyIiK3QudmVyc2lvbl1bbl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1pLkZpZWxkRW5jb2Rlck1hcFtlXSxyPW8uQml0TGVuZ3RoW2VdO2lmKHZvaWQgMD09PXImJnMuaXNQdWJsaXNoZXJDdXN0b20oZSkmJihyPSt0W2MuRmllbGRzLm51bUN1c3RvbVB1cnBvc2VzXSksMCE9PXIpe3ZhciB1PXAuc3Vic3RyKGwscik7aWYobj09PWkuVmVuZG9yVmVjdG9yRW5jb2Rlcj90W2VdPW4uZGVjb2RlKHUsdC52ZXJzaW9uKTp0W2VdPW4uZGVjb2RlKHUsciksTnVtYmVyLmlzSW50ZWdlcihyKSlsKz1yO2Vsc2V7aWYoIU51bWJlci5pc0ludGVnZXIodFtlXS5iaXRMZW5ndGgpKXRocm93IG5ldyBhLkRlY29kaW5nRXJyb3IoZSk7bCs9dFtlXS5iaXRMZW5ndGh9fX0pLHR9LGUuaXNQdWJsaXNoZXJDdXN0b209ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lLmluZGV4T2YoInB1Ymxpc2hlckN1c3RvbSIpfSxlLmZpZWxkU2VxdWVuY2U9bmV3IHMuRmllbGRTZXF1ZW5jZSxlfSgpO3QuU2VnbWVudEVuY29kZXI9cH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9big2KSxvPW4oMjMpLGk9big1OSkscz1uKDM5KSxhPW4oMTYpLGM9big2MCksdT1uKDYxKSxwPW4oNjIpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXZhciB0LG4sbCxkLGYsaCx2LHksZyxtLGIsQyxfLEUsUyxJLEwsUCx3LEEsayxPLFQsVix4LFI7cmV0dXJuIHQ9ci5GaWVsZHMudmVyc2lvbixuPXIuRmllbGRzLmNyZWF0ZWQsbD1yLkZpZWxkcy5sYXN0VXBkYXRlZCxkPXIuRmllbGRzLmNtcElkLGY9ci5GaWVsZHMuY21wVmVyc2lvbixoPXIuRmllbGRzLmNvbnNlbnRTY3JlZW4sdj1yLkZpZWxkcy5jb25zZW50TGFuZ3VhZ2UseT1yLkZpZWxkcy52ZW5kb3JMaXN0VmVyc2lvbixnPXIuRmllbGRzLnBvbGljeVZlcnNpb24sbT1yLkZpZWxkcy5pc1NlcnZpY2VTcGVjaWZpYyxiPXIuRmllbGRzLnVzZU5vblN0YW5kYXJkU3RhY2tzLEM9ci5GaWVsZHMuc3BlY2lhbEZlYXR1cmVPcHRpbnMsXz1yLkZpZWxkcy5wdXJwb3NlQ29uc2VudHMsRT1yLkZpZWxkcy5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cyxTPXIuRmllbGRzLnB1cnBvc2VPbmVUcmVhdG1lbnQsST1yLkZpZWxkcy5wdWJsaXNoZXJDb3VudHJ5Q29kZSxMPXIuRmllbGRzLnZlbmRvckNvbnNlbnRzLFA9ci5GaWVsZHMudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyx3PXIuRmllbGRzLnB1Ymxpc2hlclJlc3RyaWN0aW9ucyxBPXIuRmllbGRzLnZlbmRvcnNEaXNjbG9zZWQsaz1yLkZpZWxkcy52ZW5kb3JzQWxsb3dlZCxPPXIuRmllbGRzLnB1Ymxpc2hlckNvbnNlbnRzLFQ9ci5GaWVsZHMucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cyxWPXIuRmllbGRzLm51bUN1c3RvbVB1cnBvc2VzLHg9ci5GaWVsZHMucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMsUj1yLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzLGVbdF09YS5JbnRFbmNvZGVyLGVbbl09aS5EYXRlRW5jb2RlcixlW2xdPWkuRGF0ZUVuY29kZXIsZVtkXT1hLkludEVuY29kZXIsZVtmXT1hLkludEVuY29kZXIsZVtoXT1hLkludEVuY29kZXIsZVt2XT1jLkxhbmdFbmNvZGVyLGVbeV09YS5JbnRFbmNvZGVyLGVbZ109YS5JbnRFbmNvZGVyLGVbbV09by5Cb29sZWFuRW5jb2RlcixlW2JdPW8uQm9vbGVhbkVuY29kZXIsZVtDXT1zLkZpeGVkVmVjdG9yRW5jb2RlcixlW19dPXMuRml4ZWRWZWN0b3JFbmNvZGVyLGVbRV09cy5GaXhlZFZlY3RvckVuY29kZXIsZVtTXT1vLkJvb2xlYW5FbmNvZGVyLGVbSV09Yy5MYW5nRW5jb2RlcixlW0xdPXAuVmVuZG9yVmVjdG9yRW5jb2RlcixlW1BdPXAuVmVuZG9yVmVjdG9yRW5jb2RlcixlW3ddPXUuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yRW5jb2RlcixlLnNlZ21lbnRUeXBlPWEuSW50RW5jb2RlcixlW0FdPXAuVmVuZG9yVmVjdG9yRW5jb2RlcixlW2tdPXAuVmVuZG9yVmVjdG9yRW5jb2RlcixlW09dPXMuRml4ZWRWZWN0b3JFbmNvZGVyLGVbVF09cy5GaXhlZFZlY3RvckVuY29kZXIsZVtWXT1hLkludEVuY29kZXIsZVt4XT1zLkZpeGVkVmVjdG9yRW5jb2RlcixlW1JdPXMuRml4ZWRWZWN0b3JFbmNvZGVyLGV9KCk7dC5GaWVsZEVuY29kZXJNYXA9bH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9big2KTt0LkZpZWxkU2VxdWVuY2U9ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXNbMV09KChlPXt9KVtyLlNlZ21lbnQuQ09SRV09W3IuRmllbGRzLnZlcnNpb24sci5GaWVsZHMuY3JlYXRlZCxyLkZpZWxkcy5sYXN0VXBkYXRlZCxyLkZpZWxkcy5jbXBJZCxyLkZpZWxkcy5jbXBWZXJzaW9uLHIuRmllbGRzLmNvbnNlbnRTY3JlZW4sci5GaWVsZHMuY29uc2VudExhbmd1YWdlLHIuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLHIuRmllbGRzLnB1cnBvc2VDb25zZW50cyxyLkZpZWxkcy52ZW5kb3JDb25zZW50c10sZSksdGhpc1syXT0oKHQ9e30pW3IuU2VnbWVudC5DT1JFXT1bci5GaWVsZHMudmVyc2lvbixyLkZpZWxkcy5jcmVhdGVkLHIuRmllbGRzLmxhc3RVcGRhdGVkLHIuRmllbGRzLmNtcElkLHIuRmllbGRzLmNtcFZlcnNpb24sci5GaWVsZHMuY29uc2VudFNjcmVlbixyLkZpZWxkcy5jb25zZW50TGFuZ3VhZ2Usci5GaWVsZHMudmVuZG9yTGlzdFZlcnNpb24sci5GaWVsZHMucG9saWN5VmVyc2lvbixyLkZpZWxkcy5pc1NlcnZpY2VTcGVjaWZpYyxyLkZpZWxkcy51c2VOb25TdGFuZGFyZFN0YWNrcyxyLkZpZWxkcy5zcGVjaWFsRmVhdHVyZU9wdGlucyxyLkZpZWxkcy5wdXJwb3NlQ29uc2VudHMsci5GaWVsZHMucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMsci5GaWVsZHMucHVycG9zZU9uZVRyZWF0bWVudCxyLkZpZWxkcy5wdWJsaXNoZXJDb3VudHJ5Q29kZSxyLkZpZWxkcy52ZW5kb3JDb25zZW50cyxyLkZpZWxkcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLHIuRmllbGRzLnB1Ymxpc2hlclJlc3RyaWN0aW9uc10sdFtyLlNlZ21lbnQuUFVCTElTSEVSX1RDXT1bci5GaWVsZHMucHVibGlzaGVyQ29uc2VudHMsci5GaWVsZHMucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cyxyLkZpZWxkcy5udW1DdXN0b21QdXJwb3NlcyxyLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21Db25zZW50cyxyLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzXSx0W3IuU2VnbWVudC5WRU5ET1JTX0FMTE9XRURdPVtyLkZpZWxkcy52ZW5kb3JzQWxsb3dlZF0sdFtyLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRURdPVtyLkZpZWxkcy52ZW5kb3JzRGlzY2xvc2VkXSx0KX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oNik7dC5TZWdtZW50U2VxdWVuY2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzWzFdPVtyLlNlZ21lbnQuQ09SRV0sdGhpc1syXT1bci5TZWdtZW50LkNPUkVdLDI9PT1lLnZlcnNpb24paWYoZS5pc1NlcnZpY2VTcGVjaWZpYyl0aGlzWzJdLnB1c2goci5TZWdtZW50LlBVQkxJU0hFUl9UQyk7ZWxzZXt2YXIgbj0hKCF0fHwhdC5pc0ZvclZlbmRvcnMpO24mJiEwIT09ZVtyLkZpZWxkcy5zdXBwb3J0T09CXXx8dGhpc1syXS5wdXNoKHIuU2VnbWVudC5WRU5ET1JTX0RJU0NMT1NFRCksbiYmKGVbci5GaWVsZHMuc3VwcG9ydE9PQl0mJmVbci5GaWVsZHMudmVuZG9yc0FsbG93ZWRdLnNpemU+MCYmdGhpc1syXS5wdXNoKHIuU2VnbWVudC5WRU5ET1JTX0FMTE9XRUQpLHRoaXNbMl0ucHVzaChyLlNlZ21lbnQuUFVCTElTSEVSX1RDKSl9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9big1KSxvPW4oNiksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvY2Vzcz1mdW5jdGlvbihlLHQpe3ZhciBuLG8saT1lLmd2bDtpZighaSl0aHJvdyBuZXcgci5FbmNvZGluZ0Vycm9yKCJVbmFibGUgdG8gZW5jb2RlIFRDTW9kZWwgd2l0aG91dCBhIEdWTCIpO2lmKCFpLmlzUmVhZHkpdGhyb3cgbmV3IHIuRW5jb2RpbmdFcnJvcigiVW5hYmxlIHRvIGVuY29kZSBUQ01vZGVsIHRjTW9kZWwuZ3ZsLnJlYWR5UHJvbWlzZSBpcyBub3QgcmVzb2x2ZWQiKTsoZT1lLmNsb25lKCkpLmNvbnNlbnRMYW5ndWFnZT1pLmxhbmd1YWdlLnRvVXBwZXJDYXNlKCksKG51bGw9PT0obj10KXx8dm9pZCAwPT09bj92b2lkIDA6bi52ZXJzaW9uKT4wJiYobnVsbD09PShvPXQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnZlcnNpb24pPD10aGlzLnByb2Nlc3Nvci5sZW5ndGg/ZS52ZXJzaW9uPXQudmVyc2lvbjplLnZlcnNpb249dGhpcy5wcm9jZXNzb3IubGVuZ3RoO3ZhciBzPWUudmVyc2lvbi0xO2lmKCF0aGlzLnByb2Nlc3NvcltzXSl0aHJvdyBuZXcgci5FbmNvZGluZ0Vycm9yKCJJbnZhbGlkIHZlcnNpb246ICIrZS52ZXJzaW9uKTtyZXR1cm4gdGhpcy5wcm9jZXNzb3Jbc10oZSxpKX0sZS5wcm9jZXNzb3I9W2Z1bmN0aW9uKGUpe3JldHVybiBlfSxmdW5jdGlvbihlLHQpe2UucHVibGlzaGVyUmVzdHJpY3Rpb25zLmd2bD10LGUucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMudW5zZXQoMSk7dmFyIG49bmV3IE1hcDtyZXR1cm4gbi5zZXQoImxlZ0ludFB1cnBvc2VzIixlLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMpLG4uc2V0KCJwdXJwb3NlcyIsZS52ZW5kb3JDb25zZW50cyksbi5mb3JFYWNoKGZ1bmN0aW9uKG4scil7bi5mb3JFYWNoKGZ1bmN0aW9uKGkscyl7aWYoaSl7dmFyIGE9dC52ZW5kb3JzW3NdO2lmKCFhfHxhLmRlbGV0ZWREYXRlKW4udW5zZXQocyk7ZWxzZSBpZigwPT09YVtyXS5sZW5ndGgpaWYoZS5pc1NlcnZpY2VTcGVjaWZpYylpZigwPT09YS5mbGV4aWJsZVB1cnBvc2VzLmxlbmd0aCluLnVuc2V0KHMpO2Vsc2V7Zm9yKHZhciBjPWUucHVibGlzaGVyUmVzdHJpY3Rpb25zLmdldFJlc3RyaWN0aW9ucyhzKSx1PSExLHA9MCxsPWMubGVuZ3RoO3A8bCYmIXU7cCsrKXU9Y1twXS5yZXN0cmljdGlvblR5cGU9PT1vLlJlc3RyaWN0aW9uVHlwZS5SRVFVSVJFX0NPTlNFTlQmJiJwdXJwb3NlcyI9PT1yfHxjW3BdLnJlc3RyaWN0aW9uVHlwZT09PW8uUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfTEkmJiJsZWdJbnRQdXJwb3NlcyI9PT1yO3V8fG4udW5zZXQocyl9ZWxzZSBuLnVuc2V0KHMpfX0pfSksZS52ZW5kb3JzRGlzY2xvc2VkLnNldCh0LnZlbmRvcnMpLGV9XSxlfSgpO3QuU2VtYW50aWNQcmVFbmNvZGVyPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4oZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX0pKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9ZSh0LG4pLHQucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMTMpLGk9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHIodCxlKSx0LnByb3RvdHlwZS5yZXNwb25kPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lcklkPW8uQ21wQXBpTW9kZWwuZXZlbnRRdWV1ZS5hZGQoe2NhbGxiYWNrOnRoaXMuY2FsbGJhY2sscGFyYW06dGhpcy5wYXJhbSxuZXh0OnRoaXMubmV4dH0pLGUucHJvdG90eXBlLnJlc3BvbmQuY2FsbCh0aGlzKX0sdH0obigzMCkuR2V0VENEYXRhQ29tbWFuZCk7dC5BZGRFdmVudExpc3RlbmVyQ29tbWFuZD1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuKGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KSh0LG4pfTtyZXR1cm4gZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWUodCxuKSx0LnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcil9fSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEzKSxpPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKHQsZSksdC5wcm90b3R5cGUucmVzcG9uZD1mdW5jdGlvbigpe3RoaXMuaW52b2tlQ2FsbGJhY2soby5DbXBBcGlNb2RlbC5ldmVudFF1ZXVlLnJlbW92ZSh0aGlzLnBhcmFtKSl9LHR9KG4oMzEpLkNvbW1hbmQpO3QuUmVtb3ZlRXZlbnRMaXN0ZW5lckNvbW1hbmQ9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPStlKSx0aGlzLnNldF8uaGFzKGUpfSxlLnNldF89bmV3IFNldChbMCwyLHZvaWQgMCxudWxsXSksZX0oKTt0LlN1cHBvcnRlZFZlcnNpb25zPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3KSxvPW4oNzEpLGk9bigxMjkpLHM9big3Nyk7ZnVuY3Rpb24gYShlKXt2YXIgdD1uZXcgaShlKSxuPW8oaS5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gci5leHRlbmQobixpLnByb3RvdHlwZSx0KSxyLmV4dGVuZChuLHQpLG59dmFyIGM9YShuKDc0KSk7Yy5BeGlvcz1pLGMuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhKHMoYy5kZWZhdWx0cyxlKSl9LGMuQ2FuY2VsPW4oNzgpLGMuQ2FuY2VsVG9rZW49bigxNDMpLGMuaXNDYW5jZWw9big3MyksYy5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxjLnNwcmVhZD1uKDE0NCksZS5leHBvcnRzPWMsZS5leHBvcnRzLmRlZmF1bHQ9Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDcpLG89big3MiksaT1uKDEzMCkscz1uKDEzMSksYT1uKDc3KTtmdW5jdGlvbiBjKGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgaSxyZXNwb25zZTpuZXcgaX19Yy5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlKXsic3RyaW5nIj09PXR5cGVvZiBlPyhlPWFyZ3VtZW50c1sxXXx8e30pLnVybD1hcmd1bWVudHNbMF06ZT1lfHx7fSwoZT1hKHRoaXMuZGVmYXVsdHMsZSkpLm1ldGhvZD9lLm1ldGhvZD1lLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP2UubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6ZS5tZXRob2Q9ImdldCI7dmFyIHQ9W3Msdm9pZCAwXSxuPVByb21pc2UucmVzb2x2ZShlKTtmb3IodGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QudW5zaGlmdChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pLHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSk7dC5sZW5ndGg7KW49bi50aGVuKHQuc2hpZnQoKSx0LnNoaWZ0KCkpO3JldHVybiBufSxjLnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9YSh0aGlzLmRlZmF1bHRzLGUpLG8oZS51cmwsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCIiKX0sci5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtjLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3Qoci5tZXJnZShufHx7fSx7bWV0aG9kOmUsdXJsOnR9KSl9fSksci5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7Yy5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLG8pe3JldHVybiB0aGlzLnJlcXVlc3Qoci5tZXJnZShvfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pLGUuZXhwb3J0cz1jfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyk7ZnVuY3Rpb24gbygpe3RoaXMuaGFuZGxlcnM9W119by5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LG8ucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxvLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGUpe3IuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSl9LGUuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyksbz1uKDEzMiksaT1uKDczKSxzPW4oNzQpO2Z1bmN0aW9uIGEoZSl7ZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCl9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1vKGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ci5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLHIuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSksKGUuYWRhcHRlcnx8cy5hZGFwdGVyKShlKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBhKGUpLHQuZGF0YT1vKHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0sZnVuY3Rpb24odCl7cmV0dXJuIGkodCl8fChhKGUpLHQmJnQucmVzcG9uc2UmJih0LnJlc3BvbnNlLmRhdGE9byh0LnJlc3BvbnNlLmRhdGEsdC5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QodCl9KX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmZvckVhY2gobixmdW5jdGlvbihuKXtlPW4oZSx0KX0pLGV9fSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsbz1lLmV4cG9ydHM9e307ZnVuY3Rpb24gaSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGEoZSl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigobj09PWl8fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIG4oZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIG4uY2FsbCh0aGlzLGUsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bj0iZnVuY3Rpb24iPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDppfWNhdGNoKGUpe249aX10cnl7cj0iZnVuY3Rpb24iPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6c31jYXRjaChlKXtyPXN9fSgpO3ZhciBjLHU9W10scD0hMSxsPS0xO2Z1bmN0aW9uIGQoKXtwJiZjJiYocD0hMSxjLmxlbmd0aD91PWMuY29uY2F0KHUpOmw9LTEsdS5sZW5ndGgmJmYoKSl9ZnVuY3Rpb24gZigpe2lmKCFwKXt2YXIgZT1hKGQpO3A9ITA7Zm9yKHZhciB0PXUubGVuZ3RoO3Q7KXtmb3IoYz11LHU9W107KytsPHQ7KWMmJmNbbF0ucnVuKCk7bD0tMSx0PXUubGVuZ3RofWM9bnVsbCxwPSExLGZ1bmN0aW9uKGUpe2lmKHI9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigocj09PXN8fCFyKSYmY2xlYXJUaW1lb3V0KXJldHVybiByPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e3IoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gci5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGgoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiB2KCl7fW8ubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTt1LnB1c2gobmV3IGgoZSx0KSksMSE9PXUubGVuZ3RofHxwfHxhKGYpfSxoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxvLnRpdGxlPSJicm93c2VyIixvLmJyb3dzZXI9ITAsby5lbnY9e30sby5hcmd2PVtdLG8udmVyc2lvbj0iIixvLnZlcnNpb25zPXt9LG8ub249dixvLmFkZExpc3RlbmVyPXYsby5vbmNlPXYsby5vZmY9dixvLnJlbW92ZUxpc3RlbmVyPXYsby5yZW1vdmVBbGxMaXN0ZW5lcnM9dixvLmVtaXQ9dixvLnByZXBlbmRMaXN0ZW5lcj12LG8ucHJlcGVuZE9uY2VMaXN0ZW5lcj12LG8ubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxvLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxvLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0sby5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxvLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ci5mb3JFYWNoKGUsZnVuY3Rpb24obixyKXtyIT09dCYmci50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1uLGRlbGV0ZSBlW3JdKX0pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFvfHxvKG4uc3RhdHVzKT9lKG4pOnQocigiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIGUuY29uZmlnPXQsbiYmKGUuY29kZT1uKSxlLnJlcXVlc3Q9cixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGV9fSxlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEzOCksbz1uKDEzOSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFyKHQpP28oZSx0KTp0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGRcK1wtXC5dKjopP1wvXC8vaS50ZXN0KGUpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3KSxvPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il07ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saSxzPXt9O3JldHVybiBlPyhyLmZvckVhY2goZS5zcGxpdCgiXG4iKSxmdW5jdGlvbihlKXtpZihpPWUuaW5kZXhPZigiOiIpLHQ9ci50cmltKGUuc3Vic3RyKDAsaSkpLnRvTG93ZXJDYXNlKCksbj1yLnRyaW0oZS5zdWJzdHIoaSsxKSksdCl7aWYoc1t0XSYmby5pbmRleE9mKHQpPj0wKXJldHVybjtzW3RdPSJzZXQtY29va2llIj09PXQ/KHNbdF0/c1t0XTpbXSkuY29uY2F0KFtuXSk6c1t0XT9zW3RdKyIsICIrbjpufX0pLHMpOnN9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyk7ZS5leHBvcnRzPXIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBvKGUpe3ZhciByPWU7cmV0dXJuIHQmJihuLnNldEF0dHJpYnV0ZSgiaHJlZiIscikscj1uLmhyZWYpLG4uc2V0QXR0cmlidXRlKCJocmVmIixyKSx7aHJlZjpuLmhyZWYscHJvdG9jb2w6bi5wcm90b2NvbD9uLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpuLmhvc3Qsc2VhcmNoOm4uc2VhcmNoP24uc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6bi5oYXNoP24uaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOm4uaG9zdG5hbWUscG9ydDpuLnBvcnQscGF0aG5hbWU6Ii8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCk/bi5wYXRobmFtZToiLyIrbi5wYXRobmFtZX19cmV0dXJuIGU9byh3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIG49ci5pc1N0cmluZyh0KT9vKHQpOnQ7cmV0dXJuIG4ucHJvdG9jb2w9PT1lLnByb3RvY29sJiZuLmhvc3Q9PT1lLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNyk7ZS5leHBvcnRzPXIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LG4sbyxpLHMpe3ZhciBhPVtdO2EucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLHIuaXNOdW1iZXIobikmJmEucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKG4pLnRvR01UU3RyaW5nKCkpLHIuaXNTdHJpbmcobykmJmEucHVzaCgicGF0aD0iK28pLHIuaXNTdHJpbmcoaSkmJmEucHVzaCgiZG9tYWluPSIraSksITA9PT1zJiZhLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1hLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc4KTtmdW5jdGlvbiBvKGUpe2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3Q9ZX0pO3ZhciBuPXRoaXM7ZShmdW5jdGlvbihlKXtuLnJlYXNvbnx8KG4ucmVhc29uPW5ldyByKGUpLHQobi5yZWFzb24pKX0pfW8ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sby5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm57dG9rZW46bmV3IG8oZnVuY3Rpb24odCl7ZT10fSksY2FuY2VsOmV9fSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fX0sLCwsLCwsLCwsLCwsLCwsLCwsLCwsZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gaShlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9O3QlMj9vKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbih0KXtyKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm8oT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfW4ucih0KSxuLmQodCwicWNDbXBBcGkiLGZ1bmN0aW9uKCl7cmV0dXJuIEV0fSksbi5kKHQsInVzcEFwaSIsZnVuY3Rpb24oKXtyZXR1cm4gU3R9KTt2YXIgcz1uKDApLGE9bi5uKHMpO2Z1bmN0aW9uIGMoZSx0LG4scixvLGkscyl7dHJ5e3ZhciBhPWVbaV0ocyksYz1hLnZhbHVlfWNhdGNoKHUpe3JldHVybiB2b2lkIG4odSl9YS5kb25lP3QoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4ocixvKX1mdW5jdGlvbiB1KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbyl7dmFyIGk9ZS5hcHBseSh0LG4pO2Z1bmN0aW9uIHMoZSl7YyhpLHIsbyxzLGEsIm5leHQiLGUpfWZ1bmN0aW9uIGEoZSl7YyhpLHIsbyxzLGEsInRocm93IixlKX1zKHZvaWQgMCl9KX19ZnVuY3Rpb24gcChlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGwoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1mdW5jdGlvbiBkKGUsdCxuKXtyZXR1cm4gdCYmbChlLnByb3RvdHlwZSx0KSxuJiZsKGUsbiksZX12YXIgZixoLHYseSxnPW4oODYpO24oNjYpLG4oNjcpLG4oNjgpOyFmdW5jdGlvbihlKXtlW2UuVE9QX0xFRlQ9MV09IlRPUF9MRUZUIixlW2UuVE9QX1JJR0hUPTJdPSJUT1BfUklHSFQiLGVbZS5CT1RUT01fUklHSFQ9M109IkJPVFRPTV9SSUdIVCIsZVtlLkJPVFRPTV9MRUZUPTRdPSJCT1RUT01fTEVGVCJ9KGZ8fChmPXt9KSksZnVuY3Rpb24oZSl7ZS5ZRVM9IlkiLGUuTk9UPSJOIn0oaHx8KGg9e30pKSxmdW5jdGlvbihlKXtlLlNFUlZJQ0U9InNlcnZpY2UiLGUuU0VSVklDRV9HUk9VUD0ic2VydmljZSBncm91cCJ9KHZ8fCh2PXt9KSksZnVuY3Rpb24oZSl7ZS5HRFBSPSJHRFBSIixlLlVTUD0iVVNQIn0oeXx8KHk9e30pKTt2YXIgbT17aGFzQ29va2llOiExfSxiPWZ1bmN0aW9uIGUoKXtwKHRoaXMsZSksdGhpcy52ZW5kb3JDb25zZW50cz1pKHt9LG0pLHRoaXMucHVycG9zZXNDb25zZW50cz1pKHt9LG0pLHRoaXMuc3BlY2lhbEZlYXR1cmVzPWkoe30sbSksdGhpcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3Q9aSh7fSxtKSx0aGlzLmxlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzPWkoe30sbSksdGhpcy5ub25JYWJDb25zZW50cz1pKHt9LG0pLHRoaXMuZ29vZ2xlQ29uc2VudHM9aSh7fSxtKSx0aGlzLmNvbnNlbnRTY3JlZW49MCx0aGlzLmFsbENvbnNlbnRzPSExfSxDPShuKDY5KSx7dXNwVmVyc2lvbjoxLHVzcEp1cmlzZGljdGlvbjpbXSx1c3BMc3BhY3Q6aC5OT1QsdXNwUHJpdmFjeVBvbGljeUxpbms6IiIsdXNwRGVsZXRlRGF0YUxpbms6IiIsdXNwQWNjZXNzRGF0YUxpbms6IiIsY29va2llRG9tYWluOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxzdXBwcmVzc0NjcGFMaW5rczohMH0pLF89e2RlZmF1bHRUb2dnbGVWYWx1ZToib2ZmIixkaXNwbGF5VWk6ImFsd2F5cyIsZGlzcGxheVBlcnNpc3RlbnRDb25zZW50TGluazohMCxoYXNoQ29kZToiIixncm91cFNpdGVzVXJsOiIiLGluaXRTY3JlZW5SZWplY3RCdXR0b25TaG93aW5nOiEwLGluaXRTY3JlZW5Cb2R5VGV4dE9wdGlvbjoxLGxhbmdfOiJlbiIsbm9uY29uc2VudERpc3BsYXlGcmVxdWVuY3k6MSxwZXJzaXN0ZW50Q29uc2VudExpbmtMb2NhdGlvbjpmLkJPVFRPTV9SSUdIVCxwdWJsaXNoZXJMb2dvOiIiLHB1Ymxpc2hlck5hbWU6IiIsc3RhY2tzOltdLHB1Ymxpc2hlckZlYXR1cmVzSWRzOltdLHB1Ymxpc2hlclNwZWNpYWxGZWF0dXJlc0lkczpbXSxwdWJsaXNoZXJTcGVjaWFsUHVycG9zZXNJZHM6W10scHVibGlzaGVyUHVycG9zZUlkczpbXSxwdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzOltdLHB1Ymxpc2hlclZlbmRvckxpc3RVcmw6IiIscHVibGlzaGVyQ291bnRyeUNvZGU6IkdCIix2ZW5kb3JQdXJwb3NlSWRzOlsxLDIsMyw0LDUsNiw3LDgsOSwxMF0sdmVuZG9yUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkczpbMiwzLDQsNSw2LDcsOCw5LDEwXSx2ZW5kb3JTcGVjaWFsRmVhdHVyZXNJZHM6WzEsMl0sdmVuZG9yU3BlY2lhbFB1cnBvc2VzSWRzOlsxLDJdLHZlbmRvckZlYXR1cmVzSWRzOlsxLDIsM10scmVqZWN0Q29uc2VudFJlZGlyZWN0VXJsOiIiLHNvZnRPcHRJbkVuYWJsZWQ6ITEsdWlMYXlvdXQ6InBvcHVwIix2ZW5kb3JMaXN0VXBkYXRlRnJlcTozMCxjb25zZW50U2NvcGVHcm91cFVSTDoiIixjb29raWVEb21haW46d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLGNvb2tpZVBhdGg6Ii8iLHRoaXJkUGFydHlTdG9yYWdlVHlwZToiaWZyYW1lIixzaG93U3VtbWFyeVZpZXc6ITAsZ29vZ2xlRW5hYmxlZDohMSxjb25zZW50T25TYWZhcmk6ITEsaXNBTVA6ITEscHVibGlzaGVyQ29uc2VudFJlc3RyaWN0aW9uSWRzOltdLHB1Ymxpc2hlckxJUmVzdHJpY3Rpb25JZHM6W119LEU9e2luaXRTY3JlZW5DdXN0b21MaW5rczpbXSxsaW5rc1RpdGxlOiJBZGRpdGlvbmFsIExpbmtzIixub25JYWJWZW5kb3JzTGFiZWw6Ik5vbi1JQUIgVmVuZG9ycyJ9LFM9e3VzcERuc1RpdGxlOiJEbyBOb3QgU2VsbCBNeSBQZXJzb25hbCBJbmZvcm1hdGlvbiIsdXNwRG5zVGV4dDpbJzxwPldoZW4geW91IHZpc2l0IHRoaXMgd2Vic2l0ZSwgd2UgY29sbGVjdCBwZXJzb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIElQIGFkZHJlc3NlcywgY29va2llIGlkZW50aWZpZXJzIGFuZCBvdGhlciBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcnMuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHVzZWQgdG8gcGVyc29uYWxpemUgY29udGVudCBiYXNlZCBvbiB5b3VyIGludGVyZXN0cywgcnVuIGFuZCBvcHRpbWl6ZSBhZHZlcnRpc2luZyBjYW1wYWlnbnMgdGFpbG9yZWQgdG8geW91LCBtZWFzdXJlIHRoZSBwZXJmb3JtYW5jZSBvZiBhZHMgYW5kIGNvbnRlbnQsIGFuZCBkZXJpdmUgaW5zaWdodHMgYWJvdXQgdGhlIGF1ZGllbmNlcyB3aG8gZW5nYWdlIHdpdGggYWRzIGFuZCBjb250ZW50LiBUaGlzIGluZm9ybWF0aW9uIG1heSBhbHNvIGJlIGRpc2Nsb3NlZCBieSB1cyB0byB0aGlyZCBwYXJ0aWVzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy5pYWJwcml2YWN5LmNvbS9vcHRvdXQuaHRtbCI+SUFC4oCZcyBMaXN0IG9mIERvd25zdHJlYW0gUGFydGljaXBhbnRzPC9hPiB0aGF0IG1heSBmdXJ0aGVyIGRpc2Nsb3NlIGl0IHRvIG90aGVyIHRoaXJkIHBhcnRpZXMuIFVzaW5nIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFzIGRlc2NyaWJlZCBhYm92ZSBpcyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGhvdyB3ZSBvcGVyYXRlIG91ciB3ZWJzaXRlLCBtYWtlIHJldmVudWUgdG8gc3VwcG9ydCBvdXIgc3RhZmYsIGFuZCBnZW5lcmF0ZSByZWxldmFudCBjb250ZW50IGZvciBvdXIgYXVkaWVuY2UuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBvdXIgZGF0YSBjb2xsZWN0aW9uIGFuZCB1c2UgcHJhY3RpY2VzIGluIG91ciBQcml2YWN5IFBvbGljeS48L3A+JywnPHA+SWYgeW91IHdpc2ggdG8gb3B0IG91dCBvZiB0aGUgZGlzY2xvc3VyZSBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIHRoaXJkIHBhcnRpZXMgYnkgdXMsIHBsZWFzZSB1c2UgdGhlIGJlbG93IG9wdCBvdXQgYW5kIGNvbmZpcm0geW91ciBzZWxlY3Rpb24uIFBsZWFzZSBub3RlIHRoYXQgYWZ0ZXIgeW91ciBvcHQgb3V0IHJlcXVlc3QgaXMgcHJvY2Vzc2VkLCB5b3UgbWF5IGNvbnRpbnVlIHNlZWluZyBpbnRlcmVzdC1iYXNlZCBhZHMgYmFzZWQgb24gcGVyc29uYWwgSW5mb3JtYXRpb24gdXRpbGl6ZWQgYnkgdXMgb3IgcGVyc29uYWwgaW5mb3JtYXRpb24gZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgcHJpb3IgdG8geW91ciBvcHQgb3V0LiBZb3UgbWF5IHNlcGFyYXRlbHkgb3B0IG91dCBvZiB0aGUgZnVydGhlciBkaXNjbG9zdXJlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gYnkgdGhpcmQgcGFydGllcyBvbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuaWFicHJpdmFjeS5jb20vb3B0b3V0Lmh0bWwiPklBQuKAmXMgTGlzdCBvZiBEb3duc3RyZWFtIFBhcnRpY2lwYW50czwvYT4uPC9wPiddLHVzcERvTm90U2VsbFRvZ2dsZVRleHQ6J0kgd2FudCB0byBtYWtlIGEgIkRvIE5vdCBTZWxsIE15IFBlcnNvbmFsIEluZm9ybWF0aW9uIiByZXF1ZXN0LiBOb3RlOiB0aGlzIGFjdGlvbiB3aWxsIG1ha2UgaXQgaGFyZGVyIHRvIHVzIHRvIHRhaWxvciBjb250ZW50IGZvciB5b3UuJyx1c3BQcml2YWN5UG9saWN5TGlua1RleHQ6IlByaXZhY3kgUG9saWN5Iix1c3BEZWxldGVEYXRhTGlua1RleHQ6IkRhdGEgRGVsZXRpb24iLHVzcEFjY2Vzc0RhdGFMaW5rVGV4dDoiRGF0YSBBY2Nlc3MiLHVzcEFjY2VwdEJ1dHRvbjoiQ09ORklSTSJ9LEk9e2luaXRTY3JlZW5UaXRsZToiV2UgdmFsdWUgeW91ciBwcml2YWN5IixhZ3JlZUJ1dHRvbjoiQUdSRUUiLGluaXRTY3JlZW5SZWplY3RCdXR0b246IkRJU0FHUkVFIixpbml0U2NyZWVuU2V0dGluZ3NCdXR0b246Ik1PUkUgT1BUSU9OUyIsc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdFNlcnZpY2U6WyJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLiIsIiBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJz4oCZIHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LlxuIl0sc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdEdyb3VwOlsiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4iLCIgV2l0aCB5b3VyIHBlcm1pc3Npb24gd2UgYW5kIG91ciBwYXJ0bmVycyBtYXkgdXNlIHByZWNpc2UgZ2VvbG9jYXRpb24gZGF0YSBhbmQgaWRlbnRpZmljYXRpb24gdGhyb3VnaCBkZXZpY2Ugc2Nhbm5pbmcuIFlvdSBtYXkgY2xpY2sgdG8gY29uc2VudCB0byBvdXIgYW5kIG91ciBwYXJ0bmVyc+KAmSBwcm9jZXNzaW5nIGFzIGRlc2NyaWJlZCBhYm92ZS4gQWx0ZXJuYXRpdmVseSB5b3UgbWF5IGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZyBvciB0byByZWZ1c2UgY29uc2VudGluZy4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkYXRhIG1heSBub3QgcmVxdWlyZSB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSBhIHJpZ2h0IHRvIG9iamVjdCB0byBzdWNoIHByb2Nlc3NpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSB0byBhIGdyb3VwIG9mIHdlYnNpdGVzIFtoeXBlcmxpbmtlZCB0byBkb21haW4gd2hlcmUgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgZm9yIHRoaXMgZ3JvdXAgY29uZmlndXJhdGlvbl0uWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4iXSxzdW1tYXJ5U2NyZWVuQm9keVJlamVjdFNlcnZpY2U6WyJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLiIsIiBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJz4oCZIHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LiJdLHN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0R3JvdXA6WyJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLiIsIiBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJz4oCZIHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIGEgZ3JvdXAgb2Ygd2Vic2l0ZXMgW2xpbmtzIHRvIGRvbWFpbiB3aGVyZSBhbGwgdGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBmb3IgdGhpcyBncm91cCBjb25maWd1cmF0aW9uXS4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4iXSxpbml0U2NyZWVuQm9keVNlcnZpY2U6IldlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGRldmljZXMsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgdGhlIHB1cnBvc2VzIGRlc2NyaWJlZCBiZWxvdy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJz4oCZIHByb2Nlc3NpbmcgZm9yIHN1Y2ggcHVycG9zZXMuIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQsIG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4iLGluaXRTY3JlZW5Cb2R5R3JvdXA6IldlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGRldmljZXMsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgdGhlIHB1cnBvc2VzIGRlc2NyaWJlZCBiZWxvdy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJz4oCZIHByb2Nlc3NpbmcgZm9yIHN1Y2ggcHVycG9zZXMuIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQsIG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIGEgZ3JvdXAgb2Ygd2Vic2l0ZXMgW2xpbmtzIHRvIGRvbWFpbiB3aGVyZSBhbGwgdGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBmb3IgdGhpcyBncm91cCBjb25maWd1cmF0aW9uXS4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkYXRhIG1heSBub3QgcmVxdWlyZSB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSBhIHJpZ2h0IHRvIG9iamVjdCB0byBzdWNoIHByb2Nlc3NpbmcuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIixzcGVjaWFsUHVycG9zZXNBbmRGZWF0dXJlczoiU3BlY2lhbCBQdXJwb3NlcyBhbmQgRmVhdHVyZXMiLHNhdmVBbmRFeGl0QnV0dG9uOiJTQVZFICYgRVhJVCIscHVycG9zZVNjcmVlblZlbmRvckxpbms6IlBBUlRORVJTIixsZWdpdGltYXRlSW50ZXJlc3RMaW5rOiJMRUdJVElNQVRFIElOVEVSRVNUICIsc3BlY2lhbFB1cnBvc2VzTGFiZWw6IlNwZWNpYWwgUHVycG9zZXMiLHNwZWNpYWxGZWF0dXJlc0xhYmVsOiJTcGVjaWFsIEZlYXR1cmVzIixmZWF0dXJlc0xhYmVsOiJGZWF0dXJlcyIsYmFjazoiQmFjayIsb25MYWJlbDoiT04iLG9mZkxhYmVsOiJPRkYiLG11bHRpTGFiZWw6Ik1VTFRJIixsZWdhbERlc2NyaXB0aW9uOiJMZWdhbCBEZXNjcmlwdGlvbiIsc2hvd1BhcnRuZXJzOiJTaG93IFBhcnRuZXJzIixoaWRlUGFydG5lcnM6IkhpZGUgUGFydG5lcnMiLHZlbmRvclNjcmVlbkJvZHk6IlJldmlldyBhbmQgc2V0IHlvdXIgY29uc2VudCBwcmVmZXJlbmNlcyBmb3IgZWFjaCBwYXJ0bmVyIGJlbG93LiBFeHBhbmQgZWFjaCBwYXJ0bmVyIGxpc3QgaXRlbSBmb3IgbW9yZSBpbmZvcm1hdGlvbiB0byBoZWxwIG1ha2UgeW91ciBjaG9pY2UuIFNvbWUgcGVyc29uYWwgZGF0YSBpcyBwcm9jZXNzZWQgd2l0aG91dCB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gb2JqZWN0LiIscHJpdmFjeVBvbGljeUxhYmVsOiJQcml2YWN5IFBvbGljeSIsZGVzY3JpcHRpb25MYWJlbDoiVmVuZG9yIERlc2NyaXB0aW9uIixsZWdpdGltYXRlU2NyZWVuQm9keToiUmV2aWV3IGFuZCBvYmplY3QgdG8gcHJvY2Vzc2luZyBvZiBwZXJzb25hbCBkYXRhIHdpdGhvdXQgeW91ciBjb25zZW50IG9uIHRoZSBiYXNpcyBvZiBhIGxlZ2l0aW1hdGUgaW50ZXJlc3QgZm9yIGVhY2ggcHVycG9zZSBhbmQgYnkgZWFjaCBwYXJ0bmVyIGJlbG93LiBFeHBhbmQgZWFjaCBwdXJwb3NlIG9yIHBhcnRuZXIgbGlzdCBpdGVtIGZvciBtb3JlIGluZm9ybWF0aW9uIHRvIGhlbHAgbWFrZSB5b3VyIGNob2ljZS4gVG8gb2JqZWN0IHRvIHRoZSBzcGVjaWFsIHB1cnBvc2VzIG9mIGVuc3VyaW5nIHNlY3VyaXR5LCBwcmV2ZW50aW5nIGZyYXVkLCBhbmQgZGVidWdnaW5nLCBhbmQgdGVjaG5pY2FsbHkgZGVsaXZlcmluZyBhZHMgb3IgY29udGVudCBjbGljayBvbiBhIHBhcnRuZXIncyBwcml2YWN5IHBvbGljeSBsaW5rLiIsbGVnaXRpbWF0ZUludGVyZXN0UHVycG9zZXNMYWJlbDoiTGVnaXRpbWF0ZSBJbnRlcmVzdCBQdXJwb3NlKHMpIixsZWdpdGltYXRlSW50ZXJlc3RWZW5kb3JMYWJlbDoiTGVnaXRpbWF0ZSBJbnRlcmVzdCBWZW5kb3JzIixsZWdpdGltYXRlU2NyZWVuT2JqZWN0OiJPQkpFQ1QgKHRyYW5zbGF0aW9uIGhpbnQ6IHZlcmIgdG8gb2JqZWN0KSIsbGVnaXRpbWF0ZVNjcmVlbk9iamVjdGVkOiJPQkpFQ1RFRCIsbGVnaXRpbWF0ZVNjcmVlbkFjY2VwdDoiUkVNT1ZFIE9CSkVDVElPTiIsb2JqZWN0QWxsQnV0dG9uOiJPQkpFQ1QgQUxMIixwZXJzaXN0ZW50Q29uc2VudExpbmtMYWJlbDoiUHJpdmFjeSIsbm9uSWFiVmVuZG9yc05vdGljZToiVmVuZG9ycyB3aG8gZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBJQUIgRXVyb3BlIFRyYW5zcGFyZW5jeSBhbmQgQ29uc2VudCBGcmFtZXdvcmsgYW5kIGRvIG5vdCBhZGhlcmUgdG8gaXRzIHBvbGljaWVzIG9yIHRlY2huaWNhbCBzcGVjaWZpY2F0aW9ucyIsZ29vZ2xlUGFydG5lcnM6Ikdvb2dsZSBQYXJ0bmVycyIsY29va2llTWF4QWdlTGFiZWw6Ik1heCBjb29raWUgYWdlIixzZWNvbmRzTGFiZWw6InNlY29uZHMiLGRheXNMYWJlbDoiZGF5cyIsc3RvcmFnZURpc2Nsb3N1cmVMYWJlbDoiQ29va2llIGRpc2Nsb3N1cmUifSxMPXtub25JYWJWZW5kb3JMaXN0VXJsOiIiLHZlbmRvckJsYWNrbGlzdDpbXSx2ZW5kb3JXaGl0ZWxpc3Q6W10sZ29vZ2xlV2hpdGVsaXN0OlsxXX0sUD17dXhCYWNrZ3JvdW5kQ29sb3I6IiNmZmYiLHV4UHJpbWFyeUJ1dHRvbkNvbG9yOiIjMjA2REM1Iix1eFByaW1hcnlCdXR0b25UZXh0Q29sb3I6IiNmZmYiLHV4U2Vjb25kYXJ5QnV0dG9uQ29sb3I6IiNmZmYiLHV4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yOiIjMjA2REM1Iix1eFRvb2dsZUFjdGl2ZUNvbG9yOiIjMjA2REM1Iix1eExpbmtDb2xvcjoiIzIwNkRDNSIsdXhGb250Q29sb3I6IiMxNDFlMjMifSx3PXBhcnNlSW50KCIiLmNvbmNhdCgiMzMiKSksQT1OdW1iZXIuaXNOYU4odyk/MTp3LGs9IkNNUExpc3QiLE89ImV1Y29uc2VudC12MiIsVD0ibm9uaWFidmVuZG9yY29uc2VudCIsVj0iZXVwdWJjb25zZW50Iix4PSJfY21wUmVwcm9tcHRIYXNoIixSPSJ1c3ByaXZhY3kiLFU9ImFkZHRsX2NvbnNlbnQiLE09big3MCksRD17cXVhbnRjYXN0QWNjb3VudElkOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sY29uc2VudFNjb3BlOnt0eXBlOiJzdHJpbmciLHZhbHVlczpbdi5TRVJWSUNFLHYuU0VSVklDRV9HUk9VUF19LGRlZmF1bHRUb2dnbGVWYWx1ZTp7dHlwZToic3RyaW5nIix2YWx1ZXM6WyJvbiIsIm9mZiJdfSxkaXNwbGF5VWk6e3R5cGU6InN0cmluZyIsdmFsdWVzOlsibmV2ZXIiLCJpbkVVIiwiYWx3YXlzIl19LGRpc3BsYXlQZXJzaXN0ZW50Q29uc2VudExpbms6e3R5cGU6ImJvb2xlYW4iLHZhbHVlczoiIn0sZ3JvdXBTaXRlc1VybDp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LGhhc2hDb2RlOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0saW5pdFNjcmVlblJlamVjdEJ1dHRvblNob3dpbmc6e3R5cGU6ImJvb2xlYW4iLHZhbHVlczoiIn0saXNBTVA6e3R5cGU6ImJvb2xlYW4iLHZhbHVlczoiIn0saW5pdFNjcmVlbkJvZHlUZXh0T3B0aW9uOnt0eXBlOiJudW1iZXIiLHZhbHVlczoiIn0sbGFuZ186e3R5cGU6InN0cmluZyIsdmFsdWVzOk19LG5vbmNvbnNlbnREaXNwbGF5RnJlcXVlbmN5Ont0eXBlOiJudW1iZXIiLHZhbHVlczoiIn0scGVyc2lzdGVudENvbnNlbnRMaW5rTG9jYXRpb246e3R5cGU6Im51bWJlciIsdmFsdWVzOlsxLDIsMyw0XX0scHVibGlzaGVyTG9nbzp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHB1Ymxpc2hlck5hbWU6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifSxwdWJsaXNoZXJGZWF0dXJlc0lkczp7dHlwZToiYXJyYXkiLHZhbHVlczpbMSwyLDNdfSxwdWJsaXNoZXJTcGVjaWFsRmVhdHVyZXNJZHM6e3R5cGU6ImFycmF5IixjYW5CZUVtcHR5OiEwLHZhbHVlczpbMSwyXX0scHVibGlzaGVyU3BlY2lhbFB1cnBvc2VzSWRzOnt0eXBlOiJhcnJheSIsdmFsdWVzOlsxLDJdfSxwdWJsaXNoZXJQdXJwb3NlSWRzOnt0eXBlOiJhcnJheSIsY2FuQmVFbXB0eTohMCx2YWx1ZXM6WzEsMiwzLDQsNSw2LDcsOCw5LDEwXX0scHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkczp7dHlwZToiYXJyYXkiLGNhbkJlRW1wdHk6ITAsdmFsdWVzOlsxLDIsMyw0LDUsNiw3LDgsOSwxMF19LHB1Ymxpc2hlclZlbmRvckxpc3RVcmw6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifSxwdWJsaXNoZXJDb3VudHJ5Q29kZTp7dHlwZToic3RyaW5nIix2YWx1ZXM6WyJBRiIsIkFYIiwiQUwiLCJEWiIsIkFTIiwiQUQiLCJBTyIsIkFJIiwiQVEiLCJBRyIsIkFSIiwiQU0iLCJBVyIsIkFVIiwiQVQiLCJBWiIsIkJTIiwiQkgiLCJCRCIsIkJCIiwiQlkiLCJCRSIsIkJaIiwiQkoiLCJCTSIsIkJUIiwiQk8iLCJCQSIsIkJXIiwiQlYiLCJCUiIsIklPIiwiQk4iLCJCRyIsIkJGIiwiQkkiLCJLSCIsIkNNIiwiQ0EiLCJDViIsIktZIiwiQ0YiLCJURCIsIkNMIiwiQ04iLCJDWCIsIkNDIiwiQ08iLCJLTSIsIkNHIiwiQ0QiLCJDSyIsIkNSIiwiQ0kiLCJIUiIsIkNVIiwiQ1kiLCJDWiIsIkRLIiwiREoiLCJETSIsIkRPIiwiRUMiLCJFRyIsIlNWIiwiR1EiLCJFUiIsIkVFIiwiRVQiLCJGSyIsIkZPIiwiRkoiLCJGSSIsIkZSIiwiR0YiLCJQRiIsIlRGIiwiR0EiLCJHTSIsIkdFIiwiREUiLCJHSCIsIkdJIiwiR1IiLCJHTCIsIkdEIiwiR1AiLCJHVSIsIkdUIiwiR0ciLCJHTiIsIkdXIiwiR1kiLCJIVCIsIkhNIiwiVkEiLCJITiIsIkhLIiwiSFUiLCJJUyIsIklOIiwiSUQiLCJJUiIsIklRIiwiSUUiLCJJTSIsIklMIiwiSVQiLCJKTSIsIkpQIiwiSkUiLCJKTyIsIktaIiwiS0UiLCJLSSIsIktSIiwiS1ciLCJLRyIsIkxBIiwiTFYiLCJMQiIsIkxTIiwiTFIiLCJMWSIsIkxJIiwiTFQiLCJMVSIsIk1PIiwiTUsiLCJNRyIsIk1XIiwiTVkiLCJNViIsIk1MIiwiTVQiLCJNSCIsIk1RIiwiTVIiLCJNVSIsIllUIiwiTVgiLCJGTSIsIk1EIiwiTUMiLCJNTiIsIk1FIiwiTVMiLCJNQSIsIk1aIiwiTU0iLCJOQSIsIk5SIiwiTlAiLCJOTCIsIkFOIiwiTkMiLCJOWiIsIk5JIiwiTkUiLCJORyIsIk5VIiwiTkYiLCJNUCIsIk5PIiwiT00iLCJQSyIsIlBXIiwiUFMiLCJQQSIsIlBHIiwiUFkiLCJQRSIsIlBIIiwiUE4iLCJQTCIsIlBUIiwiUFIiLCJRQSIsIlJFIiwiUk8iLCJSVSIsIlJXIiwiQkwiLCJTSCIsIktOIiwiTEMiLCJNRiIsIlBNIiwiVkMiLCJXUyIsIlNNIiwiU1QiLCJTQSIsIlNOIiwiUlMiLCJTQyIsIlNMIiwiU0ciLCJTSyIsIlNJIiwiU0IiLCJTTyIsIlpBIiwiR1MiLCJFUyIsIkxLIiwiU0QiLCJTUiIsIlNKIiwiU1oiLCJTRSIsIkNIIiwiU1kiLCJUVyIsIlRKIiwiVFoiLCJUSCIsIlRMIiwiVEciLCJUSyIsIlRPIiwiVFQiLCJUTiIsIlRSIiwiVE0iLCJUQyIsIlRWIiwiVUciLCJVQSIsIkFFIiwiR0IiLCJVUyIsIlVNIiwiVVkiLCJVWiIsIlZVIiwiVkUiLCJWTiIsIlZHIiwiVkkiLCJXRiIsIkVIIiwiWUUiLCJaTSIsIlpXIl19LHZlbmRvclB1cnBvc2VJZHM6e3R5cGU6ImFycmF5IixjYW5CZUVtcHR5OiEwLHZhbHVlczpbMSwyLDMsNCw1LDYsNyw4LDksMTBdfSx2ZW5kb3JQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzOnt0eXBlOiJhcnJheSIsY2FuQmVFbXB0eTohMCx2YWx1ZXM6WzEsMiwzLDQsNSw2LDcsOCw5LDEwXX0sdmVuZG9yU3BlY2lhbEZlYXR1cmVzSWRzOnt0eXBlOiJhcnJheSIsY2FuQmVFbXB0eTohMCx2YWx1ZXM6WzEsMl19LHZlbmRvclNwZWNpYWxQdXJwb3Nlc0lkczp7dHlwZToiYXJyYXkiLGNhbkJlRW1wdHk6ITAsdmFsdWVzOlsxLDJdfSx2ZW5kb3JGZWF0dXJlc0lkczp7dHlwZToiYXJyYXkiLGNhbkJlRW1wdHk6ITAsdmFsdWVzOlsxLDIsM119LHJlamVjdENvbnNlbnRSZWRpcmVjdFVybDp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHN0YWNrczp7dHlwZToiYXJyYXkiLHZhbHVlczpbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDJdfSxzb2Z0T3B0SW5FbmFibGVkOnt0eXBlOiJib29sZWFuIix2YWx1ZXM6IiJ9LHVpTGF5b3V0Ont0eXBlOiJzdHJpbmciLHZhbHVlczpbInBvcHVwIiwiYmFubmVyIl19LHZlbmRvckxpc3RVcGRhdGVGcmVxOnt0eXBlOiJudW1iZXIiLHZhbHVlczoiIn0sY29uc2VudFNjb3BlR3JvdXBVUkw6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifSxjb29raWVEb21haW46e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifSxjb29raWVQYXRoOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdGhpcmRQYXJ0eVN0b3JhZ2VUeXBlOnt0eXBlOiJzdHJpbmciLHZhbHVlczpbImlmcmFtZSIsImFwaSJdfSxzaG93U3VtbWFyeVZpZXc6e3R5cGU6ImJvb2xlYW4iLHZhbHVlczoiIn0scHJpdmFjeU1vZGU6e3R5cGU6ImFycmF5Iix2YWx1ZXM6W3kuR0RQUix5LlVTUF19LHVzcFZlcnNpb246e3R5cGU6Im51bWJlciIsdmFsdWVzOlsxXX0sdXNwSnVyaXNkaWN0aW9uOnt0eXBlOiJhcnJheSIsdmFsdWVzOlsiVVMiLCJDQSJdfSx1c3BMc3BhY3Q6e3R5cGU6InN0cmluZyIsdmFsdWVzOltoLllFUyxoLk5PVF19LHVzcFByaXZhY3lQb2xpY3lMaW5rOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdXNwRGVsZXRlRGF0YUxpbms6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifSx1c3BBY2Nlc3NEYXRhTGluazp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHN1cHByZXNzQ2NwYUxpbmtzOnt0eXBlOiJib29sZWFuIix2YWx1ZXM6IiJ9LGdvb2dsZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4iLHZhbHVlczoiIn0scHVibGlzaGVyQ29uc2VudFJlc3RyaWN0aW9uSWRzOnt0eXBlOiJhcnJheSIsdmFsdWVzOiIiLGFycmF5VHlwZToibnVtYmVyIn0scHVibGlzaGVyTElSZXN0cmljdGlvbklkczp7dHlwZToiYXJyYXkiLHZhbHVlczoiIixhcnJheVR5cGU6Im51bWJlciJ9LGNvbnNlbnRPblNhZmFyaTp7dHlwZToiYm9vbGVhbiIsdmFsdWVzOiIifX0sRj17YWNjZXB0QWxsOnt0eXBlOiJzdHJpbmcifSxpbml0U2NyZWVuUmVqZWN0QnV0dG9uOnt0eXBlOiJzdHJpbmcifSxpbml0U2NyZWVuU2V0dGluZ3NCdXR0b246e3R5cGU6InN0cmluZyJ9LGluaXRTY3JlZW5UaXRsZTp7dHlwZToic3RyaW5nIn0scGVyc2lzdGVudENvbnNlbnRMaW5rTGFiZWw6e3R5cGU6InN0cmluZyJ9LGN1c3RvbUluaXRTY3JlZW5Cb2R5VGV4dDp7dHlwZToic3RyaW5nIn0sY3VzdG9tU2Vjb25kU2NyZWVuQm9keVRleHQ6e3R5cGU6InN0cmluZyJ9LGN1c3RvbVZlbmRvclNjcmVlbkJvZHlUZXh0Ont0eXBlOiJzdHJpbmcifSxjdXN0b21MZWdpdGltYXRlU2NyZWVuQm9keVRleHQ6e3R5cGU6InN0cmluZyJ9LHN1bW1hcnlTY3JlZW5Cb2R5Tm9SZWplY3RTZXJ2aWNlOnt0eXBlOiJhcnJheSIsdmFsdWVzOiIifSxzdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0R3JvdXA6e3R5cGU6ImFycmF5Iix2YWx1ZXM6IiJ9LHN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0U2VydmljZTp7dHlwZToiYXJyYXkiLHZhbHVlczoiIn0sc3VtbWFyeVNjcmVlbkJvZHlSZWplY3RHcm91cDp7dHlwZToiYXJyYXkiLHZhbHVlczoiIn0sZ3JvdXBPZlNpdGVzTGFiZWw6e3R5cGU6InN0cmluZyJ9LHNhdmVBbmRFeGl0QnV0dG9uOnt0eXBlOiJzdHJpbmcifSxhZ3JlZVRvU2VsZWN0ZWRCdXR0b246e3R5cGU6InN0cmluZyJ9LGFncmVlQnV0dG9uOnt0eXBlOiJzdHJpbmcifSxhZ3JlZUFsbEJ1dHRvbjp7dHlwZToic3RyaW5nIn0scmVqZWN0QWxsOnt0eXBlOiJzdHJpbmcifSxvYmplY3RBbGxCdXR0b246e3R5cGU6InN0cmluZyJ9fSxOPXtub25JYWJWZW5kb3JMaXN0VXJsOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdmVuZG9yV2hpdGVsaXN0Ont0eXBlOiJhcnJheSIsdmFsdWVzOiIiLGFycmF5VHlwZToibnVtYmVyIn0sdmVuZG9yQmxhY2tsaXN0Ont0eXBlOiJhcnJheSIsdmFsdWVzOiIiLGFycmF5VHlwZToibnVtYmVyIn0sZ29vZ2xlV2hpdGVsaXN0Ont0eXBlOiJhcnJheSIsdmFsdWVzOiIiLGFycmF5VHlwZToibnVtYmVyIn19LEI9e2luaXRTY3JlZW5DdXN0b21MaW5rczp7dHlwZToiYXJyYXkiLHZhbHVlczoiIixhcnJheVR5cGU6Im9iamVjdCJ9LGxpbmtzVGl0bGU6e3R5cGU6InN0cmluZyJ9LG5vbklhYlZlbmRvcnNMYWJlbDp7dHlwZToic3RyaW5nIn0sdXNwRG5zVGl0bGU6e3R5cGU6InN0cmluZyJ9LHVzcERuc1RleHQ6e3R5cGU6ImFycmF5Iix2YWx1ZXM6IiIsYXJyYXlUeXBlOiJzdHJpbmcifSx1c3BEb05vdFNlbGxUb2dnbGVUZXh0Ont0eXBlOiJzdHJpbmcifSx1c3BQcml2YWN5UG9saWN5TGlua1RleHQ6e3R5cGU6InN0cmluZyJ9LHVzcERlbGV0ZURhdGFMaW5rVGV4dDp7dHlwZToic3RyaW5nIn0sdXNwQWNjZXNzRGF0YUxpbmtUZXh0Ont0eXBlOiJzdHJpbmcifSx1c3BBY2NlcHRCdXR0b246e3R5cGU6InN0cmluZyJ9fSxqPXt1eEJhY2tncm91bmRDb2xvcjp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHV4UHJpbWFyeUJ1dHRvbkNvbG9yOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdXhQcmltYXJ5QnV0dG9uVGV4dENvbG9yOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdXhTZWNvbmRhcnlCdXR0b25Db2xvcjp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHV4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdXhUb29nbGVBY3RpdmVDb2xvcjp7dHlwZToic3RyaW5nIix2YWx1ZXM6IiJ9LHV4TGlua0NvbG9yOnt0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sdXhGb250Q29sb3I6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifX0sRz17bm9uSWFiVmVuZG9yTGlzdDp7dHlwZToiYXJyYXkiLHZhbHVlczoiIixhcnJheVR5cGU6Im9iamVjdCJ9LHVwZGF0ZUF0Ont0eXBlOiJzdHJpbmciLHZhbHVlczoiIn0sbm9uSWFiVmVuZG9yc0hhc2g6e3R5cGU6InN0cmluZyIsdmFsdWVzOiIifX0sSD1mdW5jdGlvbihlLHQsbil7aWYodCBpbiBuKXt2YXIgcj1lW3RdLG89blt0XS50eXBlLGk9blt0XS52YWx1ZXM7cmV0dXJuIiIhPT1yJiYodHlwZW9mIHI9PT1vPyJudW1iZXIiPT09byYmcjwwPyhjb25zb2xlLndhcm4oIiIuY29uY2F0KHQsIiBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyIikpLCExKToiIj09PWl8fCghIWkuaW5jbHVkZXMocil8fChjb25zb2xlLndhcm4oIiIuY29uY2F0KHQsIiBtdXN0IGJlIGEgdmFsaWQgdmFsdWUiKSksITEpKTooY29uc29sZS53YXJuKCIiLmNvbmNhdCh0LCIgbXVzdCBiZSAiKS5jb25jYXQobykpLCExKSl9cmV0dXJuIGNvbnNvbGUud2FybigiIi5jb25jYXQodCwiIGlzIG5vdCBhIHZhbGlkIGNvbmZpZyB2YWx1ZSIpKSwhMX0scT1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZVt0XTtpZihBcnJheS5pc0FycmF5KHIpKXtpZighci5sZW5ndGgpcmV0dXJuITA9PT1uW3RdLmNhbkJlRW1wdHkmJnI7dmFyIG89W107cmV0dXJuIHIuZm9yRWFjaChmdW5jdGlvbihlKXsic3RyaW5nIj09PXR5cGVvZiBuW3RdLnZhbHVlcz90eXBlb2YgZT09PW5bdF0uYXJyYXlUeXBlP28ucHVzaChlKTpjb25zb2xlLndhcm4oIiIuY29uY2F0KGUsIiAiKS5jb25jYXQoImlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciIsIiAiKS5jb25jYXQodCkpOm5bdF0udmFsdWVzLmluY2x1ZGVzKGUpP28ucHVzaChlKTpjb25zb2xlLndhcm4oIiIuY29uY2F0KGUsIiAiKS5jb25jYXQoImlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciIsIiAiKS5jb25jYXQodCkpfSksISFvLmxlbmd0aCYmb31yZXR1cm4gY29uc29sZS53YXJuKCIiLmNvbmNhdCh0LCIgbXVzdCBiZSBhbiBhcnJheSIpKSwhMX0sej1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcztwKHRoaXMsZSksdGhpcy5fY29yZUNvbmZpZz12b2lkIDAsdGhpcy5fcHJlbWl1bVByb3BlcnRpZXM9dm9pZCAwLHRoaXMuX2NvcmVVaUxhYmVscz12b2lkIDAsdGhpcy5fcHJlbWl1bVVpTGFiZWxzPXZvaWQgMCx0aGlzLl90aGVtZT12b2lkIDAsdGhpcy5fbm9uSWFiVmVuZG9yc0luZm89dm9pZCAwLHRoaXMuX2FtcERhdGE9dm9pZCAwLHRoaXMuY2xlYW5Db25maWc9dm9pZCAwLHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcz1mdW5jdGlvbigpe3ZhciBlPW4uY2xlYW5Db25maWcuY29yZUNvbmZpZzsiY29uc2VudFNjb3BlImluIGV8fChuLmNsZWFuQ29uZmlnLmNvcmVDb25maWcuY29uc2VudFNjb3BlPXYuU0VSVklDRSksInByaXZhY3lNb2RlImluIGV8fChuLmNsZWFuQ29uZmlnLmNvcmVDb25maWcucHJpdmFjeU1vZGU9W3kuR0RQUl0pfSx0aGlzLnZhbGlkYXRlQ29uZmlnPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHI9e30sbz17fSxpPXt9LHM9e30sYT12b2lkIDAsYz12b2lkIDA7cmV0dXJuIGUuY29yZUNvbmZpZyYmKHQ9bi5maWx0ZXJDb25maWcoZS5jb3JlQ29uZmlnLEQpKSxlLmNvcmVVaUxhYmVscyYmKHI9bi5maWx0ZXJMYWJlbHMoZS5jb3JlVWlMYWJlbHMsRikpLGUucHJlbWl1bVByb3BlcnRpZXMmJihvPW4uZmlsdGVyQ29uZmlnKGUucHJlbWl1bVByb3BlcnRpZXMsTikpLGUucHJlbWl1bVVpTGFiZWxzJiYoaT1uLmZpbHRlckxhYmVscyhlLnByZW1pdW1VaUxhYmVscyxCKSksZS50aGVtZSYmKHM9bi5maWx0ZXJDb25maWcoZS50aGVtZSxqKSksZS5ub25JYWJWZW5kb3JzSW5mbyYmKGE9bi5maWx0ZXJDb25maWcoZS5ub25JYWJWZW5kb3JzSW5mbyxHKSksZS5hbXBEYXRhJiYoYz1lLmFtcERhdGEpLHtjb3JlQ29uZmlnOnQsY29yZVVpTGFiZWxzOnIscHJlbWl1bVByb3BlcnRpZXM6byxwcmVtaXVtVWlMYWJlbHM6aSx0aGVtZTpzLG5vbklhYlZlbmRvcnNJbmZvOmEsYW1wRGF0YTpjfX0sdGhpcy5maWx0ZXJDb25maWc9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlpZihyIGluIHQpaWYoImFycmF5Ij09PXRbcl0udHlwZSl7dmFyIG89cShlLHIsdCk7byYmKG5bcl09byl9ZWxzZSBIKGUscix0KSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59LHRoaXMuZmlsdGVyTGFiZWxzPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpaWYociBpbiB0KWlmKCJzdHJpbmciPT09dFtyXS50eXBlKSIiIT09ZVtyXT9uW3JdPWVbcl06Y29uc29sZS53YXJuKCIiLmNvbmNhdChyLCIgY2Fubm90IGJlIGVtcHR5IikpO2Vsc2V7dmFyIG89cShlLHIsdCk7byYmKG5bcl09byl9cmV0dXJuIG59LHRoaXMuZ2V0Q3VzdG9tQ29yZVVpTGFiZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xlYW5Db25maWcuY29yZVVpTGFiZWxzfSx0aGlzLmluaXRpYWxpemVDb25maWc9ZnVuY3Rpb24oKXtPYmplY3Qua2V5cyhuLmNsZWFuQ29uZmlnKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV0mJihuW2VdPWkoaSh7fSxuW2VdKSxuLmNsZWFuQ29uZmlnW2VdKSl9KX0sdGhpcy5jbGVhbkNvbmZpZz10aGlzLnZhbGlkYXRlQ29uZmlnKHQpLHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcygpO3ZhciByPXRoaXMuY2xlYW5Db25maWcsbz1yLmNvcmVDb25maWcscz1vLnByaXZhY3lNb2RlLGE9by5jb25zZW50U2NvcGUsYz1vLnF1YW50Y2FzdEFjY291bnRJZCx1PXIubm9uSWFiVmVuZG9yc0luZm8sbD1yLmFtcERhdGE7cy5pbmNsdWRlcyh5LkdEUFIpJiZzLmluY2x1ZGVzKHkuVVNQKT8odGhpcy5fY29yZUNvbmZpZz1pKGkoe3F1YW50Y2FzdEFjY291bnRJZDpjLGNvbnNlbnRTY29wZTphLHByaXZhY3lNb2RlOnN9LF8pLEMpLHRoaXMuX3ByZW1pdW1VaUxhYmVscz1pKGkoe30sUyksRSksdGhpcy5fcHJlbWl1bVByb3BlcnRpZXM9aSh7fSxMKSx0aGlzLl9jb3JlVWlMYWJlbHM9aSh7fSxJKSx0aGlzLl90aGVtZT1pKHt9LFApLHUmJih0aGlzLl9ub25JYWJWZW5kb3JzSW5mbz11KSk6cy5pbmNsdWRlcygiR0RQUiIpPyh0aGlzLl9jb3JlQ29uZmlnPWkoe3F1YW50Y2FzdEFjY291bnRJZDpjLGNvbnNlbnRTY29wZTphLHByaXZhY3lNb2RlOnN9LF8pLHRoaXMuX3ByZW1pdW1VaUxhYmVscz1pKHt9LEUpLHRoaXMuX3ByZW1pdW1Qcm9wZXJ0aWVzPWkoe30sTCksdGhpcy5fY29yZVVpTGFiZWxzPWkoe30sSSksdGhpcy5fdGhlbWU9aSh7fSxQKSx1JiYodGhpcy5fbm9uSWFiVmVuZG9yc0luZm89dSkpOih0aGlzLl9jb3JlQ29uZmlnPWkoe3F1YW50Y2FzdEFjY291bnRJZDpjLGNvbnNlbnRTY29wZTphLHByaXZhY3lNb2RlOnN9LEMpLHRoaXMuX3ByZW1pdW1VaUxhYmVscz1pKHt9LFMpLHRoaXMuX3ByZW1pdW1Qcm9wZXJ0aWVzPXt9LHRoaXMuX2NvcmVVaUxhYmVscz17fSx0aGlzLl90aGVtZT1pKHt9LFApKSxsJiYodGhpcy5fYW1wRGF0YT1sKX1yZXR1cm4gZChlLFt7a2V5OiJnZXRDdXN0b21QcmVtaXVtVWlMYWJlbHMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYW5Db25maWcucHJlbWl1bVVpTGFiZWxzfX0se2tleToiY29yZUNvbmZpZyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvcmVDb25maWd9LHNldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49WyJwdWJsaXNoZXJMb2dvIiwicHVibGlzaGVyTmFtZSIsInB1Ymxpc2hlckZlYXR1cmVzSWRzIiwicHVibGlzaGVyU3BlY2lhbEZlYXR1cmVzSWRzIiwicHVibGlzaGVyU3BlY2lhbFB1cnBvc2VzSWRzIiwicHVibGlzaGVyUHVycG9zZUlkcyIsInB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMiLCJwdWJsaXNoZXJWZW5kb3JMaXN0VXJsIiwicHVibGlzaGVyVmVuZG9yTGlzdFVybCIsInB1Ymxpc2hlckNvdW50cnlDb2RlIiwidmVuZG9yUHVycG9zZUlkcyIsInZlbmRvclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMiLCJ2ZW5kb3JTcGVjaWFsRmVhdHVyZXNJZHMiLCJ2ZW5kb3JTcGVjaWFsUHVycG9zZXNJZHMiLCJ2ZW5kb3JGZWF0dXJlc0lkcyIsInJlamVjdENvbnNlbnRSZWRpcmVjdFVybCIsInN0YWNrcyJdLHI9WyJub25jb25zZW50RGlzcGxheUZyZXF1ZW5jeSIsInZlbmRvckxpc3RVcGRhdGVGcmVxIl07T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihvKXtpZihlW29dIT09dC5jb3JlQ29uZmlnW29dKXtpZigtMSE9PW4uaW5kZXhPZihvKSYmKCIiPT09ZVtvXXx8ZVtvXT09PVtdKSl0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG8sIiBjYW5ub3QgYmUgZW1wdHkiKSk7aWYoci5pbmRleE9mKG8pJiZlW29dPDApdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChvLCIgY2Fubm90IGJlIGEgbmVnYXRpdmUgbnVtYmVyIikpfX0pLHRoaXMuX2NvcmVDb25maWc9ZX19LHtrZXk6InByZW1pdW1Qcm9wZXJ0aWVzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlbWl1bVByb3BlcnRpZXN9LHNldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYodC5wcmVtaXVtUHJvcGVydGllc1tuXSE9PWVbbl0mJigiIj09PWVbbl18fGVbbl09PT1bXSkpdGhyb3cgbmV3IEVycm9yKCIiLmNvbmNhdChuLCIgY2Fubm90IGJlIGVtcHR5IikpfSksdGhpcy5fcHJlbWl1bVByb3BlcnRpZXM9ZX19LHtrZXk6ImNvcmVVaUxhYmVscyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvcmVVaUxhYmVsc30sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZih0LmNvcmVVaUxhYmVsc1tuXSE9PWVbbl0mJiIiPT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG4sIiBjYW5ub3QgYmUgZW1wdHkiKSl9KSx0aGlzLl9jb3JlVWlMYWJlbHM9ZX19LHtrZXk6InRoZW1lIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGhlbWV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYodC50aGVtZVtuXSE9PWVbbl0mJiIiPT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG4sIiBjYW5ub3QgYmUgZW1wdHkiKSl9KSx0aGlzLl90aGVtZT1lfX0se2tleToibm9uSWFiVmVuZG9yc0luZm8iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub25JYWJWZW5kb3JzSW5mb30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX25vbklhYlZlbmRvcnNJbmZvPWV9fSx7a2V5OiJhbXBEYXRhIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW1wRGF0YX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2FtcERhdGE9ZX19LHtrZXk6InByZW1pdW1VaUxhYmVscyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZW1pdW1VaUxhYmVsc30sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZih0LnByZW1pdW1VaUxhYmVsc1tuXSE9PWVbbl0mJiFlW25dLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIiIuY29uY2F0KG4sIiBjYW5ub3QgYmUgZW1wdHkiKSl9KSx0aGlzLl9wcmVtaXVtVWlMYWJlbHM9ZX19XSksZX0oKSxKPW4oMjApLFc9bigzMyksWT1uKDcwKSxLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciB0PXRoaXM7cCh0aGlzLGUpLHRoaXMuX190Y2ZhcGl1aT12b2lkIDAsdGhpcy5fX3RjZmFwaXVpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10Ll9fdGNmYXBpdWkuYT10Ll9fdGNmYXBpdWkuYXx8W10scj1hcmd1bWVudHMubGVuZ3RoLG89bmV3IEFycmF5KHI+MT9yLTE6MCksaT0xO2k8cjtpKyspb1tpLTFdPWFyZ3VtZW50c1tpXTtuLnB1c2goW2VdLmNvbmNhdChvKSl9LHdpbmRvdy5fX3RjZmFwaXVpfHwod2luZG93Ll9fdGNmYXBpdWk9dGhpcy5fX3RjZmFwaXVpKX1yZXR1cm4gZChlLFt7a2V5OiJkaXNwbGF5VWkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dShhLmEubWFyayhmdW5jdGlvbiB0KG4pe3ZhciByLG8saSxzLGMsdSxwLGw9YXJndW1lbnRzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDppZihvPWwubGVuZ3RoPjEmJnZvaWQgMCE9PWxbMV0/bFsxXToxLGk9bC5sZW5ndGg+MiYmdm9pZCAwIT09bFsyXSYmbFsyXSxlLmNyZWF0ZVVpU2NyaXB0QmxvY2soKSxzPW51bGw9PT0ocj1OZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlKXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcyhuKSxGZS51cGRhdGVBcGlWaXNpYmxlKG4scykscyl7dC5uZXh0PTg7YnJlYWt9cmV0dXJuIGNvbnNvbGUud2FybigiYXR0ZW1wdCB0byBzaG93IGRpc2FibGVkIENNUCBVSSByZWd1bGF0aW9uPSIuY29uY2F0KG4pKSx0LmFicnVwdCgicmV0dXJuIik7Y2FzZSA4OmlmKCEoYz0iR0RQUiI9PT1uKXx8V2Upe3QubmV4dD0xMjticmVha31yZXR1cm4gdC5uZXh0PTEyLFllKCEwKTtjYXNlIDEyOmlmKCFjKXt0Lm5leHQ9MTg7YnJlYWt9cmV0dXJuIHQubmV4dD0xNSxGZS5sb2FkR1ZMKCk7Y2FzZSAxNTp0LnQwPXQuc2VudCx0Lm5leHQ9MTk7YnJlYWs7Y2FzZSAxODp0LnQwPXZvaWQgMDtjYXNlIDE5OmlmKHU9dC50MCx0LnQxPW4sdC50Mj1vLHQudDM9aSx0LnQ0PU5lLHQudDU9dSwhYyl7dC5uZXh0PTMxO2JyZWFrfXJldHVybiB0Lm5leHQ9MjgsRmUuZ2V0Q29uc2VudHMoKTtjYXNlIDI4OnQudDY9dC5zZW50LHQubmV4dD0zMjticmVhaztjYXNlIDMxOnQudDY9e307Y2FzZSAzMjp0LnQ3PXQudDYsdC50OD1jP0hlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JMaXN0Ont9LHQudDk9Yz9LZS5mZXRjaFBhcnRuZXJzKCk6dm9pZCAwLHA9e3JlZ3VsYXRpb246dC50MSxwYWdlOnQudDIsaXNNYW5kYXRvcnk6dC50Myxjb25maWc6dC50NCxndmw6dC50NSxjb25zZW50SW5mbzp0LnQ3LG5vbklhYlZlbmRvckxpc3Q6dC50OCxnb29nbGVEYXRhOnQudDl9LHdpbmRvdy5fX3RjZmFwaXVpKCJkaXNwbGF5VWkiLHApO2Nhc2UgMzc6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfV0sW3trZXk6ImNyZWF0ZVVpU2NyaXB0QmxvY2siLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9d2luZG93LmRvY3VtZW50O2lmKCFlLmdldEVsZW1lbnRCeUlkKCJfX3RjZmFwaXVpc2NyaXB0Iikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLG49KE5lLmNvcmVDb25maWcubGFuZ198fCJlbiIpLnRvTG93ZXJDYXNlKCk7WS5pbmNsdWRlcyhuKXx8KG49ImVuIik7dmFyIHI9Imh0dHBzOi8vcXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvMzMvY21wMnVpLmpzIjtyPXIucmVwbGFjZSgiLmpzIiwiLSIuY29uY2F0KG4sIi5qcyIpKSx0LnR5cGU9InRleHQvamF2YXNjcmlwdCIsdC5pZD0iX190Y2ZhcGl1aXNjcmlwdCIsdC5zcmM9cixlLmhlYWQuYXBwZW5kQ2hpbGQodCl9fX1dKSxlfSgpLFE9big4NyksWj1uLm4oUSkuYS5jcmVhdGUoe3hzcmZDb29raWVOYW1lOm51bGx9KSxYPWZ1bmN0aW9uKGUpe09iamVjdCh7Tk9ERV9FTlY6InByb2R1Y3Rpb24iLFBVQkxJQ19VUkw6IiIsQU1QX0ZSQU1FX1VSTF9CQVNFOiJodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyLzMzIixBTVBfQ0hFQ0tfQ09OU0VOVF9VUkw6Imh0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9hbXAvY2hlY2stY29uc2VudCIsTE9DQUxfU1RBVElDX0RJUjoiIixSRUFDVF9BUFBfTE9HX0FQSToiaHR0cHM6Ly9hdWRpdC10Y2Z2Mi5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZyIsUkVBQ1RfQVBQX0dFT0lQX0FQSV9VUkw6Imh0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9nZW9pcCIsUkVBQ1RfQVBQX0dPT0dMRV9BVFBfVVJMOiJodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyL2dvb2dsZS1hdHAtbGlzdC5qc29uIixSRUFDVF9BUFBfVkVSU0lPTjoiMzMiLFJFQUNUX0FQUF9DTVBVSV9TUkM6Imh0dHBzOi8vcXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvMzMvY21wMnVpLmpzIixSRUFDVF9BUFBfR1ZMX0JBU0VfVVJMOiJodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL0dWTC12Mi8iLFJFQUNUX0FQUF9UUkFOU0xBVElPTl9CQVNFX1VSTDoiaHR0cHM6Ly93d3cucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvdHJhbnNsYXRpb25zLyJ9KS5SRUFDVF9BUFBfREVCVUcmJmNvbnNvbGUubG9nKCJEZWJ1ZzogIitlKX0sJD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7c3dpdGNoKHAodGhpcyxlKSx0aGlzLl9pc1VzZXJJbkVVPXZvaWQgMCx0aGlzLl9pc1VzZXJJblVTPXZvaWQgMCx0aGlzLl91c2VyU3BlY2lmaWNMb2NhdGlvbj12b2lkIDAsdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb249bnVsbCx0KXtjYXNlImluVVMiOnRoaXMuX2lzVXNlckluRVU9ZmFsc2UsdGhpcy5faXNVc2VySW5VUz1mYWxzZTticmVhaztjYXNlImluRVUiOnRoaXMuX2lzVXNlckluRVU9ZmFsc2UsdGhpcy5faXNVc2VySW5VUz1mYWxzZTticmVhaztkZWZhdWx0OnRoaXMuX2lzVXNlckluRVU9ZmFsc2UsdGhpcy5faXNVc2VySW5VUz1mYWxzZX19cmV0dXJuIGQoZSxbe2tleToiY2hlY2tTcGVjaWZpY0xvY2F0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scjtyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYodD1OZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlLHRoaXMuX3VzZXJTcGVjaWZpY0xvY2F0aW9uKXtlLm5leHQ9MjM7YnJlYWt9aWYoWCgiaW5pdFVzcExvY2F0aW9uOiBleGFjdCBsb2NhdGlvbiByZXF1ZXN0IiksIXQuaW5jbHVkZXMoIlVTUCIpKXtlLm5leHQ9MjM7YnJlYWt9aWYobj1OZS5jb3JlQ29uZmlnLnVzcEp1cmlzZGljdGlvbiwhdGhpcy5pc1VzZXJJblVTKXtlLm5leHQ9MjI7YnJlYWt9aWYobi5pbmNsdWRlcygiVVMiKSl7ZS5uZXh0PTE5O2JyZWFrfXJldHVybiBlLnByZXY9NyxlLm5leHQ9MTAsWi5nZXQoImh0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9nZW9pcCIpO2Nhc2UgMTA6cj1lLnNlbnQsdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb249ci5kYXRhLGUubmV4dD0xNzticmVhaztjYXNlIDE0OmUucHJldj0xNCxlLnQwPWUuY2F0Y2goNyksY29uc29sZS5sb2coZS50MCk7Y2FzZSAxNzplLm5leHQ9MjA7YnJlYWs7Y2FzZSAxOTp0aGlzLl91c2VyU3BlY2lmaWNMb2NhdGlvbj0iVVMiO2Nhc2UgMjA6ZS5uZXh0PTIzO2JyZWFrO2Nhc2UgMjI6dGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb249Im5vbi1VUyI7Y2FzZSAyMzpyZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb24pO2Nhc2UgMjQ6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUsdGhpcyxbWzcsMTRdXSl9KSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKX0se2tleToiaXNVc2VySW5FVSIsc2V0OmZ1bmN0aW9uKGUpe1goInRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZyIpLHRoaXMuX2lzVXNlckluRVU9ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVXNlckluRVV9fSx7a2V5OiJpc1VzZXJJblVTIixzZXQ6ZnVuY3Rpb24oZSl7WCgidGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nIiksdGhpcy5faXNVc2VySW5VUz1lfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNVc2VySW5VU319LHtrZXk6InVzZXJTcGVjaWZpY0xvY2F0aW9uIixzZXQ6ZnVuY3Rpb24oZSl7WCgidGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nIiksdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb249ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VzZXJTcGVjaWZpY0xvY2F0aW9ufX1dKSxlfSgpO2Z1bmN0aW9uIGVlKGUpe3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0ZT0iIixuZSh0KS5kaXNwYXRjaChlKSxmdW5jdGlvbihlKXtyZXR1cm4gYnRvYShmdW5jdGlvbihlKXtmb3IodmFyIHQ9IiIsbj0wO248ZS5sZW5ndGg7bisrKWZvcih2YXIgcj1lW25dLG89MDtvPDQ7bysrKXQrPVN0cmluZy5mcm9tQ2hhckNvZGUocj4+OCpvJjI1NSk7cmV0dXJuIHR9KGZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5sZW5ndGgscj1bMTczMjU4NDE5MywtMjcxNzMzODc5LC0xNzMyNTg0MTk0LDI3MTczMzg3OF07Zm9yKHQ9NjQ7dDw9ZS5sZW5ndGg7dCs9NjQpcmUocix1ZShlLnN1YnN0cmluZyh0LTY0LHQpKSk7ZT1lLnN1YnN0cmluZyh0LTY0KTt2YXIgbz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF07Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylvW3Q+PjJdfD1lLmNoYXJDb2RlQXQodCk8PCh0JTQ8PDMpO2lmKG9bdD4+Ml18PTEyODw8KHQlNDw8MyksdD41NSlmb3IocmUocixvKSx0PTA7dDwxNjt0Kyspb1t0XT0wO3JldHVybiBvWzE0XT04Km4scmUocixvKSxyfShlKSkpfSh0ZSl9KGUpfXZhciB0ZT0iIjtmdW5jdGlvbiBuZShlLHQsbil7bj1ufHxbXTt2YXIgcj1mdW5jdGlvbihlKXt0ZSs9ZX07cmV0dXJue2Rpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBudWxsPT09ZSYmKHQ9Im51bGwiKSx0aGlzWyJfIit0XShlKX0sX29iamVjdDpmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksbz0vXFtvYmplY3QgKC4qKVxdL2kuZXhlYyh0KTtvPShvPW8/b1sxXToidW5rbm93bjpbIit0KyJdIikudG9Mb3dlckNhc2UoKTt2YXIgaTtpZigoaT1uLmluZGV4T2YoZSkpPj0wKXJldHVybiB0aGlzLmRpc3BhdGNoKCJbQ0lSQ1VMQVI6IitpKyJdIik7aWYobi5wdXNoKGUpLCJvYmplY3QiPT09b3x8ImZ1bmN0aW9uIj09PW98fCJhc3luY2Z1bmN0aW9uIj09PW8pe3ZhciBzPU9iamVjdC5rZXlzKGUpO3IoIm9iamVjdDoiK3MubGVuZ3RoKyI6Iik7dmFyIGE9dGhpcztyZXR1cm4gcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EuZGlzcGF0Y2godCkscigiOiIpLGEuZGlzcGF0Y2goZVt0XSkscigiLCIpfSl9aWYoIXRoaXNbIl8iK29dKXRocm93IG5ldyBFcnJvcignVW5rbm93biBvYmplY3QgdHlwZSAiJytvKyciJyk7dGhpc1siXyIrb10oZSl9LF9hcnJheTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiByKCJhcnJheToiK2UubGVuZ3RoKyI6IiksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmRpc3BhdGNoKGUpfSl9LF9kYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByKCJkYXRlOiIrZS50b0pTT04oKSl9LF9zeW1ib2w6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoInN5bWJvbDoiK2UudG9TdHJpbmcoKSl9LF9lcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4gcigiZXJyb3I6IitlLnRvU3RyaW5nKCkpfSxfYm9vbGVhbjpmdW5jdGlvbihlKXtyZXR1cm4gcigiYm9vbDoiK2UudG9TdHJpbmcoKSl9LF9zdHJpbmc6ZnVuY3Rpb24oZSl7cigic3RyaW5nOiIrZS5sZW5ndGgrIjoiKSxyKGUudG9TdHJpbmcoKSl9LF9mdW5jdGlvbjpmdW5jdGlvbihlKXtyKCJmbjoiKSx0aGlzLmRpc3BhdGNoKGUudG9TdHJpbmcoKSl9LF9udW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoIm51bWJlcjoiK2UudG9TdHJpbmcoKSl9LF94bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoInhtbDoiK2UudG9TdHJpbmcoKSl9LF9udWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHIoIk51bGwiKX0sX3VuZGVmaW5lZDpmdW5jdGlvbigpe3JldHVybiByKCJVbmRlZmluZWQiKX0sX3JlZ2V4cDpmdW5jdGlvbihlKXtyZXR1cm4gcigicmVnZXg6IitlLnRvU3RyaW5nKCkpfSxfdWludDhhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gcigidWludDhhcnJheToiKSx0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX0sX3VpbnQ4Y2xhbXBlZGFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiByKCJ1aW50OGNsYW1wZWRhcnJheToiKSx0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX0sX2ludDhhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gcigidWludDhhcnJheToiKSx0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX0sX3VpbnQxNmFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiByKCJ1aW50MTZhcnJheToiKSx0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX0sX2ludDE2YXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoInVpbnQxNmFycmF5OiIpLHRoaXMuZGlzcGF0Y2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpfSxfdWludDMyYXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoInVpbnQzMmFycmF5OiIpLHRoaXMuZGlzcGF0Y2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpfSxfaW50MzJhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gcigidWludDMyYXJyYXk6IiksdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSl9LF9mbG9hdDMyYXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoImZsb2F0MzJhcnJheToiKSx0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX0sX2Zsb2F0NjRhcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gcigiZmxvYXQ2NGFycmF5OiIpLHRoaXMuZGlzcGF0Y2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpfSxfYXJyYXlidWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoImFycmF5YnVmZmVyOiIpLHRoaXMuZGlzcGF0Y2gobmV3IFVpbnQ4QXJyYXkoZSkpfSxfdXJsOmZ1bmN0aW9uKGUpe3JldHVybiByKCJ1cmw6IitlLnRvU3RyaW5nKCkpfSxfbWFwOmZ1bmN0aW9uKGUpe3IoIm1hcDoiKTt2YXIgdD1BcnJheS5mcm9tKGUpO3JldHVybiB0aGlzLl9hcnJheSh0KX0sX3NldDpmdW5jdGlvbihlKXtyKCJzZXQ6Iik7dmFyIHQ9QXJyYXkuZnJvbShlKTtyZXR1cm4gdGhpcy5fYXJyYXkodCl9fX1mdW5jdGlvbiByZShlLHQpe3ZhciBuPWVbMF0scj1lWzFdLG89ZVsyXSxpPWVbM107bj1pZShuLHIsbyxpLHRbMF0sNywtNjgwODc2OTM2KSxpPWllKGksbixyLG8sdFsxXSwxMiwtMzg5NTY0NTg2KSxvPWllKG8saSxuLHIsdFsyXSwxNyw2MDYxMDU4MTkpLHI9aWUocixvLGksbix0WzNdLDIyLC0xMDQ0NTI1MzMwKSxuPWllKG4scixvLGksdFs0XSw3LC0xNzY0MTg4OTcpLGk9aWUoaSxuLHIsbyx0WzVdLDEyLDEyMDAwODA0MjYpLG89aWUobyxpLG4scix0WzZdLDE3LC0xNDczMjMxMzQxKSxyPWllKHIsbyxpLG4sdFs3XSwyMiwtNDU3MDU5ODMpLG49aWUobixyLG8saSx0WzhdLDcsMTc3MDAzNTQxNiksaT1pZShpLG4scixvLHRbOV0sMTIsLTE5NTg0MTQ0MTcpLG89aWUobyxpLG4scix0WzEwXSwxNywtNDIwNjMpLHI9aWUocixvLGksbix0WzExXSwyMiwtMTk5MDQwNDE2Miksbj1pZShuLHIsbyxpLHRbMTJdLDcsMTgwNDYwMzY4MiksaT1pZShpLG4scixvLHRbMTNdLDEyLC00MDM0MTEwMSksbz1pZShvLGksbixyLHRbMTRdLDE3LC0xNTAyMDAyMjkwKSxuPXNlKG4scj1pZShyLG8saSxuLHRbMTVdLDIyLDEyMzY1MzUzMjkpLG8saSx0WzFdLDUsLTE2NTc5NjUxMCksaT1zZShpLG4scixvLHRbNl0sOSwtMTA2OTUwMTYzMiksbz1zZShvLGksbixyLHRbMTFdLDE0LDY0MzcxNzcxMykscj1zZShyLG8saSxuLHRbMF0sMjAsLTM3Mzg5NzMwMiksbj1zZShuLHIsbyxpLHRbNV0sNSwtNzAxNTU4NjkxKSxpPXNlKGksbixyLG8sdFsxMF0sOSwzODAxNjA4Myksbz1zZShvLGksbixyLHRbMTVdLDE0LC02NjA0NzgzMzUpLHI9c2UocixvLGksbix0WzRdLDIwLC00MDU1Mzc4NDgpLG49c2UobixyLG8saSx0WzldLDUsNTY4NDQ2NDM4KSxpPXNlKGksbixyLG8sdFsxNF0sOSwtMTAxOTgwMzY5MCksbz1zZShvLGksbixyLHRbM10sMTQsLTE4NzM2Mzk2MSkscj1zZShyLG8saSxuLHRbOF0sMjAsMTE2MzUzMTUwMSksbj1zZShuLHIsbyxpLHRbMTNdLDUsLTE0NDQ2ODE0NjcpLGk9c2UoaSxuLHIsbyx0WzJdLDksLTUxNDAzNzg0KSxvPXNlKG8saSxuLHIsdFs3XSwxNCwxNzM1MzI4NDczKSxuPWFlKG4scj1zZShyLG8saSxuLHRbMTJdLDIwLC0xOTI2NjA3NzM0KSxvLGksdFs1XSw0LC0zNzg1NTgpLGk9YWUoaSxuLHIsbyx0WzhdLDExLC0yMDIyNTc0NDYzKSxvPWFlKG8saSxuLHIsdFsxMV0sMTYsMTgzOTAzMDU2Mikscj1hZShyLG8saSxuLHRbMTRdLDIzLC0zNTMwOTU1Niksbj1hZShuLHIsbyxpLHRbMV0sNCwtMTUzMDk5MjA2MCksaT1hZShpLG4scixvLHRbNF0sMTEsMTI3Mjg5MzM1Myksbz1hZShvLGksbixyLHRbN10sMTYsLTE1NTQ5NzYzMikscj1hZShyLG8saSxuLHRbMTBdLDIzLC0xMDk0NzMwNjQwKSxuPWFlKG4scixvLGksdFsxM10sNCw2ODEyNzkxNzQpLGk9YWUoaSxuLHIsbyx0WzBdLDExLC0zNTg1MzcyMjIpLG89YWUobyxpLG4scix0WzNdLDE2LC03MjI1MjE5NzkpLHI9YWUocixvLGksbix0WzZdLDIzLDc2MDI5MTg5KSxuPWFlKG4scixvLGksdFs5XSw0LC02NDAzNjQ0ODcpLGk9YWUoaSxuLHIsbyx0WzEyXSwxMSwtNDIxODE1ODM1KSxvPWFlKG8saSxuLHIsdFsxNV0sMTYsNTMwNzQyNTIwKSxuPWNlKG4scj1hZShyLG8saSxuLHRbMl0sMjMsLTk5NTMzODY1MSksbyxpLHRbMF0sNiwtMTk4NjMwODQ0KSxpPWNlKGksbixyLG8sdFs3XSwxMCwxMTI2ODkxNDE1KSxvPWNlKG8saSxuLHIsdFsxNF0sMTUsLTE0MTYzNTQ5MDUpLHI9Y2UocixvLGksbix0WzVdLDIxLC01NzQzNDA1NSksbj1jZShuLHIsbyxpLHRbMTJdLDYsMTcwMDQ4NTU3MSksaT1jZShpLG4scixvLHRbM10sMTAsLTE4OTQ5ODY2MDYpLG89Y2UobyxpLG4scix0WzEwXSwxNSwtMTA1MTUyMykscj1jZShyLG8saSxuLHRbMV0sMjEsLTIwNTQ5MjI3OTkpLG49Y2UobixyLG8saSx0WzhdLDYsMTg3MzMxMzM1OSksaT1jZShpLG4scixvLHRbMTVdLDEwLC0zMDYxMTc0NCksbz1jZShvLGksbixyLHRbNl0sMTUsLTE1NjAxOTgzODApLHI9Y2UocixvLGksbix0WzEzXSwyMSwxMzA5MTUxNjQ5KSxuPWNlKG4scixvLGksdFs0XSw2LC0xNDU1MjMwNzApLGk9Y2UoaSxuLHIsbyx0WzExXSwxMCwtMTEyMDIxMDM3OSksbz1jZShvLGksbixyLHRbMl0sMTUsNzE4Nzg3MjU5KSxyPWNlKHIsbyxpLG4sdFs5XSwyMSwtMzQzNDg1NTUxKSxlWzBdPXBlKG4sZVswXSksZVsxXT1wZShyLGVbMV0pLGVbMl09cGUobyxlWzJdKSxlWzNdPXBlKGksZVszXSl9ZnVuY3Rpb24gb2UoZSx0LG4scixvLGkpe3JldHVybiB0PXBlKHBlKHQsZSkscGUocixpKSkscGUodDw8b3x0Pj4+MzItbyxuKX1mdW5jdGlvbiBpZShlLHQsbixyLG8saSxzKXtyZXR1cm4gb2UodCZufH50JnIsZSx0LG8saSxzKX1mdW5jdGlvbiBzZShlLHQsbixyLG8saSxzKXtyZXR1cm4gb2UodCZyfG4mfnIsZSx0LG8saSxzKX1mdW5jdGlvbiBhZShlLHQsbixyLG8saSxzKXtyZXR1cm4gb2UodF5uXnIsZSx0LG8saSxzKX1mdW5jdGlvbiBjZShlLHQsbixyLG8saSxzKXtyZXR1cm4gb2Uobl4odHx+ciksZSx0LG8saSxzKX1mdW5jdGlvbiB1ZShlKXt2YXIgdCxuPVtdO2Zvcih0PTA7dDw2NDt0Kz00KW5bdD4+Ml09ZS5jaGFyQ29kZUF0KHQpKyhlLmNoYXJDb2RlQXQodCsxKTw8OCkrKGUuY2hhckNvZGVBdCh0KzIpPDwxNikrKGUuY2hhckNvZGVBdCh0KzMpPDwyNCk7cmV0dXJuIG59ZnVuY3Rpb24gcGUoZSx0KXtyZXR1cm4gZSt0JjQyOTQ5NjcyOTV9dmFyIGxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3AodGhpcyxlKSx0aGlzLl92YWx1ZXM9dm9pZCAwLHRoaXMuX3ZhbHVlcz17ZXVjb25zZW50OiIiLG5vbklhYlZlbmRvckNvbnNlbnQ6IiIsbm9uSWFiVmVuZG9yc0hhc2g6IiIsZmV0Y2hlZDohMSxwcm9taXNlOlByb21pc2UucmVzb2x2ZSgpfX1yZXR1cm4gZChlLFt7a2V5OiJ2YWx1ZXMiLHNldDpmdW5jdGlvbihlKXt0aGlzLl92YWx1ZXM9ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlc319XSksZX0oKTtmdW5jdGlvbiBkZShlLHQsbixyKXt2YXIgbz1uJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuKTtyZXR1cm4gb3x8KG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKSx0JiYoby5jbGFzc05hbWU9dCksbiYmKG8uaWQ9biksciYmci5pbnNlcnRCZWZvcmUobyxyLmZpcnN0Q2hpbGQpKSxvfXZhciBmZT1mdW5jdGlvbihlKXt2YXIgdD1lLmNvcmVDb25maWcsbj10LnB1Ymxpc2hlckZlYXR1cmVzSWRzLHI9dC5wdWJsaXNoZXJTcGVjaWFsRmVhdHVyZXNJZHMsbz10LnB1Ymxpc2hlclNwZWNpYWxQdXJwb3Nlc0lkcyxpPXQucHVibGlzaGVyUHVycG9zZUlkcyxzPXQucHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyxhPXQudmVuZG9yUHVycG9zZUlkcyxjPXQudmVuZG9yUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyx1PXQudmVuZG9yU3BlY2lhbEZlYXR1cmVzSWRzLHA9dC52ZW5kb3JTcGVjaWFsUHVycG9zZXNJZHMsbD10LnZlbmRvckZlYXR1cmVzSWRzLGQ9W24scixvLGkscyxhLGMsdSxwLGxdLGY9KGF8fFtdKS5sZW5ndGg7cmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdDsodD1lKSYmdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pfSkse3B1cnBvc2VJZHM6KGY/YTppKXx8W10scHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkczooZj9jOnMpfHxbXSxzcGVjaWFsRmVhdHVyZXNJZHM6KGY/dTpyKXx8W10sc3BlY2lhbFB1cnBvc2VzSWRzOihmP3A6byl8fFtdLGZlYXR1cmVzSWRzOihmP2w6bil8fFtdfX0saGU9ZnVuY3Rpb24oZSl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLHI9IiIuY29uY2F0KGVbMF0sIn4iKSxvPWUubWF0Y2goL1xkKy9nKTtpZihvLnNoaWZ0KCksbilyZXR1cm4iIi5jb25jYXQocikuY29uY2F0KG51bGw9PT1vfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmpvaW4oIi4iKSk7dmFyIGk9bnVsbD09PW98fHZvaWQgMD09PW8/dm9pZCAwOm8ucmVkdWNlKGZ1bmN0aW9uKGUsbixyLG8pe2lmKDA9PT1yKXJldHVybiB0PXBhcnNlSW50KG4sMTApLGUuY29uY2F0KG4pO3ZhciBpPW9bcl0/cGFyc2VJbnQobiwxMCkrdDpudWxsO3JldHVybiB0PWksaT9lLmNvbmNhdCgiLiIuY29uY2F0KGkpKTplfSxyKTtyZXR1cm4gaX07ZnVuY3Rpb24gdmUoZSx0KXtyZXR1cm4gdCYmInN0cmluZyI9PT10eXBlb2YgdD9lKHQpOm51bGx9dmFyIHllLGdlLG1lLGJlLENlLF9lLEVlLFNlLEllLExlLFBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3AodGhpcyxlKSx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuX3JlcHJvbXB0T3B0aW9uc0hhc2g9dm9pZCAwLHRoaXMuX3N0b3JlZEhhc2g9dm9pZCAwLHRoaXMuZGF0YT1uZXcgbGUsdGhpcy5fcmVwcm9tcHRPcHRpb25zSGFzaD0iIix0aGlzLl9zdG9yZWRIYXNoPSIifXJldHVybiBkKGUsW3trZXk6InNob3VsZFJlcHJvbXB0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2VuZXJhdGVSZXByb21wdE9wdGlvbnNIYXNoKCksdD0hMTtyZXR1cm4gdGhpcy5fc3RvcmVkSGFzaCE9PWUmJih0PSEwKSx0fX0se2tleToiZ2VuZXJhdGVSZXByb21wdE9wdGlvbnNIYXNoIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGF0YS52YWx1ZXMsdD1lLmV1Y29uc2VudCxuPWUubm9uSWFiVmVuZG9yQ29uc2VudCxyPWUubm9uSWFiVmVuZG9yc0hhc2gsbz1OZS5jb3JlQ29uZmlnLGk9by5zdGFja3Mscz1vLmluaXRTY3JlZW5Cb2R5VGV4dE9wdGlvbixhPU5lLnByZW1pdW1Qcm9wZXJ0aWVzLGM9YS52ZW5kb3JXaGl0ZWxpc3QsdT1hLnZlbmRvckJsYWNrbGlzdCxwPWZlKE5lKSxsPXAucHVycG9zZUlkcyxkPXAucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyxmPXAuc3BlY2lhbEZlYXR1cmVzSWRzLGg9cC5zcGVjaWFsUHVycG9zZXNJZHMsdj1wLmZlYXR1cmVzSWRzLHk9dGhpcy5jcmVhdGVOZXdIYXNoKFtpLGwsZCxmLGgsdixjLHVdKSxnPXQ7cmV0dXJuIGc9IiIuY29uY2F0KGcsIi4iKS5jb25jYXQocywiLiIpLmNvbmNhdCh5KSxnPW4/IiIuY29uY2F0KGcsIi4iKS5jb25jYXQobik6ZyxnPXI/IiIuY29uY2F0KGcsIi4iKS5jb25jYXQocik6Zyx0aGlzLl9yZXByb21wdE9wdGlvbnNIYXNoPWd9fSx7a2V5OiJjcmVhdGVOZXdIYXNoIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZWUoZSl9fSx7a2V5OiJzZXRWYWx1ZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuZGF0YS52YWx1ZXM9ZX19LHtrZXk6ImdldFZhbHVlcyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLnZhbHVlc319LHtrZXk6InN0b3JlZEhhc2giLHNldDpmdW5jdGlvbihlKXt0aGlzLl9zdG9yZWRIYXNoPWV9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdG9yZWRIYXNofX1dKSxlfSgpLHdlPW4oMjEpLEFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3AodGhpcyxlKSx0aGlzLkxPV0VSQ0FTRV9TVEFSVD05Nyx0aGlzLlBBRF9aRVJPUz0iMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLHRoaXMuQ09PS0lFX01BWF9BR0U9MzM2OTZlMyx0aGlzLmJpdFNpemVzPXtjbXBJZDoxMixjcmVhdGVkOjM2LGNvbnNlbnRTY3JlZW46Nixjb25zZW50TGFuZ3VhZ2U6MTIsY21wVmVyc2lvbjoxMixjbXBWZXJzaW9uT2xkOjYsY29uc2VudFZhbHVlOjEsZGVmYXVsdENvbnNlbnQ6MSxlbmRWZW5kb3JJZDoxNixlbmNvZGluZ1R5cGU6MSxpc1JhbmdlOjEsbGFzdFVwZGF0ZWQ6MzYsbWF4VmVuZG9ySWQ6MTYsbnVtYmVyQ3VzdG9tUHVycG9zZXM6NixudW1FbnRyaWVzOjEyLHB1Ymxpc2hlclB1cnBvc2VzVmVyc2lvbjoxMixwdXJwb3Nlc0Fsb3dlZDoyNCxzdGFuZGFyZFB1cnBvc2VzQWxsb3dlZDoyNCxzdGFydFZlbmRvcklkOjE2LHZlcnNpb246Nix2ZW5kb3JMaXN0VmVyc2lvbjoxMn0sdGhpcy5fYmluYXJ5U3RyPXZvaWQgMCx0aGlzLl9iaXRQb3NpdGlvbj12b2lkIDAsdGhpcy5UQ1N0cmluZz12b2lkIDAsdGhpcy5fYmluYXJ5U3RyPSIiLHRoaXMuX2JpdFBvc2l0aW9uPTAsdGhpcy5UQ1N0cmluZz1uZXcgd2UuVENTdHJpbmd9cmV0dXJuIGQoZSxbe2tleToiZW5jb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI7c3dpdGNoKGUuY29va2llTmFtZSl7Y2FzZSBUOm49ZHQoWyJjb29raWVOYW1lIiwiY3JlYXRlZCIsImxhc3RVcGRhdGVkIiwiY21wSWQiLCJjbXBWZXJzaW9uIiwibWF4VmVuZG9ySWQiLCJ2ZW5kb3JDb25zZW50cyJdLGUpLHI9Im5vbklhYlZlbmRvclRvQmluYXJ5IjticmVhaztjYXNlIFY6bj1kdChbImNvb2tpZU5hbWUiLCJwdWJsaXNoZXJQdXJwb3Nlc1ZlcnNpb24iLCJzdGFuZGFyZFB1cnBvc2VzQWxsb3dlZCIsIm51bWJlckN1c3RvbVB1cnBvc2VzIiwidmVyc2lvbiIsImNyZWF0ZWQiLCJsYXN0VXBkYXRlZCIsImNtcElkIiwiY21wVmVyc2lvbiIsImNvbnNlbnRTY3JlZW4iLCJjb25zZW50TGFuZ3VhZ2UiLCJ2ZW5kb3JMaXN0VmVyc2lvbiIsImN1c3RvbVB1cnBvc2VDb25zZW50cyJdLGUpLHI9InB1Ymxpc2hlckNvbnNlbnRUb0JpbmFyeSI7YnJlYWs7Y2FzZSBPOm49ZHQoWyJjb29raWVOYW1lIiwidmVuZG9yQ29uc2VudHMiLCJwdXJwb3NlQ29uc2VudHMiLCJzcGVjaWFsRmVhdHVyZU9wdGlucyIsInB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzIiwidmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyIsInB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzIiwicHVibGlzaGVyQ29uc2VudCIsInB1Ymxpc2hlckxlZ2l0aW1hdGUiLCJwdWJsaXNoZXJQdXJwb3NlSWRzIiwicHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyJdLGUpLHI9ImVuY29kZUV1Q29uc2VudCI7YnJlYWs7Y2FzZSBVOm49ZHQoWyJjb29raWVOYW1lIiwidmVuZG9yQ29uc2VudHMiLCJ2ZXJzaW9uIl0sZSkscj0iZW5jb2RlR29vZ2xlQ29uc2VudCJ9aWYociYmbil7aWYobi5ub3RGb3VuZClyZXR1cm4gbmV3IEVycm9yKCIiLmNvbmNhdChuLm5vdEZvdW5kLCIga2V5cyBub3QgZm91bmQiKSk7aWYoci5pbmNsdWRlcygiVG9CaW5hcnkiKSl7dmFyIG89dGhpc1tyXSh7dmVyaWZpZWRPYmplY3Q6bixtZXRhZGF0YU9ubHk6dH0pLGk9dGhpcy5iaW5hcnlUb0J5dGVzKG8pO3JldHVybiB0aGlzLnRvV2ViU2FmZUJhc2U2NChpKX1yZXR1cm4gdGhpc1tyXShuKX1yZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkIGNvb2tpZSBuYW1lIil9fSx7a2V5OiJkZWNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7c3dpdGNoKGUpe2Nhc2UgVDpuPSJkZWNvZGVOb25JYWJWZW5kb3JCaW5hcnkiO2JyZWFrO2Nhc2UgVjpuPSJkZWNvZGVQdWJsaXNoZXJCaW5hcnkiO2JyZWFrO2Nhc2UgTzpuPSJkZWNvZGVFdUNvbnNlbnQiO2JyZWFrO2Nhc2UgVTpuPSJkZWNvZGVHb29nbGVDb25zZW50In1pZihuKXtpZihuLmluY2x1ZGVzKCJCaW5hcnkiKSl7dmFyIHI9dGhpcy5mcm9tV2ViU2FmZUJhc2U2NCh0KSxvPXRoaXMuYnl0ZXNUb0JpbmFyeShyKTtyZXR1cm4gdGhpc1tuXShvKX1yZXR1cm4gdGhpc1tuXSh0KX1yZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkIGNvb2tpZSBuYW1lIil9fSx7a2V5OiJhZGRCaW5hcnlGaWVsZCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPShlfHwwKS50b1N0cmluZygyKTtpZighKHIubGVuZ3RoPD10KSl0aHJvdyBuZXcgRXJyb3IoIkVuY291bnRlcmVkIGFuIG92ZXJmbG93IHNldHRpbmcgY29va2llIGZpZWxkICIuY29uY2F0KG4pKTtyPXRoaXMuUEFEX1pFUk9TLnN1YnN0cigwLHQtci5sZW5ndGgpK3IsdGhpcy5iaW5hcnlTdHIrPXJ9fSx7a2V5OiJlbmNvZGVHb29nbGVDb25zZW50Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iIi5jb25jYXQoZS52ZXJzaW9uLCJ+Iik7cmV0dXJuIE5lLmNvcmVDb25maWcuaXNBTVA/IiIuY29uY2F0KHQpLmNvbmNhdChlLnZlbmRvckNvbnNlbnRzLmpvaW4oIi4iKSk6ZS52ZW5kb3JDb25zZW50cy5yZWR1Y2UoZnVuY3Rpb24oZSx0LG4scil7aWYoMD09PW4pcmV0dXJuIGUuY29uY2F0KHQpO3ZhciBvPXJbbl0/dC1yW24tMV06bnVsbDtyZXR1cm4gbz9lLmNvbmNhdCgiLiIuY29uY2F0KG8pKTplfSx0KX19LHtrZXk6ImRlY29kZUdvb2dsZUNvbnNlbnQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnVsbD09PSh0PWhlKGUsTmUuY29yZUNvbmZpZy5pc0FNUCkubWF0Y2goL1xkKy9nKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKX0pO3JldHVybnt2ZXJzaW9uOm51bGw9PT1ufHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnNoaWZ0KCksY29uc2VudElkczpufX19LHtrZXk6ImVuY29kZUV1Q29uc2VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9aSh7fSxlLnZlbmRvckNvbnNlbnRzKSxuPWkoe30sZS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzKTtlLnZlbmRvckNvbnNlbnRzPXQsZS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzPW47dmFyIG89ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIGVbdF0pZVt0XVtuXT9XZVt0XS5zZXQocGFyc2VJbnQobikpOldlW3RdLnVuc2V0KHBhcnNlSW50KG4pKX07cmV0dXJuW3t2YWx1ZTplLnB1Ymxpc2hlckNvbnNlbnQsdGNNb2RlbE5hbWU6InB1Ymxpc2hlckNvbnNlbnRzIixyZWR1Y2VBcnJheTplLnB1Ymxpc2hlclB1cnBvc2VJZHN9LHt2YWx1ZTplLnB1Ymxpc2hlckxlZ2l0aW1hdGUsdGNNb2RlbE5hbWU6InB1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMiLHJlZHVjZUFycmF5OmUucHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkc31dLmZvckVhY2goZnVuY3Rpb24odCl7dm9pZCAwIT09dC52YWx1ZSYmKGVbdC50Y01vZGVsTmFtZV09dC5yZWR1Y2VBcnJheS5yZWR1Y2UoZnVuY3Rpb24oZSxuKXtyZXR1cm4gaShpKHt9LGUpLHt9LHIoe30sbix0LnZhbHVlKSl9LHt9KSl9KSxvKCJ2ZW5kb3JDb25zZW50cyIpLG8oInB1cnBvc2VDb25zZW50cyIpLG8oInNwZWNpYWxGZWF0dXJlT3B0aW5zIiksbygidmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyIpLG8oInB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzIiksbygicHVibGlzaGVyQ29uc2VudHMiKSxvKCJwdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzIikseXQoV2UpfX0se2tleToiZGVjb2RlRXVDb25zZW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZ3QoZSl9fSx7a2V5OiJub25JYWJWZW5kb3JUb0JpbmFyeSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52ZXJpZmllZE9iamVjdCxuPWUubWV0YWRhdGFPbmx5O2lmKHRoaXMuYmluYXJ5U3RyPSIiLHRoaXMuYWRkQmluYXJ5RmllbGQocHQodC5jcmVhdGVkKSx0aGlzLmJpdFNpemVzLmNyZWF0ZWQsImNyZWF0ZWQiKSx0aGlzLmFkZEJpbmFyeUZpZWxkKHB0KHQubGFzdFVwZGF0ZWQpLHRoaXMuYml0U2l6ZXMubGFzdFVwZGF0ZWQsImxhc3RVcGRhdGVkIiksdGhpcy5hZGRCaW5hcnlGaWVsZCh0LmNtcElkLHRoaXMuYml0U2l6ZXMuY21wSWQsImNtcElkIiksdGhpcy5hZGRCaW5hcnlGaWVsZCh0LmNtcFZlcnNpb24sdGhpcy5iaXRTaXplcy5jbXBWZXJzaW9uLCJjbXBWZXJzaW9uIiksbilyZXR1cm4gdGhpcy5iaW5hcnlTdHI7dGhpcy5hZGRCaW5hcnlGaWVsZCh0Lm1heFZlbmRvcklkLHRoaXMuYml0U2l6ZXMubWF4VmVuZG9ySWQsIm1heFZlbmRvcklkIik7Zm9yKHZhciByPTE7cjw9dC5tYXhWZW5kb3JJZDtyKyspdGhpcy5iaW5hcnlTdHIrPXQudmVuZG9yQ29uc2VudHNbcl0/IjEiOiIwIjtyZXR1cm4gdGhpcy5iaW5hcnlTdHJ9fSx7a2V5OiJkZWNvZGVOb25JYWJWZW5kb3JCaW5hcnkiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYml0UG9zaXRpb249MDtmb3IodmFyIHQ9e2NyZWF0ZWQ6bHQodGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMuY3JlYXRlZCxlKSksbGFzdFVwZGF0ZWQ6bHQodGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMubGFzdFVwZGF0ZWQsZSkpLGNtcElkOnRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNtcElkLGUpLGNtcFZlcnNpb246dGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMuY21wVmVyc2lvbixlKSxtYXhWZW5kb3JJZDp0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5tYXhWZW5kb3JJZCxlKSx2ZW5kb3JDb25zZW50czpbdm9pZCAwXX0sbj10Lm1heFZlbmRvcklkfHwxLHI9bmV3IEFycmF5KG4pLG89MDtvPHQubWF4VmVuZG9ySWQ7bysrKXJbbysxXT0iMSI9PT1lLmNoYXJBdCh0aGlzLl9iaXRQb3NpdGlvbitvKTtyZXR1cm4gdC52ZW5kb3JDb25zZW50cz1yLHR9fSx7a2V5OiJwdWJsaXNoZXJDb25zZW50VG9CaW5hcnkiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudmVyaWZpZWRPYmplY3Qsbj1lLm1ldGFkYXRhT25seTtpZih0aGlzLmJpbmFyeVN0cj0iIiwyIT09dC52ZXJzaW9uKXRocm93IG5ldyBFcnJvcigidmVyc2lvbiAiK3QudmVyc2lvbisiIG5vdCBzdXBwb3J0ZWQiKTtpZih0aGlzLmFkZEJpbmFyeUZpZWxkKHQudmVyc2lvbix0aGlzLmJpdFNpemVzLnZlcnNpb24sInZlcnNpb24iKSx0aGlzLmFkZEJpbmFyeUZpZWxkKHB0KHQuY3JlYXRlZCksdGhpcy5iaXRTaXplcy5jcmVhdGVkLCJjcmVhdGVkIiksdGhpcy5hZGRCaW5hcnlGaWVsZChwdCh0Lmxhc3RVcGRhdGVkKSx0aGlzLmJpdFNpemVzLmxhc3RVcGRhdGVkLCJsYXN0VXBkYXRlZCIpLHRoaXMuYWRkQmluYXJ5RmllbGQodC5jbXBJZCx0aGlzLmJpdFNpemVzLmNtcElkLCJjbXBJZCIpLHRoaXMuYWRkQmluYXJ5RmllbGQodC5jbXBWZXJzaW9uLHRoaXMuYml0U2l6ZXMuY21wVmVyc2lvbiwiY21wVmVyc2lvbiIpLHRoaXMuYWRkQmluYXJ5RmllbGQodC5jb25zZW50U2NyZWVuLHRoaXMuYml0U2l6ZXMuY29uc2VudFNjcmVlbiwiY29uc2VudFNjcmVlbiIpLHRoaXMuYWRkQmluYXJ5RmllbGQodGhpcy5sYW5ndWFnZVRvQ29va2llVmFsdWUodC5jb25zZW50TGFuZ3VhZ2UpLHRoaXMuYml0U2l6ZXMuY29uc2VudExhbmd1YWdlLCJjb25zZW50TGFuZ3VhZ2UiKSx0aGlzLmFkZEJpbmFyeUZpZWxkKHQudmVuZG9yTGlzdFZlcnNpb24sdGhpcy5iaXRTaXplcy52ZW5kb3JMaXN0VmVyc2lvbiwidmVuZG9yTGlzdFZlcnNpb24iKSx0aGlzLmFkZEJpbmFyeUZpZWxkKHQucHVibGlzaGVyUHVycG9zZXNWZXJzaW9uLHRoaXMuYml0U2l6ZXMucHVibGlzaGVyUHVycG9zZXNWZXJzaW9uLCJwdWJsaXNoZXJQdXJwb3Nlc1ZlcnNpb24iKSxuKXJldHVybiB0aGlzLmJpbmFyeVN0cjt0aGlzLmFkZEJpbmFyeUZpZWxkKHQuc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQsdGhpcy5iaXRTaXplcy5zdGFuZGFyZFB1cnBvc2VzQWxsb3dlZCwic3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQiKSx0aGlzLmFkZEJpbmFyeUZpZWxkKHQubnVtYmVyQ3VzdG9tUHVycG9zZXMsdGhpcy5iaXRTaXplcy5udW1iZXJDdXN0b21QdXJwb3NlcywibnVtYmVyQ3VzdG9tUHVycG9zZXMiKTtmb3IodmFyIHI9MTtyPD10Lm51bWJlckN1c3RvbVB1cnBvc2VzO3IrKyl0aGlzLmJpbmFyeVN0cis9dC5jdXN0b21QdXJwb3NlQ29uc2VudHNbcl0/IjEiOiIwIjtyZXR1cm4gdGhpcy5iaW5hcnlTdHJ9fSx7a2V5OiJkZWNvZGVQdWJsaXNoZXJCaW5hcnkiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYml0UG9zaXRpb249MDtmb3IodmFyIHQ9e3ZlcnNpb246dGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMudmVyc2lvbixlKSxjcmVhdGVkOmx0KHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNyZWF0ZWQsZSkpLGxhc3RVcGRhdGVkOmx0KHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmxhc3RVcGRhdGVkLGUpKSxjbXBJZDp0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jbXBJZCxlKSxjbXBWZXJzaW9uOnRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNtcFZlcnNpb24sZSksY29uc2VudFNjcmVlbjp0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jb25zZW50U2NyZWVuLGUpLGNvbnNlbnRMYW5ndWFnZTp0aGlzLmxhbmd1YWdlRnJvbUNvb2tpZVZhbHVlKHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNvbnNlbnRMYW5ndWFnZSxlKSksdmVuZG9yTGlzdFZlcnNpb246dGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMudmVuZG9yTGlzdFZlcnNpb24sZSkscHVibGlzaGVyUHVycG9zZXNWZXJzaW9uOnRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLnB1Ymxpc2hlclB1cnBvc2VzVmVyc2lvbixlKSxzdGFuZGFyZFB1cnBvc2VzQWxsb3dlZDp0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5zdGFuZGFyZFB1cnBvc2VzQWxsb3dlZCxlKSxudW1iZXJDdXN0b21QdXJwb3Nlczp0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5udW1iZXJDdXN0b21QdXJwb3NlcyxlKSxjdXN0b21QdXJwb3NlQ29uc2VudHM6W3ZvaWQgMF19LG49bmV3IEFycmF5KHQubnVtYmVyQ3VzdG9tUHVycG9zZXMrMSkscj0wO3I8dC5udW1iZXJDdXN0b21QdXJwb3NlcztyKyspbltyKzFdPSIxIj09PWUuY2hhckF0KHRoaXMuX2JpdFBvc2l0aW9uK3IpO3JldHVybiB0LmN1c3RvbVB1cnBvc2VDb25zZW50cz1uLHR9fSx7a2V5OiJiaW5hcnlUb0J5dGVzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0iIjtlKz10aGlzLlBBRF9aRVJPUy5zdWJzdHIoMCw3LShlLmxlbmd0aCs3KSU4KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rPTgpdCs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLnN1YnN0cihuLDgpLDIpKTtyZXR1cm4gdH19LHtrZXk6ImJ5dGVzVG9CaW5hcnkiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIixuPTA7bjxlLmxlbmd0aDtuKyspdCs9dGhpcy5iaW5hcnk4Qml0cyhlLmNoYXJDb2RlQXQobikpO3JldHVybiB0fX0se2tleToiYmluYXJ5OEJpdHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PVsiMDAwMCIsIjAwMDEiLCIwMDEwIiwiMDAxMSIsIjAxMDAiLCIwMTAxIiwiMDExMCIsIjAxMTEiLCIxMDAwIiwiMTAwMSIsIjEwMTAiLCIxMDExIiwiMTEwMCIsIjExMDEiLCIxMTEwIiwiMTExMSJdO3JldHVybiB0W2U+Pj40JjE1XSt0WzE1JmVdfX0se2tleToiZ2V0Qml0cyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1wYXJzZUludCh0LnN1YnN0cih0aGlzLmJpdFBvc2l0aW9uLGUpLDIpO3JldHVybiB0aGlzLmJpdFBvc2l0aW9uKz1lLG59fSx7a2V5OiJ0b1dlYlNhZmVCYXNlNjQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBidG9hKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPSskLywiIil9fSx7a2V5OiJmcm9tV2ViU2FmZUJhc2U2NCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGF0b2IoZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKSl9fSx7a2V5OiJsYW5ndWFnZVRvQ29va2llVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiA2NCooZS5jaGFyQ29kZUF0KDApLXRoaXMuTE9XRVJDQVNFX1NUQVJUKSsoZS5jaGFyQ29kZUF0KDEpLXRoaXMuTE9XRVJDQVNFX1NUQVJUKX19LHtrZXk6Imxhbmd1YWdlRnJvbUNvb2tpZVZhbHVlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLkxPV0VSQ0FTRV9TVEFSVCtlLzY0Pj4+MCkrU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLkxPV0VSQ0FTRV9TVEFSVCtlJTY0KX19LHtrZXk6ImRlbGV0ZUNvb2tpZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtkb2N1bWVudC5jb29raWU9IiIuY29uY2F0KGUsIj07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgbWF4LWFnZT0tMTsgZG9tYWluPSIpLmNvbmNhdCh0KX19LHtrZXk6ImZhbGxiYWNrVG9Mb2NhbFN0b3JhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5zYXZlT25Mb2NhbFN0b3JhZ2UoZSx0KSYmdGhpcy5kZWxldGVDb29raWUoZSl9fSx7a2V5OiJzYXZlT25Mb2NhbFN0b3JhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSx0KSwhMH1jYXRjaChuKXtyZXR1cm4gY29uc29sZS53YXJuKCJDb3VsZCBub3Qgc2F2ZSBkYXRhIG9uIGxvY2FsIHN0b3JhZ2U6IE5vdCBlbm91Z2ggc3BhY2UuIiksITF9fX0se2tleToic2V0Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl0scj0hMTtuJiYocj10aGlzLnNhdmVPbkxvY2FsU3RvcmFnZShlLHQpKSxyfHx2dCh7Y29va2llTmFtZTplLGVuY29kZWRWYWx1ZTp0LG1heEFnZTp0aGlzLkNPT0tJRV9NQVhfQUdFfSl9fSx7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKSlyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpO3ZhciB0PWUudHJpbSgpLG49ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7IikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKS5zdGFydHNXaXRoKHQrIj0iKX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50cmltKCkuc3Vic3RyaW5nKHQubGVuZ3RoKzEpfSk7aWYobi5sZW5ndGgpe3ZhciByPSIiO3JldHVybiByPWU9PT1PP2J0KG4pOm5bMF0sZSE9PU8mJmUhPT1SJiZlIT09VSYmdGhpcy5mYWxsYmFja1RvTG9jYWxTdG9yYWdlKHQscikscn1yZXR1cm4gbmV3IEVycm9yKCIiLmNvbmNhdChlLCIgbm90IGZvdW5kLiIpKX19LHtrZXk6ImJpdFBvc2l0aW9uIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0UG9zaXRpb259LHNldDpmdW5jdGlvbihlKXt0aGlzLl9iaXRQb3NpdGlvbj1lfX0se2tleToiYmluYXJ5U3RyIixzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fYmluYXJ5U3RyPWV9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9iaW5hcnlTdHJ9fV0pLGV9KCk7ZnVuY3Rpb24ga2UoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBPZShlLHQpe2lmKGUpe2lmKCJzdHJpbmciPT09dHlwZW9mIGUpcmV0dXJuIGtlKGUsdCk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKG4pOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/a2UoZSx0KTp2b2lkIDB9fWZ1bmN0aW9uIFRlKGUpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIFN5bWJvbHx8bnVsbD09ZVtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1PZShlKSkpe3ZhciB0PTAsbj1mdW5jdGlvbigpe307cmV0dXJue3M6bixuOmZ1bmN0aW9uKCl7cmV0dXJuIHQ+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3QrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6bn19dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciByLG8saT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7cj1lW1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbigpe3ZhciBlPXIubmV4dCgpO3JldHVybiBpPWUuZG9uZSxlfSxlOmZ1bmN0aW9uKGUpe3M9ITAsbz1lfSxmOmZ1bmN0aW9uKCl7dHJ5e2l8fG51bGw9PXIucmV0dXJufHxyLnJldHVybigpfWZpbmFsbHl7aWYocyl0aHJvdyBvfX19fWZ1bmN0aW9uIFZlKGUpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBrZShlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSlyZXR1cm4gQXJyYXkuZnJvbShlKX0oZSl8fE9lKGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIHhlKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9KGUpfHxmdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSl7dmFyIG49W10scj0hMCxvPSExLGk9dm9pZCAwO3RyeXtmb3IodmFyIHMsYT1lW1N5bWJvbC5pdGVyYXRvcl0oKTshKHI9KHM9YS5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKHMudmFsdWUpLCF0fHxuLmxlbmd0aCE9PXQpO3I9ITApO31jYXRjaChjKXtvPSEwLGk9Y31maW5hbGx5e3RyeXtyfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKG8pdGhyb3cgaX19cmV0dXJuIG59fShlLHQpfHxPZShlLHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9IWZ1bmN0aW9uKGUpe2UuR09fVE9fUEFHRT0iZ29Ub1BhZ2UiLGUuUFVSUE9TRT0icHVycG9zZSIsZS5MRUdJVElNQVRFX1BVUlBPU0U9ImxlZ2l0aW1hdGVQdXJwb3NlIixlLkxFR0lUSU1BVEVfVkVORE9SPSJsZWdpdGltYXRlVmVuZG9yIixlLlNQRUNJQUxfRkVBVFVSRT0ic3BlY2lhbEZlYXR1cmUiLGUuU1RBQ0s9InN0YWNrIixlLlBBUlRJQUxfQ09OU0VOVD0icGFydGlhbCIsZS5TQVZFX0FORF9FWElUPSJzYXZlQW5kRXhpdCIsZS5BQ0NFUFRfQUxMPSJhY2NlcHRBbGwiLGUuUkVKRUNUX0FMTD0icmVqZWN0QWxsIixlLkFDQ0VQVF9BTExfTEVHSVRJTUFURT0iYWNjZXB0QWxsTGVnaXRpbWF0ZSIsZS5PQkpFQ1RfQUxMX0xFR0lUSU1BVEU9Im9iamVjdEFsbExlZ2l0aW1hdGUiLGUuQUNDRVBUX0FMTF9WRU5ET1JTPSJhY2NlcHRBbGxWZW5kb3JzIixlLlJFSkVDVF9BTExfVkVORE9SUz0icmVqZWN0QWxsVmVuZG9ycyIsZS5BQ0NFUFRfQUxMX1BVUlBPU0VTPSJhY2NlcHRBbGxQdXJwb3NlcyIsZS5SRUpFQ1RfQUxMX1BVUlBPU0VTPSJyZWplY3RBbGxQdXJwb3NlcyIsZS5WRU5ET1I9InZlbmRvciIsZS5OT05fSUFCX1ZFTkRPUj0ibm9uSWFiVmVuZG9yIixlLkRJU01JU1NfVUk9ImRpc21pc3NVaSIsZS5TVEFSVF9PTl9QQUdFPSJzdGFydE9uUGFnZSIsZS5PUFRfT1VUX1RPR0dMRT0ib3B0T3V0VG9nZ2xlIixlLk9QVF9PVVRfQ09ORklSTT0ib3B0T3V0Q29uZmlybSIsZS5FWFBBTkRfRUxFTUVOVD0iZXhwYW5kRWxlbWVudCIsZS5DT0xMQVBTRV9FTEVNRU5UPSJjb2xsYXBzZUVsZW1lbnQiLGUuR09PR0xFPSJnb29nbGVQYXJ0bmVyIn0oeWV8fCh5ZT17fSkpLGZ1bmN0aW9uKGUpe2UuTUFOREFUT1JZPSJ0Y2Z1aTptYW5kYXRvcnkiLGUuQ0hBTkdFX09GX0NPTlNFTlQ9InRjZnVpOmNoYW5nZW9mY29uc2VudCIsZS5DQ1BBPSJ1c3B1aTpkb25vdHNlbGwifShnZXx8KGdlPXt9KSksZnVuY3Rpb24oZSl7ZS5GRUFUVVJFUz0iRmVhdHVyZXMiLGUuTk9OX0lBQj0iTm9uIElBQiIsZS5QVVJQT1NFUz0iUHVycG9zZXMiLGUuTEVHSVRJTUFURV9QVVJQT1NFUz0iTGVnaXRpbWF0ZSBQdXJwb3NlcyIsZS5MRUdJVElNQVRFX1ZFTkRPUlM9IkxlZ2l0aW1hdGUgVmVuZG9ycyIsZS5TUEVDSUFMX1BVUlBPU0VTPSJTcGVjaWFsIFB1cnBvc2VzIixlLlNQRUNJQUxfRkVBVFVSRVM9IlNwZWNpYWwgRmVhdHVyZXMiLGUuVkVORE9SUz0iVmVuZG9ycyIsZS5TVEFDS1M9IlN0YWNrcyIsZS5HT09HTEU9Ikdvb2dsZSJ9KG1lfHwobWU9e30pKSxmdW5jdGlvbihlKXtlLklOSVQ9ImluaXQiLGUuTkFWSUdBVElPTj0ibmF2aWdhdGlvbiIsZS5ET05FPSJkb25lIn0oYmV8fChiZT17fSkpLGZ1bmN0aW9uKGUpe2UuQUNDRVBUX0FMTD0iQWxsIixlLkFDQ0VQVF9QQVJUSUFMPSJQYXJ0aWFsIixlLlJFSkVDVD0iUmVqZWN0In0oQ2V8fChDZT17fSkpLGZ1bmN0aW9uKGUpe2UuTk9ORV9PQkpFQ1RFRD0iTm9uZSIsZS5BTExfT0JKRUNURUQ9IkFsbCJ9KF9lfHwoX2U9e30pKSxmdW5jdGlvbihlKXtlLlNUQUNLUz0ic3RhY2tzIixlLlZFTkRPUlM9InZlbmRvcnMiLGUuRkVBVFVSRVM9ImZlYXR1cmVzIixlLlBVUlBPU0VTPSJwdXJwb3NlcyIsZS5TUEVDSUFMX0ZFQVRVUkVTPSJzcGVjaWFsRmVhdHVyZXMiLGUuU1BFQ0lBTF9QVVJQT1NFUz0ic3BlY2lhbFB1cnBvc2VzIixlLkZMRVhJQkxFX1BVUlBPU0VTPSJmbGV4aWJsZVB1cnBvc2VzIixlLkxFR0lUSU1BVEVfVkVORE9SUz0ibGVnaXRpbWF0ZVZlbmRvcnMiLGUuTEVHSVRJTUFURV9QVVJQT1NFUz0ibGVnaXRpbWF0ZVB1cnBvc2VzIixlLlVORklMVEVSRURfRkVBVFVSRVM9InVuZmlsdGVyZWRGZWF0dXJlcyIsZS5VTkZJTFRFUkVEX1BVUlBPU0VTPSJ1bmZpbHRlcmVkUHVycG9zZXMiLGUuVU5GSUxURVJFRF9TUEVDSUFMX0ZFQVRVUkVTPSJ1bmZpbHRlcmVkU3BlY2lhbEZlYXR1cmVzIixlLlVORklMVEVSRURfU1BFQ0lBTF9QVVJQT1NFUz0idW5maWx0ZXJlZFNwZWNpYWxQdXJwb3NlcyJ9KEVlfHwoRWU9e30pKSxmdW5jdGlvbihlKXtlLkNPTlNFTlRfUkVTUE9OU0U9ImNvbnNlbnQtcmVzcG9uc2UiLGUuQ09OU0VOVF9VST0iY29uc2VudC11aSJ9KFNlfHwoU2U9e30pKSxmdW5jdGlvbihlKXtlW2UuR0RQUj0yXT0iR0RQUiIsZVtlLlVTUD0zXT0iVVNQIn0oSWV8fChJZT17fSkpLGZ1bmN0aW9uKGUpe2UuQUNDRVBUPSJhY2NlcHQiLGUuUkVKRUNUPSJyZWplY3QiLGUuRElTTUlTUz0iZGlzbWlzcyIsZS5FTlRFUl9GVUxMU0NSRUVOPSJlbnRlci1mdWxsc2NyZWVuIn0oTGV8fChMZT17fSkpO3ZhciBSZT1uKDg4KSxVZT1uLm4oUmUpLE1lPXtlbjoiUHJpdmFjeSIsZnI6IkNvbmZpZGVudGlhbGl0w6kiLGRlOiJEYXRlbnNjaHV0eiIsaXQ6IlJpc2VydmF0ZXp6YSIsZXM6IlByaXZhY2lkYWQiLGRhOiJQcml2YXRsaXZldHMgZnJlZCIsbmw6IlByaXZhY3kiLGVsOiLOkc+Az4zPgc+BzrfPhM6/IixodToiQWRhdHbDqWRlbGVtIixwdDoiUHJpdmFjaWRhZGUiLHJvOiJDb25maWRlbsibaWFsaXRhdGUiLGZpOiJZa3NpdHlpc3l5cyIscGw6IlByeXdhdG5vxZvEhyIsc2s6IlPDumtyb21pZSIsc3Y6IkludGVncml0ZXQiLG5vOiJQZXJzb252ZXJuIixydToi0JrQvtC90YTQuNC00LXQvdGG0LjQsNC70YzQvdC+0YHRgtGMIixhcjoi2KXYudiv2KfYr9in2Kog2KfZhNiu2LXZiNi12YrYqSIsZmE6Itiq2YbYuNuM2YXYp9iqINit2LHbjNmFINiu2LXZiNi124wifTtmdW5jdGlvbiBEZShlLHQsbil7dmFyIG8saT1mdW5jdGlvbigpe3ZhciBlPSJxYy1jbXAyLWNvbnRhaW5lciI7cmV0dXJuIGRlKCJkaXYiLGUsZSxkb2N1bWVudC5ib2R5KX0oKSxzPSJxYy1jbXAyLXBlcnNpc3RlbnQtbGluayIsYT1kZSgiYSIscyxzLGkpO2lmKGEuZmlyc3RDaGlsZClyZXR1cm4gYTthLm9uY2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93Ll9fdGNmYXBpKCJkaXNwbGF5Q29uc2VudFVpIiwyLGZ1bmN0aW9uKCl7fSl9O3ZhciBjPWRlKCJpbWciLHZvaWQgMCx2b2lkIDAsYSksdT1lfHxNZVsodHx8ImVuIikudG9Mb3dlckNhc2UoKV18fE1lLmVuO2Muc3JjPVVlLmEsYy5hbHQ9dTt2YXIgcD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh1KTthLmFwcGVuZENoaWxkKHApO3ZhciBsPWRlKCJzdHlsZSIsdm9pZCAwLCJxYy1jbXAyIixkb2N1bWVudC5oZWFkKSxkPXhlKChvPXt9LHIobyxmLlRPUF9MRUZULFsidG9wIiwibGVmdCJdKSxyKG8sZi5UT1BfUklHSFQsWyJ0b3AiLCJyaWdodCJdKSxyKG8sZi5CT1RUT01fTEVGVCxbImJvdHRvbSIsImxlZnQiXSkscihvLGYuQk9UVE9NX1JJR0hULFsiYm90dG9tIiwicmlnaHQiXSksbylbbl0sMiksaD1kWzBdLHY9ZFsxXSx5PSJ0b3AiPT09aD8iYm90dG9tIjoidG9wIjtyZXR1cm4gbC5pbm5lckhUTUw9Ii5xYy1jbXAyLXBlcnNpc3RlbnQtbGluayB7Y3Vyc29yOnBvaW50ZXI7IHBvc2l0aW9uOmZpeGVkOyBiYWNrZ3JvdW5kLWNvbG9yOiMzNjhCRDY7cGFkZGluZzo1cHggMTVweDsgY29sb3I6I0ZGRjsgZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjsgbWF4LWhlaWdodDozMHB4OyB6LWluZGV4OjIxNDc0ODM2NDA7IisiIi5jb25jYXQoaCwiOjA7ICIpLmNvbmNhdCh2LCI6MDsiKSsiYm9yZGVyLSIuY29uY2F0KHksIi1sZWZ0LXJhZGl1czozcHg7IikrImJvcmRlci0iLmNvbmNhdCh5LCItcmlnaHQtcmFkaXVzOjNweDsiKSsifS5xYy1jbXAyLXBlcnNpc3RlbnQtbGluayBpbWcge3dpZHRoOjE2cHg7IGhlaWdodDoxN3B4OyBtYXJnaW4tcmlnaHQ6NXB4O30iLGF9dmFyIEZlLE5lLEJlLGplLEdlLEhlLHFlLHplLEplLFdlLFllLEtlLFFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciB0PXRoaXM7cCh0aGlzLGUpLHRoaXMuX2Nvb2tpZVZhbHVlcz12b2lkIDAsdGhpcy5fZGVsZXRlZFZlbmRvcnM9dm9pZCAwLHRoaXMuaXNTYWZhcmk9dm9pZCAwLHRoaXMucmVzb2x2ZUNvb2tpZT12b2lkIDAsdGhpcy5fZmV0Y2hDb29raWVzQ2FsbGVkPXZvaWQgMCx0aGlzLnJlc29sdmVDb29raWU9ZnVuY3Rpb24oKXt9LHRoaXMuX2Nvb2tpZVZhbHVlcz17ZXVjb25zZW50OiIiLG5vbklhYlZlbmRvckNvbnNlbnQ6IiIsZ29vZ2xlQ29va2llVmFsdWU6IiIsZmV0Y2hlZDohMSxwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3JldHVybiB0LnJlc29sdmVDb29raWU9ZX0pfSx0aGlzLl9kZWxldGVkVmVuZG9ycz1bXSx0aGlzLmlzU2FmYXJpPW10KCJzYWZhcmkiKSx0aGlzLl9mZXRjaENvb2tpZXNDYWxsZWQ9ITF9cmV0dXJuIGQoZSxbe2tleToiZ2V0Q29yZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gTmUuY29yZUNvbmZpZ319LHtrZXk6ImdldENvbnNlbnRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4sbyxzLGMsdSxwLGwsZCxmLGgsdix5LGcsbSxDLF87cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKHQ9bWUuVkVORE9SUyxuPW1lLkxFR0lUSU1BVEVfVkVORE9SUyxvPW1lLkxFR0lUSU1BVEVfUFVSUE9TRVMscz1tZS5QVVJQT1NFUyxjPW1lLlNQRUNJQUxfRkVBVFVSRVMsdT1tZS5OT05fSUFCLHA9bWUuR09PR0xFLHRoaXMuX2Nvb2tpZVZhbHVlcy5mZXRjaGVkKXtlLm5leHQ9NDticmVha31yZXR1cm4gZS5uZXh0PTQsdGhpcy5fY29va2llVmFsdWVzLnByb21pc2U7Y2FzZSA0OnJldHVybiBsPXZlKHplLmRlY29kZSx0aGlzLl9jb29raWVWYWx1ZXMuZXVjb25zZW50KSxkPW5ldyBiLGY9V2UuZ3ZsLGg9TmUuY29yZUNvbmZpZy5wdWJsaXNoZXJOYW1lfHxOZS5jb3JlQ29uZmlnLmNvb2tpZURvbWFpbnx8IiIsdj1OZS5jb3JlQ29uZmlnLHk9di5wdWJsaXNoZXJQdXJwb3NlSWRzLGc9di5wdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzLG09Zi52ZW5kb3JzLCh5fHxnKSYmKG09aShpKHt9LG0pLHt9LHIoe30saCx7aWQ6aCxuYW1lOmh9KSkpLHRoaXMucG9wdWxhdGVDb3JlQ29uc2VudHMoZCx0LG0sbCksdGhpcy5wb3B1bGF0ZUNvcmVDb25zZW50cyhkLHMsZi5wdXJwb3NlcyxsKSx0aGlzLnBvcHVsYXRlQ29yZUNvbnNlbnRzKGQsYyxmLnNwZWNpYWxGZWF0dXJlcyxsKSx0aGlzLnBvcHVsYXRlQ29yZUNvbnNlbnRzKGQsbixtLGwpLHRoaXMucG9wdWxhdGVDb3JlQ29uc2VudHMoZCxvLGYucHVycG9zZXMsbCksQz12ZShIZS5kZWNvZGUsdGhpcy5fY29va2llVmFsdWVzLm5vbklhYlZlbmRvckNvbnNlbnQpLHRoaXMucG9wdWxhdGVDb3JlQ29uc2VudHMoZCx1LEhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JMaXN0LEMpLF89dmUoS2UuZGVjb2RlLHRoaXMuX2Nvb2tpZVZhbHVlcy5nb29nbGVDb29raWVWYWx1ZSksdGhpcy5wb3B1bGF0ZUNvcmVDb25zZW50cyhkLHAsW10sXyksZS5hYnJ1cHQoInJldHVybiIsZCk7Y2FzZSAyMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0sZSx0aGlzKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJleHRyYWN0TnVtZXJpY0tleXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1wYXJzZUludChuKTtpc05hTihyKXx8KHRbbl09ZVtuXSl9cmV0dXJuIHR9fSx7a2V5OiJzZXRDb25zZW50cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9TmUuY29yZUNvbmZpZyxuPXQucHVibGlzaGVyUHVycG9zZUlkcyxyPXQucHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyxvPXQucHVibGlzaGVyTmFtZSxzPXQuaXNBTVA7ZS5jb25zZW50U2NyZWVuJiYoV2UuY29uc2VudFNjcmVlbj1lLmNvbnNlbnRTY3JlZW4pO3ZhciBhLGM9emUuZW5jb2RlKHRoaXMuZXh0cmFjdE51bWVyaWNLZXlzKGUudmVuZG9yQ29uc2VudHMpLHRoaXMuZXh0cmFjdE51bWVyaWNLZXlzKGUucHVycG9zZXNDb25zZW50cyksdGhpcy5leHRyYWN0TnVtZXJpY0tleXMoZS5zcGVjaWFsRmVhdHVyZXMpLHRoaXMuZXh0cmFjdE51bWVyaWNLZXlzKGUudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0KSx0aGlzLmV4dHJhY3ROdW1lcmljS2V5cyhlLmxlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzKSxlLnZlbmRvckNvbnNlbnRzW29dLGUudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0W29dLG4sciksdT10aGlzLmZvcm1hdENvbnNlbnRzKGUubm9uSWFiQ29uc2VudHMpLHA9TmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybD9IZS5lbmNvZGUodS5jb25zZW50QXJyYXksdS5tYXhWZW5kb3JJZCk6IiIsbD10aGlzLmZvcm1hdEdvb2dsZUNvbnNlbnRzKGUpLGQ9TmUuY29yZUNvbmZpZy5nb29nbGVFbmFibGVkP0tlLmVuY29kZShsKToiIixmPUhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JzSGFzaDtyZXR1cm4gbC5sZW5ndGh8fHN8fEdlLmRlbGV0ZUNvb2tpZShVLE5lLmNvcmVDb25maWcuY29va2llRG9tYWluKSxKZS5zZXRWYWx1ZXMoe2V1Y29uc2VudDpjLG5vbklhYlZlbmRvckNvbnNlbnQ6cCxub25JYWJWZW5kb3JzSGFzaDpmfSksYT1KZS5nZW5lcmF0ZVJlcHJvbXB0T3B0aW9uc0hhc2goKSx0aGlzLnNldERhdGEoYyxwLGEsZCksdGhpcy51cGRhdGVBcGlWaXNpYmxlKCJHRFBSIiwhMSksaShpKHt9LHRoaXMuX2Nvb2tpZVZhbHVlcykse30se2FsbENvbnNlbnRzOmUuYWxsQ29uc2VudHN9KX19LHtrZXk6InVwZGF0ZUFwaVZpc2libGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoIlVTUCIhPT1lJiZmdChCZS5pc1VzZXJJbkVVLE5lLmNvcmVDb25maWcuZGlzcGxheVVpKSl7dmFyIG49dGhpcy5fY29va2llVmFsdWVzLmV1Y29uc2VudDtuJiYhbi5tZXNzYWdlfHwobj0iIiksRXQuY21wQXBpLnVwZGF0ZShuLHQpfWVsc2UgRXQuY21wQXBpLnVwZGF0ZShudWxsKTtOZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlLmluY2x1ZGVzKCJHRFBSIikmJk5lLmNvcmVDb25maWcuZGlzcGxheVBlcnNpc3RlbnRDb25zZW50TGluayYmIU5lLmNvcmVDb25maWcuaXNBTVAmJnRoaXMuaGFzQ29va2llKCkmJkRlKE5lLmdldEN1c3RvbUNvcmVVaUxhYmVscygpLnBlcnNpc3RlbnRDb25zZW50TGlua0xhYmVsLE5lLmNvcmVDb25maWcubGFuZ18sTmUuY29yZUNvbmZpZy5wZXJzaXN0ZW50Q29uc2VudExpbmtMb2NhdGlvbil9fSx7a2V5OiJzZXREYXRhIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1OZS5jb3JlQ29uZmlnLGk9by5jb25zZW50U2NvcGUscz1vLnRoaXJkUGFydHlTdG9yYWdlVHlwZSxhPW8uY29uc2VudFNjb3BlR3JvdXBVUkwsYz1vLmNvbnNlbnRPblNhZmFyaSx1PW8uaXNBTVAscD0iYXBpIj09PXMsbD10aGlzLmlzU2FmYXJpJiZjO3V8fChsP3RoaXMuc2V0RGF0YVVzaW5nQXBpKCEwLGEsZSx0LG4scik6aT09PXYuU0VSVklDRXx8dGhpcy5pc1NhZmFyaT90aGlzLnNldERhdGFVc2luZ0ZpcnN0UGFydHkoZSx0LG4scik6aT09PXYuU0VSVklDRV9HUk9VUCYmKHA/dGhpcy5zZXREYXRhVXNpbmdBcGkoITAsYSxlLHQsbixyKTp0aGlzLnNldERhdGFVc2luZ0lmcmFtZShlLHQsbixyKSkpLHRoaXMuX2Nvb2tpZVZhbHVlcz17ZXVjb25zZW50OmUsbm9uSWFiVmVuZG9yQ29uc2VudDp0LGdvb2dsZUNvb2tpZVZhbHVlOnIsZmV0Y2hlZDohMCxwcm9taXNlOnRoaXMuX2Nvb2tpZVZhbHVlcy5wcm9taXNlfX19LHtrZXk6InNldERhdGFVc2luZ0FwaSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBzPXt9O24mJihzW09dPW4pLHImJihzW1RdPXIpLG8mJihzW3hdPW8pLGkmJihzW1VdPWkpLFooe21ldGhvZDoicG9zdCIsdXJsOnQsZGF0YTpzLHdpdGhDcmVkZW50aWFsczplfSkudGhlbihmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJ0aGUgY29va2llcyB3YXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5Iil9KX19LHtrZXk6InNldERhdGFVc2luZ0lmcmFtZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4scil7ZSYmc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJzZXQiLE8sZSksdCYmc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJzZXQiLFQsdCksbiYmc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJzZXQiLHgsbiksciYmc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJzZXQiLFUscil9fSx7a2V5OiJzZXREYXRhVXNpbmdGaXJzdFBhcnR5Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXtlJiZ6ZS5zZXRDb29raWUoZSksdCYmSGUuc2V0Q29va2llKHQpLG4mJkdlLnNldCh4LG4pLHImJktlLnNldENvb2tpZShyKX19LHtrZXk6ImZldGNoQ29va2llVmFsdWVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scixvLGkscyxjLHUscCxsLGQsZixoO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZih0PU5lLmNvcmVDb25maWcsbj10LmNvbnNlbnRTY29wZSxyPXQuY29uc2VudFNjb3BlR3JvdXBVUkwsbz10LnRoaXJkUGFydHlTdG9yYWdlVHlwZSxpPXQuY29uc2VudE9uU2FmYXJpLHM9dC5pc0FNUCxjPU5lLmFtcERhdGEsdT0iIixwPSIiLGw9IiIsZD17fSxmPWZ1bmN0aW9uKGUpe3U9ZS5ub25JYWJDb29raWVWYWx1ZSxwPWUudmVuZG9yQ29va2llVmFsdWUsbD1lLmdvb2dsZUNvb2tpZVZhbHVlfSxoPXRoaXMuaXNTYWZhcmkmJmksdGhpcy5fZmV0Y2hDb29raWVzQ2FsbGVkPSEwLCFzKXtlLm5leHQ9MTI7YnJlYWt9Yy5jb25zZW50TWV0YWRhdGEmJmMuY29uc2VudE1ldGFkYXRhLmNvbnNlbnRTdHJpbmdUeXBlPT09SWUuR0RQUiYmKHA9Yy5jb25zZW50U3RyaW5nLGMuY29uc2VudE1ldGFkYXRhLmFkZGl0aW9uYWxDb25zZW50JiYobD1jLmNvbnNlbnRNZXRhZGF0YS5hZGRpdGlvbmFsQ29uc2VudCkpLGUubmV4dD0zNjticmVhaztjYXNlIDEyOmlmKCFoKXtlLm5leHQ9MTk7YnJlYWt9cmV0dXJuIGUubmV4dD0xNSx0aGlzLmdldERhdGFVc2luZ0FwaSghMCxyKTtjYXNlIDE1OmQ9ZS5zZW50LGYoZCksZS5uZXh0PTM2O2JyZWFrO2Nhc2UgMTk6aWYobiE9PXYuU0VSVklDRSYmIXRoaXMuaXNTYWZhcmkpe2UubmV4dD0yNDticmVha31kPXRoaXMuZ2V0RGF0YVVzaW5nRmlyc3RQYXJ0eSgpLGYoZCksZS5uZXh0PTM2O2JyZWFrO2Nhc2UgMjQ6aWYobiE9PXYuU0VSVklDRV9HUk9VUCl7ZS5uZXh0PTM2O2JyZWFrfWlmKCJhcGkiIT09byl7ZS5uZXh0PTMyO2JyZWFrfXJldHVybiBlLm5leHQ9MjgsdGhpcy5nZXREYXRhVXNpbmdBcGkoITAscik7Y2FzZSAyODpkPWUuc2VudCxmKGQpLGUubmV4dD0zNjticmVhaztjYXNlIDMyOnJldHVybiBlLm5leHQ9MzQsdGhpcy5nZXREYXRhVXNpbmdJZnJhbWUoKTtjYXNlIDM0OmQ9ZS5zZW50LGYoZCk7Y2FzZSAzNjp0aGlzLl9jb29raWVWYWx1ZXM9e2V1Y29uc2VudDpwLG5vbklhYlZlbmRvckNvbnNlbnQ6dSxnb29nbGVDb29raWVWYWx1ZTpsLGZldGNoZWQ6ITAscHJvbWlzZTp0aGlzLl9jb29raWVWYWx1ZXMucHJvbWlzZX0sdGhpcy5yZXNvbHZlQ29va2llKCk7Y2FzZSAzODpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0sZSx0aGlzKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJnZXREYXRhVXNpbmdBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKHQsbil7dmFyIHIsbyxpO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsWih7bWV0aG9kOiJnZXQiLHVybDpuLHdpdGhDcmVkZW50aWFsczp0fSk7Y2FzZSAyOnJldHVybiByPWUuc2VudCxvPXt9LGk9ci5kYXRhW3hdLEplLnN0b3JlZEhhc2g9aSxvLnZlbmRvckNvb2tpZVZhbHVlPXIuZGF0YVtPXSxvLm5vbklhYkNvb2tpZVZhbHVlPXIuZGF0YVtUXSxvLmdvb2dsZUNvb2tpZVZhbHVlPXIuZGF0YS5hZGR0bF9jb25zZW50LGUuYWJydXB0KCJyZXR1cm4iLG8pO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUpfSkpO3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCl9LHtrZXk6ImdldERhdGFVc2luZ0lmcmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUoKXt2YXIgdCxuLHIsbyxpLHM7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiB0PU5lLmNvcmVDb25maWcuZ29vZ2xlRW5hYmxlZCxuPU5lLnByZW1pdW1Qcm9wZXJ0aWVzLm5vbklhYlZlbmRvckxpc3RVcmwscj17fSxlLm5leHQ9NCxzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoImdldCIseCwiIik7Y2FzZSA0OnJldHVybiBvPWUuc2VudCxKZS5zdG9yZWRIYXNoPW8sZS5uZXh0PTgsc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJnZXQiLE8sIiIpO2Nhc2UgODppZihyLnZlbmRvckNvb2tpZVZhbHVlPWUuc2VudCwhbil7ZS5uZXh0PTE1O2JyZWFrfXJldHVybiBlLm5leHQ9MTIsc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCJnZXQiLFQsIiIpO2Nhc2UgMTI6KGk9ZS5zZW50KSYmQXJyYXkuaXNBcnJheShpKT9pPWlbMF06aXx8KGk9bnVsbCksci5ub25JYWJDb29raWVWYWx1ZT1pO2Nhc2UgMTU6aWYoIXQpe2UubmV4dD0yMTticmVha31yZXR1cm4gZS5uZXh0PTE4LHN0LnRyeUdyb3VwQ29va2llQWNjZXNzQ2FsbCgiZ2V0IixVLCIiKTtjYXNlIDE4OihzPWUuc2VudCkmJkFycmF5LmlzQXJyYXkocyk/cz1zWzBdOnN8fChzPW51bGwpLHIuZ29vZ2xlQ29va2llVmFsdWU9cztjYXNlIDIxOnJldHVybiBlLmFicnVwdCgicmV0dXJuIixyKTtjYXNlIDIyOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJnZXREYXRhVXNpbmdGaXJzdFBhcnR5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXt9LHQ9TmUuY29yZUNvbmZpZy5nb29nbGVFbmFibGVkLG49TmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybCxyPUdlLmdldChPKSxvPUdlLmdldCh4KSxpPUdlLmdldChUKSxzPUdlLmdldChVKTtyZXR1cm4gSmUuc3RvcmVkSGFzaD1vLCJzdHJpbmciPT09dHlwZW9mIHImJihlLnZlbmRvckNvb2tpZVZhbHVlPXIpLHQmJiJzdHJpbmciPT09dHlwZW9mIHMmJihlLmdvb2dsZUNvb2tpZVZhbHVlPXMpLG4mJiJzdHJpbmciPT09dHlwZW9mIGkmJihlLm5vbklhYkNvb2tpZVZhbHVlPWkpLGV9fSx7a2V5OiJyZXByb21wdER1ZVRvSW52YWxpZENNUElEIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scixvLGkscyxjLHUscDtyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYodD1OZS5jb3JlQ29uZmlnLmlzQU1QLG49ITEsdCl7ZS5uZXh0PTI1O2JyZWFrfWlmKHI9Imh0dHBzOi8vdGVzdC5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9HVkwtdjIvY21wLWxpc3QuanNvbiIsbz1bXSxpPW5ldyBEYXRlLHM9R2UuZ2V0KGspLCEoKGM9cyYmIXMubWVzc2FnZT9KU09OLnBhcnNlKHMpOm51bGwpJiZjLkNNUCYmYy5DTVAuaW5jbHVkZXMoU3RyaW5nKFdlLmNtcElkKSkmJmkuZ2V0VGltZSgpPGMuZXhwaXJ5KSl7ZS5uZXh0PTEyO2JyZWFrfW49ITEsZS5uZXh0PTI1O2JyZWFrO2Nhc2UgMTI6cmV0dXJuIGUucHJldj0xMixlLm5leHQ9MTUsWi5nZXQocik7Y2FzZSAxNTp1PWUuc2VudCxvLnB1c2guYXBwbHkobyxWZShPYmplY3Qua2V5cyh1LmRhdGEuY21wcykpKSxwPXtsYXN0VXBkYXRlZDp1LmRhdGEubGFzdFVwZGF0ZWQsQ01QOm8sZXhwaXJ5OmkuZ2V0VGltZSgpKzI1OTJlNX0sR2Uuc2V0KGssSlNPTi5zdHJpbmdpZnkocCkpLGUubmV4dD0yNDticmVhaztjYXNlIDIxOmUucHJldj0yMSxlLnQwPWUuY2F0Y2goMTIpLGNvbnNvbGUubG9nKGUudDApO2Nhc2UgMjQ6bj0hby5pbmNsdWRlcyhTdHJpbmcoV2UuY21wSWQpKTtjYXNlIDI1OnJldHVybiBlLmFicnVwdCgicmV0dXJuIixuKTtjYXNlIDI2OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLG51bGwsW1sxMiwyMV1dKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJyZXByb21wdER1ZVRvT3V0ZGF0ZWRHdmwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKCl7dmFyIHQsbixyLG8saSxzLGMsdSxwLGw7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKHQ9TmUuY29yZUNvbmZpZy52ZW5kb3JMaXN0VXBkYXRlRnJlcSx0aGlzLl9jb29raWVWYWx1ZXMuZmV0Y2hlZCl7ZS5uZXh0PTQ7YnJlYWt9cmV0dXJuIGUubmV4dD00LHRoaXMuX2Nvb2tpZVZhbHVlcy5wcm9taXNlO2Nhc2UgNDppZihuPXZlKHplLmRlY29kZSx0aGlzLl9jb29raWVWYWx1ZXMuZXVjb25zZW50KSxyPSExLCFuKXtlLm5leHQ9MTc7YnJlYWt9aWYobz1uLnZlbmRvckxpc3RWZXJzaW9uLGk9bi5wb2xpY3lWZXJzaW9uLHM9bi5sYXN0VXBkYXRlZCxjPURhdGUubm93KCktcy5nZXRUaW1lKCk+ODY0ZTUqdCl7ZS5uZXh0PTExO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIix7b3V0ZGF0ZWRHdmxSZXByb21wdDpyLGRlY29kZWRFdUNvbnNlbnQ6bn0pO2Nhc2UgMTE6cmV0dXJuIGUubmV4dD0xMyx0aGlzLmxvYWRHVkwoKTtjYXNlIDEzOnU9V2UuZ3ZsLHA9dS52ZW5kb3JMaXN0VmVyc2lvbixsPXUudGNmUG9saWN5VmVyc2lvbixjJiYocD5vfHxsPmkpJiYocj0hMCksZS5uZXh0PTE4O2JyZWFrO2Nhc2UgMTc6cj0hMDtjYXNlIDE4OnJldHVybiBlLmFicnVwdCgicmV0dXJuIix7b3V0ZGF0ZWRHdmxSZXByb21wdDpyLGRlY29kZWRFdUNvbnNlbnQ6bn0pO2Nhc2UgMTk6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUsdGhpcyl9KSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKX0se2tleToicmVwcm9tcHREdWVUb0NvbnNlbnRPbkRlbGV0ZWRWZW5kb3JzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuPSExLHI9VGUodGhpcy5fZGVsZXRlZFZlbmRvcnMpO3RyeXtmb3Ioci5zKCk7ISh0PXIubigpKS5kb25lOyl7dmFyIG89dC52YWx1ZTtpZihlLmhhcyhvKSl7bj0hMDticmVha319fWNhdGNoKGkpe3IuZShpKX1maW5hbGx5e3IuZigpfXJldHVybiBufX0se2tleToiZmV0Y2hEYXRhVG9SZXByb21wdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUoKXt2YXIgdCxuLHIsbyxzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdGhpcy5yZXByb21wdER1ZVRvT3V0ZGF0ZWRHdmwoKTtjYXNlIDI6cmV0dXJuIHQ9ZS5zZW50LG49dC5vdXRkYXRlZEd2bFJlcHJvbXB0LHI9dC5kZWNvZGVkRXVDb25zZW50LGUubmV4dD03LHRoaXMucmVwcm9tcHREdWVUb0ludmFsaWRDTVBJRCgpO2Nhc2UgNzpyZXR1cm4gbz1lLnNlbnQsKHM9bnx8byl8fChzPXRoaXMucmVwcm9tcHREdWVUb0NvbnNlbnRPbkRlbGV0ZWRWZW5kb3JzKHIudmVuZG9yQ29uc2VudHMuc2V0XykpfHwoSmUuc2V0VmFsdWVzKGkoaSh7fSx0aGlzLl9jb29raWVWYWx1ZXMpLHt9LHtub25JYWJWZW5kb3JzSGFzaDpIZS5kYXRhLmRhdGEubm9uSWFiVmVuZG9yc0hhc2h9KSkscz1KZS5zaG91bGRSZXByb21wdCgpKSxlLmFicnVwdCgicmV0dXJuIixzKTtjYXNlIDExOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLHRoaXMpfSkpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCl9LHtrZXk6InBvcHVsYXRlQ29yZUNvbnNlbnRzIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbyxpPW1lLk5PTl9JQUIscz1tZS5QVVJQT1NFUyxhPW1lLkxFR0lUSU1BVEVfUFVSUE9TRVMsYz1tZS5MRUdJVElNQVRFX1ZFTkRPUlMsdT1tZS5WRU5ET1JTLHA9bWUuU1BFQ0lBTF9GRUFUVVJFUyxsPW1lLkdPT0dMRSxkPSIiLGY9IiI7c3dpdGNoKHQpe2Nhc2UgaTpvPSJub25JYWJDb25zZW50cyIsZD0idmVuZG9yQ29uc2VudHMiO2JyZWFrO2Nhc2UgdTpvPSJ2ZW5kb3JDb25zZW50cyIsZD0idmVuZG9yQ29uc2VudHMiLGY9InB1Ymxpc2hlckNvbnNlbnRzIjticmVhaztjYXNlIHM6bz0icHVycG9zZXNDb25zZW50cyIsZD0icHVycG9zZUNvbnNlbnRzIjticmVhaztjYXNlIGE6bz0ibGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHMiLGQ9InB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzIjticmVhaztjYXNlIGM6bz0idmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0IixkPSJ2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzIixmPSJwdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzIjticmVhaztjYXNlIHA6bz0ic3BlY2lhbEZlYXR1cmVzIixkPSJzcGVjaWFsRmVhdHVyZU9wdGlucyI7YnJlYWs7Y2FzZSBsOm89Imdvb2dsZUNvbnNlbnRzIixkPSJjb25zZW50SWRzIjticmVhaztkZWZhdWx0Om89IiJ9dmFyIGg9bnVsbCE9PXImJiFyLm1lc3NhZ2Usdj1OZS5jb3JlQ29uZmlnLnB1Ymxpc2hlck5hbWU7aWYoZVtvXS5oYXNDb29raWU9aCxoKXN3aXRjaCh0KXtjYXNlIGk6aWYobil7dmFyIHksZz1UZShuKTt0cnl7Zm9yKGcucygpOyEoeT1nLm4oKSkuZG9uZTspe3ZhciBtPXkudmFsdWUsYj1yW2RdW20uaWRdO2Vbb11bbS5pZF09Yn19Y2F0Y2goRSl7Zy5lKEUpfWZpbmFsbHl7Zy5mKCl9fWJyZWFrO2Nhc2UgbDpyLmNvbnNlbnRJZHMmJnIuY29uc2VudElkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Vbb11bdF09ITB9KTticmVhaztkZWZhdWx0OmZvcih2YXIgQyBpbiBuKXt2YXIgXz1DPT09diYmZj9WZShyW2ZdLnNldF8pLmxlbmd0aD4wOnJbZF0uaGFzKHBhcnNlSW50KEMpKTtlW29dW0NdPV99fX19LHtrZXk6ImZvcm1hdENvbnNlbnRzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0wLG49W107Zm9yKHZhciByIGluIGUpe3ZhciBvPXBhcnNlSW50KHIpO2lzTmFOKG8pfHwobz50JiYodD1vKSxuLnB1c2goe2NvbnNlbnQ6ZVtyXSxpZDpvfSkpfXJldHVybntjb25zZW50QXJyYXk6bixtYXhWZW5kb3JJZDp0fX19LHtrZXk6ImZvcm1hdEdvb2dsZUNvbnNlbnRzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZS5nb29nbGVDb25zZW50cykhMD09PWUuZ29vZ2xlQ29uc2VudHNbbl0mJnQucHVzaChuKTtyZXR1cm4gdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pLHR9fSx7a2V5OiJyZWd1bGF0aW9uVG9Jbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scixvO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZih0PU5lLmNvcmVDb25maWcucHJpdmFjeU1vZGUsbj0iIiwhdC5pbmNsdWRlcygiVVNQIikpe2UubmV4dD0xNDticmVha31pZihyPU5lLmNvcmVDb25maWcudXNwSnVyaXNkaWN0aW9uLCFCZS5pc1VzZXJJblVTfHwhci5sZW5ndGgpe2UubmV4dD0xNDticmVha31pZihYKCJpbml0VXNwTG9jYXRpb246IFVTIiksci5pbmNsdWRlcygiVVMiKSl7ZS5uZXh0PTEzO2JyZWFrfXJldHVybiBlLm5leHQ9OSxCZS5jaGVja1NwZWNpZmljTG9jYXRpb24oKTtjYXNlIDk6WCgiaW5pdFVzcExvY2F0aW9uOiBzcGVjaWZpYyBsb2NhdGlvbiIrSlNPTi5zdHJpbmdpZnkoQmUudXNlclNwZWNpZmljTG9jYXRpb24pKSxCZS51c2VyU3BlY2lmaWNMb2NhdGlvbiYmQmUudXNlclNwZWNpZmljTG9jYXRpb24ucmVnaW9uJiZyLmluY2x1ZGVzKEJlLnVzZXJTcGVjaWZpY0xvY2F0aW9uLnJlZ2lvbi50b1VwcGVyQ2FzZSgpKSYmKG49IlVTUCIpLGUubmV4dD0xNDticmVhaztjYXNlIDEzOm49IlVTUCI7Y2FzZSAxNDpyZXR1cm4gdC5pbmNsdWRlcygiR0RQUiIpJiYiVVNQIiE9PW4mJihvPU5lLmNvcmVDb25maWcuZGlzcGxheVVpLChCZS5pc1VzZXJJbkVVJiYiaW5FVSI9PT1vfHwiYWx3YXlzIj09PW8pJiYobj0iR0RQUiIpKSxlLmFicnVwdCgicmV0dXJuIixuKTtjYXNlIDE2OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJsb2FkR1ZMIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scixvLGkscyxjO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZih0PU5lLmNvcmVDb25maWcsbj10LnByaXZhY3lNb2RlLHI9dC5sYW5nXyxvPU5lLnByZW1pdW1Qcm9wZXJ0aWVzLGk9by52ZW5kb3JXaGl0ZWxpc3Qscz1vLnZlbmRvckJsYWNrbGlzdCxjPW51bGw9PT1yfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnRvVXBwZXJDYXNlKCksV2UuZ3ZsKXtlLm5leHQ9MTI7YnJlYWt9cmV0dXJuIFdlLmd2bD1uZXcgSi5HVkwoIkxBVEVTVCIpLGUubmV4dD02LFdlLmd2bC5yZWFkeVByb21pc2U7Y2FzZSA2OmlmKCFuLmluY2x1ZGVzKCJHRFBSIikpe2UubmV4dD0xMDticmVha31yZXR1cm4gZS5uZXh0PTksV2UuZ3ZsLmNoYW5nZUxhbmd1YWdlKGMpO2Nhc2UgOTp0aGlzLmZpbHRlckd2bChXZS5ndmwsaSxzKTtjYXNlIDEwOmUubmV4dD0xNDticmVhaztjYXNlIDEyOnJldHVybiBlLm5leHQ9MTQsV2UuZ3ZsLnJlYWR5UHJvbWlzZTtjYXNlIDE0OnJldHVybiBlLmFicnVwdCgicmV0dXJuIixXZS5ndmwpO2Nhc2UgMTU6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUsdGhpcyl9KSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKX0se2tleToiZmlsdGVyR3ZsIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS52ZW5kb3JzLG89W10saT1bXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JbZV0uZGVsZXRlZERhdGU/aS5wdXNoKHJbZV0uaWQpOm8ucHVzaChyW2VdLmlkKX0pLHRoaXMuZGVsZXRlZFZlbmRvcnM9aSx0Lmxlbmd0aCYmKG89dC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG8uaW5jbHVkZXMoZSl9KSksbi5sZW5ndGg/ZS5uYXJyb3dWZW5kb3JzVG8oby5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW4uaW5jbHVkZXMoZSl9KSk6ZS5uYXJyb3dWZW5kb3JzVG8obyl9fSx7a2V5OiJoYXNDb29raWUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9jb29raWVWYWx1ZXMuZXVjb25zZW50fX0se2tleToic2V0UHVibGlzaGVyUmVzdHJpY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKGUpe1dlLnB1Ymxpc2hlclJlc3RyaWN0aW9ucy5hZGQoZS5pZCxlLnB1cnBvc2VSZXN0cmljdGlvbil9fSx7a2V5OiJkZWxldGVkVmVuZG9ycyIsc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2RlbGV0ZWRWZW5kb3JzPWV9fSx7a2V5OiJjb29raWVWYWx1ZXMiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29raWVWYWx1ZXN9fSx7a2V5OiJmZXRjaENvb2tpZXNDYWxsZWQiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mZXRjaENvb2tpZXNDYWxsZWR9fV0pLGV9KCksWmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cCh0aGlzLGUpLHRoaXMuX2RhdGE9dm9pZCAwLHRoaXMuX2ZpZWxkcz12b2lkIDAsdGhpcy5fZmllbGRzPXtjcmVhdGVkOm5ldyBEYXRlLGxhc3RVcGRhdGVkOm5ldyBEYXRlLGNtcElkOjEwLGNtcFZlcnNpb246MjYsbWF4VmVuZG9ySWQ6MCx2ZW5kb3JDb25zZW50czpbXX0sdGhpcy5fZGF0YT17bm9uSWFiVmVuZG9yTGlzdDpbXSx1cGRhdGVBdDoiIixub25JYWJWZW5kb3JzSGFzaDoiIn19cmV0dXJuIGQoZSxbe2tleToiZGF0YSIsc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2RhdGE9ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSx7a2V5OiJmaWVsZHMiLHNldDpmdW5jdGlvbihlKXt0aGlzLl9maWVsZHM9ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpZWxkc319XSksZX0oKSxYZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtwKHRoaXMsZSksdGhpcy5fZGF0YT12b2lkIDAsdGhpcy5jcmVhdGVkPXZvaWQgMCx0aGlzLl9kYXRhPW5ldyBaZSx0aGlzLmNyZWF0ZWQ9ITF9cmV0dXJuIGQoZSxbe2tleToiZW5jb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7bltlLmlkXT1lLmNvbnNlbnR9KSwhMT09PXRoaXMuY3JlYXRlZD8odGhpcy5jcmVhdGVkPSEwLHRoaXMuX2RhdGEuZmllbGRzPWkoaSh7fSx0aGlzLl9kYXRhLmZpZWxkcykse30se3ZlbmRvckNvbnNlbnRzOm4sY3JlYXRlZDpuZXcgRGF0ZSxsYXN0VXBkYXRlZDpuZXcgRGF0ZSxtYXhWZW5kb3JJZDp0fSkpOnRoaXMuX2RhdGEuZmllbGRzPWkoaSh7fSx0aGlzLl9kYXRhLmZpZWxkcykse30se3ZlbmRvckNvbnNlbnRzOm4sbGFzdFVwZGF0ZWQ6bmV3IERhdGV9KSxHZS5lbmNvZGUoaSh7Y29va2llTmFtZTpUfSx0aGlzLl9kYXRhLmZpZWxkcykpfX0se2tleToiZGVjb2RlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gR2UuZGVjb2RlKFQsZSl9fSx7a2V5OiJzZXRDb29raWUiLHZhbHVlOmZ1bmN0aW9uKGUpeyJzdHJpbmciPT09dHlwZW9mIGU/R2Uuc2V0KFQsZSk6Y29uc29sZS5lcnJvcihlLm1lc3NhZ2UpfX0se2tleToiZ2V0Q29va2llIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPUdlLmdldChUKTtyZXR1cm4gZSYmInN0cmluZyI9PT10eXBlb2YgZT90aGlzLmRlY29kZShlKTplfX0se2tleToiZmV0Y2hMaXN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpe3ZhciB0LG4scjtyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYoTmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybHx8TmUubm9uSWFiVmVuZG9yc0luZm8pe2UubmV4dD0yO2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIik7Y2FzZSAyOmlmKGUucHJldj0yLCJ1bmRlZmluZWQiPT09dHlwZW9mIE5lLm5vbklhYlZlbmRvcnNJbmZvKXtlLm5leHQ9OTticmVha31pZihOZS5ub25JYWJWZW5kb3JzSW5mby5ub25JYWJWZW5kb3JMaXN0JiYwIT09TmUubm9uSWFiVmVuZG9yc0luZm8ubm9uSWFiVmVuZG9yTGlzdC5sZW5ndGgpe2UubmV4dD02O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIik7Y2FzZSA2OnQ9TmUubm9uSWFiVmVuZG9yc0luZm8sZS5uZXh0PTEzO2JyZWFrO2Nhc2UgOTpyZXR1cm4gZS5uZXh0PTExLFouZ2V0KE5lLnByZW1pdW1Qcm9wZXJ0aWVzLm5vbklhYlZlbmRvckxpc3RVcmwpO2Nhc2UgMTE6bj1lLnNlbnQsdD1uLmRhdGE7Y2FzZSAxMzpyPVtdLHQubm9uSWFiVmVuZG9yTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOmUubmFtZSxpZDplLnZlbmRvcklkLHBvbGljeVVybDohIWUucHJpdmFjeVBvbGljeVVybCYmZS5wcml2YWN5UG9saWN5VXJsLGRlc2NyaXB0aW9uOiEhZS5kZXNjcmlwdGlvbiYmZS5kZXNjcmlwdGlvbixwdXJwb3Nlczoibm9uSWFiUHVycG9zZUNvbnNlbnRJZHMiaW4gZSYmZS5ub25JYWJQdXJwb3NlQ29uc2VudElkcyxsZWdJbnRQdXJwb3Nlczoibm9uSWFiUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcyJpbiBlJiZlLm5vbklhYlB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHN9O3IucHVzaCh0KX0pLHRoaXMuX2RhdGEuZGF0YT1pKGkoe30sdCkse30se25vbklhYlZlbmRvckxpc3Q6cn0pLGUubmV4dD0yMTticmVhaztjYXNlIDE4OmUucHJldj0xOCxlLnQwPWUuY2F0Y2goMiksY29uc29sZS5sb2coImVycm9yIHByb2Nlc3Npbmcgbm9uSWFiVmVuZG9ycyIsZS50MCk7Y2FzZSAyMTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0sZSx0aGlzLFtbMiwxOF1dKX0pKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJkYXRhIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX19XSksZX0oKSwkZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtwKHRoaXMsZSl9cmV0dXJuIGQoZSxbe2tleToiZW5jb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQsbixyLG8saSxzLGEsYyl7cmV0dXJuIEdlLmVuY29kZSh7Y29va2llTmFtZTpPLHZlbmRvckNvbnNlbnRzOmUscHVycG9zZUNvbnNlbnRzOnQsc3BlY2lhbEZlYXR1cmVPcHRpbnM6bix2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzOnIscHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHM6byxwdWJsaXNoZXJDb25zZW50OmkscHVibGlzaGVyTGVnaXRpbWF0ZTpzLHB1Ymxpc2hlclB1cnBvc2VJZHM6YSxwdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzOmN9KX19LHtrZXk6ImRlY29kZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEdlLmRlY29kZShPLGUpfX0se2tleToic2V0Q29va2llIix2YWx1ZTpmdW5jdGlvbihlKXsic3RyaW5nIj09PXR5cGVvZiBlP0dlLnNldChPLGUsITEpOmNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKX19LHtrZXk6ImdldENvb2tpZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1HZS5nZXQoTyk7cmV0dXJuIGUmJiJzdHJpbmciPT09dHlwZW9mIGU/dGhpcy5kZWNvZGUoZSk6ZX19XSksZX0oKSxldD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtwKHRoaXMsZSksdGhpcy5fdXNwVmVyc2lvbj12b2lkIDAsdGhpcy5fYmFzZVN0cmluZz12b2lkIDAsdGhpcy5fbm90aWNlZ2l2ZW49dm9pZCAwLHRoaXMuX29wdGVkb3V0PXZvaWQgMCx0aGlzLl9sc3BhY3Q9dm9pZCAwLHRoaXMuX3VzcFZlcnNpb249MSx0aGlzLl9ub3RpY2VnaXZlbj0iLSIsdGhpcy5fb3B0ZWRvdXQ9Ii0iLHRoaXMuX2xzcGFjdD0iLSIsdGhpcy5fYmFzZVN0cmluZz1udWxsfXJldHVybiBkKGUsW3trZXk6ImJhc2VTdHJpbmciLHNldDpmdW5jdGlvbihlKXt0aGlzLl9iYXNlU3RyaW5nPWV9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYXNlU3RyaW5nfX0se2tleToibm90aWNlZ2l2ZW4iLHNldDpmdW5jdGlvbihlKXt0aGlzLl9ub3RpY2VnaXZlbj1lfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm90aWNlZ2l2ZW59fSx7a2V5OiJvcHRlZG91dCIsc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX29wdGVkb3V0PWV9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcHRlZG91dH19LHtrZXk6ImxzcGFjdCIsc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2xzcGFjdD1lfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbHNwYWN0fX0se2tleToidXNwVmVyc2lvbiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VzcFZlcnNpb259fV0pLGV9KCksdHQ9L15bMV1bbk55WS1dW25OeVktXVtuTnlZLV0kLyxudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtwKHRoaXMsZSksdGhpcy5fZGF0YT12b2lkIDAsdGhpcy5fZGF0YT1uZXcgZXR9cmV0dXJuIGQoZSxbe2tleToiZW5jb2RlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9kYXRhLmJhc2VTdHJpbmc9IiIuY29uY2F0KGUsIlkiKS5jb25jYXQodD8iWSI6Ik4iKS5jb25jYXQoTmUuY29yZUNvbmZpZy51c3BMc3BhY3QpLHRoaXMuX2RhdGEuYmFzZVN0cmluZ319LHtrZXk6InNldENvb2tpZSIsdmFsdWU6ZnVuY3Rpb24oZSl7InN0cmluZyI9PT10eXBlb2YgZT90dC50ZXN0KGUpJiZHZS5zZXQoUixlLCExKTplJiYibWVzc2FnZSJpbiBlJiZjb25zb2xlLmVycm9yKGUubWVzc2FnZSl9fSx7a2V5OiJnZXRDb29raWUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEdlLmdldChSKX19XSksZX0oKSxydD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7cCh0aGlzLGUpLHRoaXMuX2Nvb2tpZUFjY2Vzc0lmcmFtZT12b2lkIDAsdGhpcy5faXNDb29raWVBY2Nlc3NJZnJhbWVSZWFkeT12b2lkIDAsdGhpcy5ncm91cENvb2tpZUFjY2Vzc0NhbGxiYWNrcz12b2lkIDAsdGhpcy5fY29va2llQWNjZXNzSWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLHRoaXMuX2lzQ29va2llQWNjZXNzSWZyYW1lUmVhZHk9ITEsdGhpcy5ncm91cENvb2tpZUFjY2Vzc0NhbGxiYWNrcz17fSx0aGlzLmdyb3VwQ29va2llQWNjZXNzSGFuZGxlcj10aGlzLmdyb3VwQ29va2llQWNjZXNzSGFuZGxlci5iaW5kKHRoaXMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmdyb3VwQ29va2llQWNjZXNzSGFuZGxlciwhMSk6d2luZG93LmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NIYW5kbGVyKSx0aGlzLmNyZWF0ZUdyb3VwQ29va2llQWNjZXNzSWZyYW1lKHQuY29yZUNvbmZpZy5jb25zZW50U2NvcGVHcm91cFVSTCwiX3FjX2Nvb2tpZV9hY2Nlc3MiKX1yZXR1cm4gZChlLFt7a2V5OiJ0cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihvKXt2YXIgaT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2lzQ29va2llQWNjZXNzSWZyYW1lUmVhZHkmJnIuX2Nvb2tpZUFjY2Vzc0lmcmFtZS5jb250ZW50V2luZG93JiYoY2xlYXJJbnRlcnZhbChpKSxyLmdyb3VwQ29va2llQWNjZXNzQ2FsbChlLHQsbixmdW5jdGlvbihlKXtvKGUpfSkpfSw1MCl9KX19LHtrZXk6Imdyb3VwQ29va2llQWNjZXNzQ2FsbCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89TWF0aC5yYW5kb20oKS50b1N0cmluZygpLGk9e2NhbGxJZDpvLF9fcWNDbXBDb29raWVBY2Nlc3NDYWxsOntjbWQ6ZSxjb29raWVOYW1lOnR9fTtpZigic2V0Ij09PWUpe3RoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3Nbb109e2Nvb2tpZU5hbWU6dCxjb29raWVWYWx1ZTpufTt2YXIgcz1uZXcgRGF0ZShEYXRlLm5vdygpKzMzNjk2ZTYpLnRvVVRDU3RyaW5nKCk7aS5fX3FjQ21wQ29va2llQWNjZXNzQ2FsbC5jb29raWVWYWx1ZT1uLGkuX19xY0NtcENvb2tpZUFjY2Vzc0NhbGwuY29va2llUGF0aD1OZS5jb3JlQ29uZmlnLmNvb2tpZVBhdGgsaS5fX3FjQ21wQ29va2llQWNjZXNzQ2FsbC5leHBpcmVzPXN9ZWxzZSB0aGlzLmdyb3VwQ29va2llQWNjZXNzQ2FsbGJhY2tzW29dPXtjb29raWVOYW1lOnQscmVzb2x2ZTpyfTt0aGlzLl9jb29raWVBY2Nlc3NJZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShpLCIqIil9fSx7a2V5OiJjcmVhdGVHcm91cENvb2tpZUFjY2Vzc0lmcmFtZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jb29raWVBY2Nlc3NJZnJhbWU7bi5zcmM9ZSxuLnN0eWxlLmRpc3BsYXk9Im5vbmUiLG4uaWQ9dDshZnVuY3Rpb24gZSgpe2RvY3VtZW50LmJvZHk/ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKTpzZXRUaW1lb3V0KGUsNSl9KCl9fSx7a2V5OiJncm91cENvb2tpZUFjY2Vzc0hhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCh0PSJzdHJpbmciPT09dHlwZW9mIGUuZGF0YT8tMSE9PWUuZGF0YS5pbmRleE9mKCJfX3FjQ21wQ29va2llQWNjZXNzUmV0dXJuIik/SlNPTi5wYXJzZShlLmRhdGEpOnt9OmUuZGF0YSkuX19xY0NtcENvb2tpZUFjY2Vzc1JldHVybil7aWYodC5fX3FjQ21wQ29va2llQWNjZXNzUmV0dXJuLmlzSGFuZGxlclJlZ2lzdGVyZWQpcmV0dXJuIHZvaWQodGhpcy5faXNDb29raWVBY2Nlc3NJZnJhbWVSZWFkeT0hMCk7dmFyIG49dC5fX3FjQ21wQ29va2llQWNjZXNzUmV0dXJuLHI9dGhpcy5ncm91cENvb2tpZUFjY2Vzc0NhbGxiYWNrc1t0LmNhbGxJZF07aWYoci5yZXNvbHZlKXt2YXIgbz1udWxsOyJnZXQiPT09bi5jbWQmJihvPS0xIT09WyJldWNvbnNlbnQtdjIiLCJhZGR0bF9jb25zZW50Il0uaW5kZXhPZihyLmNvb2tpZU5hbWUpPyJldWNvbnNlbnQtdjIiPT09ci5jb29raWVOYW1lP3RoaXMucmV0dXJuTGF0ZXN0VmVuZG9yQ29va2llKG4uY29va2llcyk6bi5pc1N1Y2Nlc3M/bi5jb29raWVzWzBdOm51bGw6bi5jb29raWVzLHIucmVzb2x2ZShvKSksZGVsZXRlIHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3NbdC5jYWxsSWRdfX19fSx7a2V5OiJyZXR1cm5MYXRlc3RWZW5kb3JDb29raWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmxlbmd0aD9idChlKTpuZXcgRXJyb3IoImV1Y29uc2VudC12MiBub3QgZm91bmQuIil9fSx7a2V5OiJpc0Nvb2tpZUFjY2Vzc0lmcmFtZVJlYWR5IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nvb2tpZUFjY2Vzc0lmcmFtZVJlYWR5fX0se2tleToiY29va2llQWNjZXNzSWZyYW1lIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29va2llQWNjZXNzSWZyYW1lfX1dKSxlfSgpLG90PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3AodGhpcyxlKSx0aGlzLnZlcnNpb249dm9pZCAwLHRoaXMuX2RhdGE9dm9pZCAwLHRoaXMud2hpdGVsaXN0PXZvaWQgMCx0aGlzLnZlcnNpb249MSx0aGlzLl9kYXRhPVtdLHRoaXMud2hpdGVsaXN0PU5lLnByZW1pdW1Qcm9wZXJ0aWVzLmdvb2dsZVdoaXRlbGlzdH1yZXR1cm4gZChlLFt7a2V5OiJlbmNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBHZS5lbmNvZGUoe2Nvb2tpZU5hbWU6VSx2ZW5kb3JDb25zZW50czplLHZlcnNpb246dGhpcy52ZXJzaW9ufSl9fSx7a2V5OiJkZWNvZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBHZS5kZWNvZGUoVSxlKX19LHtrZXk6InNldENvb2tpZSIsdmFsdWU6ZnVuY3Rpb24oZSl7InN0cmluZyI9PT10eXBlb2YgZT9HZS5zZXQoVSxlLCExKTpjb25zb2xlLmVycm9yKGUubWVzc2FnZSl9fSx7a2V5OiJnZXRDb29raWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PUdlLmdldChVKTtyZXR1cm4gdCYmInN0cmluZyI9PT10eXBlb2YgdD9lP3Q6dGhpcy5kZWNvZGUodCk6bnVsbH19LHtrZXk6ImZldGNoUGFydG5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihOZS5jb3JlQ29uZmlnLmdvb2dsZUVuYWJsZWQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZS53aGl0ZWxpc3QpPT09SlNPTi5zdHJpbmdpZnkoWy0xXSk/KGUuX2RhdGE9W10sdChlLl9kYXRhKSk6ZS5fZGF0YS5sZW5ndGg+MD90KGUuX2RhdGEpOlouZ2V0KCJodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyL2dvb2dsZS1hdHAtbGlzdC5qc29uIikudGhlbihmdW5jdGlvbihuKXt2YXIgcj1bXTtmb3IodmFyIG8gaW4gbi5kYXRhKXt2YXIgaT1uLmRhdGFbb107aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgaS5wcm92aWRlcl9pZCYmIiIhPT1pLnByb3ZpZGVyX2lkJiYoSlNPTi5zdHJpbmdpZnkoZS53aGl0ZWxpc3QpPT09SlNPTi5zdHJpbmdpZnkoWzFdKXx8ZS53aGl0ZWxpc3QubGVuZ3RoPjAmJmUud2hpdGVsaXN0LmluY2x1ZGVzKHBhcnNlSW50KGkucHJvdmlkZXJfaWQpKSkpe3ZhciBzPXtuYW1lOmkucHJvdmlkZXJfbmFtZSxpZDppLnByb3ZpZGVyX2lkLHBvbGljeVVybDppLnBvbGljeV91cmwsZGVzY3JpcHRpb246aS5kb21haW5zfTtyLnB1c2gocyl9ZS5fZGF0YT1yfXQoZS5fZGF0YSl9KS5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gY29uc29sZS5sb2coZSl9KX0pfX19LHtrZXk6ImRhdGEiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX1dKSxlfSgpO0ouR1ZMLmJhc2VVcmw9Imh0dHBzOi8vcXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvR1ZMLXYyLyI7dmFyIGl0LHN0LGF0PW5ldyBLLGN0PWZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKHQpe3ZhciBuLHIsbyxpO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gbj0oTmU9dCkuY29yZUNvbmZpZyxuLmNvbnNlbnRTY29wZSxyPW4ucHJpdmFjeU1vZGUsbz1uLnB1Ymxpc2hlckNvdW50cnlDb2RlLGk9bi5zaG93U3VtbWFyeVZpZXcsIiIsaXQ9IiIsRmU9bmV3IFFlLEJlPW5ldyAkKCJpblVTIiksamU9ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUoKXt2YXIgdCxuO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gdD0iIixlLnByZXY9MSxlLm5leHQ9NCxGZS5yZWd1bGF0aW9uVG9Jbml0KCk7Y2FzZSA0OiJVU1AiPT09KHQ9ZS5zZW50KXx8ci5pbmNsdWRlcygiVVNQIik/U3QuaW5pdFVzcCgpOihuPWZ1bmN0aW9uKGUsdCxuKXtjb25zdCAkX19fb2xkXzUzYmMyYzY3MGYxOGE3ODg9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e2lmKCRfX19vbGRfNTNiYzJjNjcwZjE4YTc4OCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywibG9jYWxTdG9yYWdlIiwkX19fbW9ja19jNmU2MWQ5MmI5NDllMzQ5LmxvY2FsU3RvcmFnZSk7cmV0dXJuIGZ1bmN0aW9uKCl7ImdldFVTUERhdGEiPT09ZSYmMT09PXQmJiJmdW5jdGlvbiI9PT10eXBlb2YgbiYmbih7dmVyc2lvbjoxLHVzcFN0cmluZzoiMS0tLSJ9LCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF81M2JjMmM2NzBmMThhNzg4KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLCRfX19vbGRfNTNiYzJjNjcwZjE4YTc4OCl9fSxPYmplY3QuYXNzaWduKHdpbmRvdyx7X191c3BhcGk6bn0pKSxlLm5leHQ9MTE7YnJlYWs7Y2FzZSA4OmUucHJldj04LGUudDA9ZS5jYXRjaCgxKSxjb25zb2xlLmxvZyhlLnQwKTtjYXNlIDExOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KTtjYXNlIDEyOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLG51bGwsW1sxLDhdXSl9KSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxHZT1uZXcgQWUsSGU9bmV3IFhlLHFlPW5ldyBudCx6ZT1uZXcgJGUsS2U9bmV3IG90LEplPW5ldyBQZSxXZT1udWxsLFllPWZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKCl7dmFyIHQsbixyLGkscyxjPWFyZ3VtZW50cztyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYodD1jLmxlbmd0aD4wJiZ2b2lkIDAhPT1jWzBdJiZjWzBdLCgocj0iR0RQUiI9PT1pdCl8fHQpJiYoKFdlPW5ldyBXLlRDTW9kZWwpLmNtcElkPTEwLFdlLmNtcFZlcnNpb249QSxXZS5wdWJsaXNoZXJDb3VudHJ5Q29kZT1vLFdlLmlzU2VydmljZVNwZWNpZmljPSEwLGk9ZmUoTmUpLChzPWkucHVycG9zZUlkcykuaW5jbHVkZXMoMSl8fCgiREUiPT09bz9XZS5wdXJwb3NlT25lVHJlYXRtZW50PSEwOnMucHVzaCgxKSkpLGUucHJldj0zLCFyJiYhdCl7ZS5uZXh0PTE1O2JyZWFrfXJldHVybiBlLm5leHQ9NyxGZS5mZXRjaENvb2tpZVZhbHVlcygpO2Nhc2UgNzpyZXR1cm4gZS5uZXh0PTksSGUuZmV0Y2hMaXN0KCk7Y2FzZSA5OnJldHVybiBlLm5leHQ9MTEsRmUuZmV0Y2hEYXRhVG9SZXByb21wdCgpO2Nhc2UgMTE6aWYoIShuPWUuc2VudCkpe2UubmV4dD0xNTticmVha31yZXR1cm4gZS5uZXh0PTE1LEZlLmxvYWRHVkwoKTtjYXNlIDE1OmUubmV4dD0yMDticmVhaztjYXNlIDE3OmUucHJldj0xNyxlLnQwPWUuY2F0Y2goMyksY29uc29sZS5lcnJvcihlLnQwKTtjYXNlIDIwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIixuKTtjYXNlIDIxOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLG51bGwsW1szLDE3XV0pfSkpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksZS5uZXh0PTE3LGplKCk7Y2FzZSAxNzpyZXR1cm4gaXQ9ZS5zZW50LGUubmV4dD0yMCxZZSgpO2Nhc2UgMjA6ZS5zZW50JiYiR0RQUiI9PT1pdD9hdC5kaXNwbGF5VWkoIkdEUFIiLGk/MDoxLCEwKTpGZS51cGRhdGVBcGlWaXNpYmxlKGl0LCExKTtjYXNlIDIyOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlKX0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx1dD1mdW5jdGlvbihlKXtyZXR1cm4gaShpKGkoaSh7fSxlLmNvcmVDb25maWcpLGUucHJlbWl1bVByb3BlcnRpZXMpLGUuY29yZVVpTGFiZWxzKSxlLnByZW1pdW1VaUxhYmVscyl9LHB0PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGUuZ2V0VGltZSgpLzEwMCl9LGx0PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRGF0ZSgxMDAqZSl9LGR0PWZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmtleXModCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09ZS5pbmRleE9mKHQpfSk7cmV0dXJuIG4ubGVuZ3RoJiYodC5ub3RGb3VuZD1uKSx0fSxmdD1mdW5jdGlvbihlLHQpe3JldHVybiEoIWUmJiJhbHdheXMiIT09dCl9LGh0PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIHQmJnQubGVuZ3RoPjA/KHQuZm9yRWFjaChmdW5jdGlvbih0KXt2b2lkIDAhPT1lW3RdP25bdF09ZVt0XTpuW3RdPSExfSksbik6ZX0sdnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGUoRGF0ZS5ub3coKSsxZTMqZS5tYXhBZ2UpLnRvVVRDU3RyaW5nKCksbj0iaHR0cHM6Ij09PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD8iO1NhbWVTaXRlPUxheDtzZWN1cmUiOiIiLHI9TmUuY29yZUNvbmZpZy5jb29raWVQYXRofHwiLyI7ZG9jdW1lbnQuY29va2llPWUuY29va2llTmFtZSsiPSIrZS5lbmNvZGVkVmFsdWUrIjtwYXRoPSIrcisiO21heC1hZ2U9IitlLm1heEFnZSsiO2V4cGlyZXM9Iit0KyI7ZG9tYWluPSIrTmUuY29yZUNvbmZpZy5jb29raWVEb21haW4rbn0seXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHdlLlRDU3RyaW5nLmVuY29kZShlKX0sZ3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHdlLlRDU3RyaW5nLmRlY29kZShlKX0sbXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7c3dpdGNoKGUpe2Nhc2UiZmlyZWZveCI6dD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlKT4tMTticmVhaztjYXNlInNhZmFyaSI6dD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlKT4tMSYmLTE9PT1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2hyb21lIil9cmV0dXJuIHR9LGJ0PWZ1bmN0aW9uKGUpe3ZhciB0PW51bGwsbj1uZXcgRXJyb3IoImV1Y29uc2VudC12MiBub3QgdmFsaWQiKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW51bGw7dHJ5e3I9Z3QoZSl9Y2F0Y2gobyl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGRlY29kZSBldWNvbnNlbnQtdjIgY29va2llOiAiK2UpfXImJnIubGFzdFVwZGF0ZWQmJnIubGFzdFVwZGF0ZWQ+dCYmKHQ9ci5sYXN0VXBkYXRlZCxuPWUpfSksbn0sQ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIHQ9dGhpcztwKHRoaXMsZSksdGhpcy5jbXBBcGk9dm9pZCAwLHRoaXMuaXNJbml0aWFsaXplZD12b2lkIDAsdGhpcy5jb25maWc9dm9pZCAwLHRoaXMuTXlDdXN0b21Db21tYW5kcz12b2lkIDA7dmFyIG4scj13aW5kb3cuX190Y2ZhcGkoKTtyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJiJpbml0Ij09PWVbMF0mJihuPWVbM10pfSksdGhpcy5pc0luaXRpYWxpemVkPSExO3ZhciBvPSJ0aGlyZFBhcnR5U3RvcmFnZVR5cGUiaW4gbi5jb3JlQ29uZmlnP24uY29yZUNvbmZpZy50aGlyZFBhcnR5U3RvcmFnZVR5cGU6ImlmcmFtZSIsaT0iY29uc2VudFNjb3BlImluIG4uY29yZUNvbmZpZz9uLmNvcmVDb25maWcuY29uc2VudFNjb3BlOiJzZXJ2aWNlIixzPSJjb25zZW50U2NvcGVHcm91cFVSTCJpbiBuLmNvcmVDb25maWc/bi5jb3JlQ29uZmlnLmNvbnNlbnRTY29wZUdyb3VwVVJMOiIiO2kuaW5jbHVkZXMoImdyb3VwIikmJiJpZnJhbWUiPT09byYmcyYmKHN0PW5ldyBydChuKSksdGhpcy5NeUN1c3RvbUNvbW1hbmRzPXtnZXRDb25maWc6ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmdldENvbmZpZyhuKSxvPSExOyJvYmplY3QiPT09dHlwZW9mIHImJihvPSEwKSxlKHIsbyl9LGdldE5vbklBQlZlbmRvckNvbnNlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKG4scil7dmFyIG8saTtyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUubmV4dD0yLHQuZ2V0Tm9uSUFCVmVuZG9yQ29uc2VudHMocik7Y2FzZSAyOm89ZS5zZW50LGk9ITEsIm9iamVjdCI9PT10eXBlb2YgbyYmKGk9ITApLG4obyxpKTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUpfSkpO3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksZGlzcGxheUNvbnNlbnRVaTpmdW5jdGlvbihlKXtyZXR1cm4gZSh0LmRpc3BsYXlDb25zZW50VWkoKSl9LHNldENvbnNlbnRJbmZvOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUoRmUuc2V0Q29uc2VudHModCkpfSxzZXRQdWJsaXNoZXJSZXN0cmljdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiBlKEZlLnNldFB1Ymxpc2hlclJlc3RyaWN0aW9uKHQpKX0sbm90aWZ5VWlTdGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBlKEZlLnVwZGF0ZUFwaVZpc2libGUodC5yZWd1bGF0aW9uLHQudmlzaWJsZSkpfSxpbml0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIGUodC5pbml0KG4pKX19LHRoaXMuYWRkR2V0VENEYXRhVG9TdXBwb3J0R29vZ2xlKG4pLHRoaXMuY21wQXBpPW5ldyBnLkNtcEFwaSgxMCxBLCEwLHRoaXMuTXlDdXN0b21Db21tYW5kcyl9cmV0dXJuIGQoZSxbe2tleToiYWRkR2V0VENEYXRhVG9TdXBwb3J0R29vZ2xlIix2YWx1ZTpmdW5jdGlvbihlKXtpZigiZ29vZ2xlRW5hYmxlZCJpbiBlLmNvcmVDb25maWcmJmUuY29yZUNvbmZpZy5nb29nbGVFbmFibGVkKXt2YXIgdD1mdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0LG4pe3ZhciByLG87cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKCJvYmplY3QiIT09dHlwZW9mIG4pe2UubmV4dD04O2JyZWFrfWlmKCFGZS5mZXRjaENvb2tpZXNDYWxsZWQpe2UubmV4dD04O2JyZWFrfWlmKEZlLmNvb2tpZVZhbHVlcy5mZXRjaGVkKXtlLm5leHQ9NTticmVha31yZXR1cm4gZS5uZXh0PTUsRmUuY29va2llVmFsdWVzLnByb21pc2U7Y2FzZSA1OnI9RmUuY29va2llVmFsdWVzLmdvb2dsZUNvb2tpZVZhbHVlLG89cj9oZShyKTp2b2lkIDAsbi5hZGR0bENvbnNlbnQ9bztjYXNlIDg6ImZ1bmN0aW9uIj09PXR5cGVvZiB0JiYoImJvb2xlYW4iPT09dHlwZW9mIG4/dChuKTp0KG4sITApKTtjYXNlIDk6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUpfSkpO3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7dGhpcy5NeUN1c3RvbUNvbW1hbmRzLmdldFRDRGF0YT10LHRoaXMuTXlDdXN0b21Db21tYW5kcy5nZXRJbkFwcFRDRGF0YT10fX19LHtrZXk6ImRpc3BsYXlDb25zZW50VWkiLHZhbHVlOmZ1bmN0aW9uKCl7YXQuZGlzcGxheVVpKCJHRFBSIiwxLCExKX19LHtrZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMuaXNJbml0aWFsaXplZD0hMCx0aGlzLmNvbmZpZ3x8KHRoaXMuY29uZmlnPW5ldyB6KGUpLHRoaXMuY29uZmlnLmluaXRpYWxpemVDb25maWcoKSksY3QodGhpcy5jb25maWcpO2NvbnNvbGUud2FybigiaW5pdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgc2hvdWxkIG9ubHkgYmUgcnVuIG9uZSB0aW1lLiIpfX0se2tleToiZ2V0Q29uZmlnIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiYWxsIjtpZih0aGlzLmNvbmZpZylzd2l0Y2goZSl7Y2FzZSJhbGwiOnJldHVybntjb3JlQ29uZmlnOnRoaXMuY29uZmlnLmNvcmVDb25maWcsY29yZVVpTGFiZWxzOnRoaXMuY29uZmlnLmNvcmVVaUxhYmVscyxwcmVtaXVtUHJvcGVydGllczp0aGlzLmNvbmZpZy5wcmVtaXVtUHJvcGVydGllcyxwcmVtaXVtVWlMYWJlbHM6dGhpcy5jb25maWcucHJlbWl1bVVpTGFiZWxzLHRoZW1lOnRoaXMuY29uZmlnLnRoZW1lLG5vbklhYlZlbmRvcnNJbmZvOnRoaXMuY29uZmlnLm5vbklhYlZlbmRvcnNJbmZvfTtjYXNlIkNvcmUgQ29uZmlnIjpyZXR1cm4gdGhpcy5jb25maWcuY29yZUNvbmZpZztjYXNlIlByZW1pdW0gUHJvcGVydGllcyI6cmV0dXJuIHRoaXMuY29uZmlnLnByZW1pdW1Qcm9wZXJ0aWVzO2Nhc2UiQ29yZSBVSSBMYWJlbHMiOnJldHVybiB0aGlzLmNvbmZpZy5jb3JlVWlMYWJlbHM7Y2FzZSJQcmVtaXVtIFVJIExhYmVscyI6cmV0dXJuIHRoaXMuY29uZmlnLnByZW1pdW1VaUxhYmVscztjYXNlIlRoZW1lIjpyZXR1cm4gdGhpcy5jb25maWcudGhlbWU7Y2FzZSJOb24gSWFiIFZlbmRvcnMgSW5mbyI6cmV0dXJuIHRoaXMuY29uZmlnLm5vbklhYlZlbmRvcnNJbmZvO2RlZmF1bHQ6dmFyIHQ9dXQodGhpcy5jb25maWcpO2lmKHRbZV0pcmV0dXJuIHRbZV07Y29uc29sZS53YXJuKCciJy5jb25jYXQoZSwnIjogd2FzIG5vdCBmb3VuZCBpbiBjb25maWdzJykpfWVsc2UgY29uc29sZS5lcnJvcigiU2hvdWxkIHJ1biBpbml0IGJlZm9yZSBydW5uaW5nIGdldENvbmZpZyIpfX0se2tleToiZ2V0Q29uZmlnSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uZmlnfX0se2tleToiZ2V0Tm9uSUFCVmVuZG9yQ29uc2VudHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKHQpe3ZhciBuLHIsbztyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5jb25maWcpe2UubmV4dD0xMjticmVha31pZighRmUuZmV0Y2hDb29raWVzQ2FsbGVkKXtlLm5leHQ9NTticmVha31pZihGZS5jb29raWVWYWx1ZXMuZmV0Y2hlZCl7ZS5uZXh0PTU7YnJlYWt9cmV0dXJuIGUubmV4dD01LEZlLmNvb2tpZVZhbHVlcy5wcm9taXNlO2Nhc2UgNTpyZXR1cm4gbj12ZShIZS5kZWNvZGUsRmUuY29va2llVmFsdWVzLm5vbklhYlZlbmRvckNvbnNlbnQpLHI9bnVsbCxvPSJVU1AiIT09aXQmJmZ0KEJlLmlzVXNlckluRVUsdGhpcy5jb25maWcuY29yZUNvbmZpZy5kaXNwbGF5VWkpLG4mJnQ/cj1odChuLnZlbmRvckNvbnNlbnRzLHQpOm4mJihyPWkoe30sbi52ZW5kb3JDb25zZW50cykpLGUuYWJydXB0KCJyZXR1cm4iLHtnZHByQXBwbGllczpvLG1ldGFkYXRhOnI/R2UuZW5jb2RlKGkoaSh7fSxuKSx7fSx7Y29va2llTmFtZToibm9uaWFidmVuZG9yY29uc2VudCJ9KSwhMCk6bnVsbCxub25JYWJWZW5kb3JDb25zZW50czpyfHxudWxsfSk7Y2FzZSAxMjpjb25zb2xlLmxvZygiQ29uZmlnIHdhcyBub3QgZm91bmQiKTtjYXNlIDEzOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLHRoaXMpfSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfV0pLGV9KCksX3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIHQ9dGhpcztwKHRoaXMsZSksdGhpcy5fX3VzcGFwaT12b2lkIDAsdGhpcy5fdXNwVmVyc2lvbj0xLHRoaXMuaXNVc3BKdXJpc2RpY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUobil7dmFyIHIsbyxpLHM7cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKHI9ITAsbz1OZS5jb3JlQ29uZmlnLGk9by51c3BKdXJpc2RpY3Rpb24sby5pc0FNUCl7ZS5uZXh0PTg7YnJlYWt9cmV0dXJuIGUubmV4dD01LEJlLmNoZWNrU3BlY2lmaWNMb2NhdGlvbigpO2Nhc2UgNToocz1lLnNlbnQpJiYic3RyaW5nIj09PXR5cGVvZiBzLnJlZ2lvbiYmKHM9cy5yZWdpb24udG9VcHBlckNhc2UoKSksaS5pbmNsdWRlcyhzKXx8KCJmdW5jdGlvbiI9PT10eXBlb2YgbiYmbih7dmVyc2lvbjp0Ll91c3BWZXJzaW9uLHVzcFN0cmluZzoiMS0tLSJ9LCEwKSxyPSExKTtjYXNlIDg6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLHIpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0sZSl9KSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCksdGhpcy5fX3VzcGFwaT1mdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYobj09PXQuX3VzcFZlcnNpb24paWYoImZ1bmN0aW9uIj09PXR5cGVvZiByKXRyeXt2b2lkIDAhPT1vP3RbZV0ocixvKTp0W2VdKHIpfWNhdGNoKGkpe2NvbnNvbGUuZXJyb3IoIlRoZSBmdW5jdGlvbiAiLmNvbmNhdChlLCIgaXMgbm90IGRlZmluZWQiKSl9ZWxzZSBpZih2b2lkIDA9PT1yKXRyeXt0W2VdKCl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiVGhlIGZ1bmN0aW9uICIuY29uY2F0KGUsIiBpcyBtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMiKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRoZSB0aGlyZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgY2FsbGJhY2sgZm9yIHRoZSAiLmNvbmNhdChlLCIgZnVuY3Rpb24iKSk7ZWxzZSBjb25zb2xlLndhcm4oInRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdXNwVmVyc2lvbiAxIil9fXJldHVybiBkKGUsW3trZXk6ImluaXRVc3AiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX191c3BhcGk7TmUuY29yZUNvbmZpZy5pc0FNUCYmdGhpcy5nZXRVU1BEYXRhKGZ1bmN0aW9uKHQpe3R8fGUuc2V0VXNwRGZ0RGF0YShmdW5jdGlvbihlKXt2YXIgdCxuO3Q9ITAsbj17dHlwZTpTZS5DT05TRU5UX1JFU1BPTlNFLGFjdGlvbjpMZS5BQ0NFUFQsaW5mbzplLnVzcFN0cmluZyxjb25zZW50TWV0YWRhdGE6e2NvbnNlbnRTdHJpbmdUeXBlOkllLlVTUCxnZHByQXBwbGllczohMX19LHQmJndpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobiwiKiIpfSl9KSxPYmplY3QuYXNzaWduKHdpbmRvdyx7X191c3BhcGk6dH0pfX0se2tleToidXNwUGluZyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCl7dmFyIG47cmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKCJmdW5jdGlvbiIhPT10eXBlb2YgdCl7ZS5uZXh0PTg7YnJlYWt9cmV0dXJuIGUubmV4dD0zLEJlLmNoZWNrU3BlY2lmaWNMb2NhdGlvbigpO2Nhc2UgMzoobj1lLnNlbnQpJiYib2JqZWN0Ij09PXR5cGVvZiBuJiYobj1uLnJlZ2lvbiksdCh7bW9kZTpOZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlLGp1cmlzZGljdGlvbjpOZS5jb3JlQ29uZmlnLnVzcEp1cmlzZGljdGlvbixsb2NhdGlvbjpuLGNtcExvYWRlZDohMH0sITApLGUubmV4dD05O2JyZWFrO2Nhc2UgODpjb25zb2xlLmVycm9yKCJUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgbWlzc2luZyIpO2Nhc2UgOTpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0sZSl9KSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCl9LHtrZXk6InNldFVzcERmdERhdGEiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKHQpe3ZhciBuLHIsbztyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiB0KXtlLm5leHQ9MTA7YnJlYWt9cmV0dXJuIG49TmUuY29yZUNvbmZpZy5pc0FNUD9udWxsOnFlLmdldENvb2tpZSgpLGUubmV4dD00LHRoaXMuaXNVc3BKdXJpc2RpY3Rpb24odCk7Y2FzZSA0OmlmKGUuc2VudCl7ZS5uZXh0PTc7YnJlYWt9cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDc6InN0cmluZyIhPT10eXBlb2Ygbj8ocj1xZS5lbmNvZGUodGhpcy5fdXNwVmVyc2lvbiwhMSksTmUuY29yZUNvbmZpZy5pc0FNUHx8cWUuc2V0Q29va2llKHIpLHQoe3ZlcnNpb246dGhpcy5fdXNwVmVyc2lvbix1c3BTdHJpbmc6cn0sITApKToobz1uLnNwbGl0KCIiKVswXSx0KHt2ZXJzaW9uOm8sdXNwU3RyaW5nOm59LCEwKSksZS5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6Y29uc29sZS5lcnJvcigiVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG1pc3NpbmciKTtjYXNlIDExOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLHRoaXMpfSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJzZXRVc3BEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0LG4pe3ZhciByO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZigiZnVuY3Rpb24iIT09dHlwZW9mIHQpe2UubmV4dD0xMDticmVha31yZXR1cm4gcj1xZS5lbmNvZGUodGhpcy5fdXNwVmVyc2lvbixuKSxlLm5leHQ9NCx0aGlzLmlzVXNwSnVyaXNkaWN0aW9uKHQpO2Nhc2UgNDppZihlLnNlbnQpe2UubmV4dD03O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIik7Y2FzZSA3OiJzdHJpbmciIT09dHlwZW9mIHI/dChudWxsLCExKTooTmUuY29yZUNvbmZpZy5pc0FNUHx8cWUuc2V0Q29va2llKHIpLHQoe3ZlcnNpb246dGhpcy5fdXNwVmVyc2lvbix1c3BTdHJpbmc6cixkb05vdFNlbGw6bn0sITApKSxlLm5leHQ9MTE7YnJlYWs7Y2FzZSAxMDpjb25zb2xlLmVycm9yKCJUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgbWlzc2luZyIpO2Nhc2UgMTE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19LGUsdGhpcyl9KSk7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKX0se2tleToiZ2V0VVNQRGF0YSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT11KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCl7dmFyIG4scjtyZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiB0KXtlLm5leHQ9MTA7YnJlYWt9cmV0dXJuIG49TmUuY29yZUNvbmZpZy5pc0FNUD9OZS5hbXBEYXRhLmNvbnNlbnRNZXRhZGF0YSYmTmUuYW1wRGF0YS5jb25zZW50TWV0YWRhdGEuY29uc2VudFN0cmluZ1R5cGU9PT1JZS5VU1AmJk5lLmFtcERhdGEuY29uc2VudFN0cmluZzpxZS5nZXRDb29raWUoKSxlLm5leHQ9NCx0aGlzLmlzVXNwSnVyaXNkaWN0aW9uKHQpO2Nhc2UgNDppZihlLnNlbnQpe2UubmV4dD03O2JyZWFrfXJldHVybiBlLmFicnVwdCgicmV0dXJuIik7Y2FzZSA3OiJzdHJpbmciPT09dHlwZW9mIG4/KHI9bi5zcGxpdCgiIilbMF0sdCh7dmVyc2lvbjpyLHVzcFN0cmluZzpufSwhMCkpOnQobnVsbCwhMSksZS5uZXh0PTExO2JyZWFrO2Nhc2UgMTA6Y29uc29sZS5lcnJvcigiVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG1pc3NpbmciKTtjYXNlIDExOmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLHRoaXMpfSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfSx7a2V5OiJkaXNwbGF5VXNwVWkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dShhLmEubWFyayhmdW5jdGlvbiBlKHQpe3ZhciBuLHI9YXJndW1lbnRzO3JldHVybiBhLmEud3JhcChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gbj1yLmxlbmd0aD4xJiZ2b2lkIDAhPT1yWzFdP3JbMV06MSxlLm5leHQ9Myx0aGlzLmlzVXNwSnVyaXNkaWN0aW9uKHZvaWQgMCk7Y2FzZSAzOmlmKGUuc2VudCl7ZS5uZXh0PTc7YnJlYWt9cmV0dXJuIGNvbnNvbGUud2FybigiY2Fubm90IGRpc3BsYXkgVVNQIFVJIG91dHNpZGUgb2YgY29uZmlndXJlZCBqdXJpc2RpY3Rpb24ocykiKSxlLmFicnVwdCgicmV0dXJuIik7Y2FzZSA3OjE9PT1uJiZhdC5kaXNwbGF5VWkoIlVTUCIsbik7Y2FzZSA4OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSxlLHRoaXMpfSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpfV0pLGV9KCksRXQ9bmV3IEN0LFN0PW5ldyBfdH0sLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTY2KX1dKX0pKCl9Cg=="},{"name":"sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0ICRfX19tb2NrXzcwZTBjOWI2MmUxMDAwMWQ9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7Y29uc3QgeGhyVW5zZW50PTA7Y29uc3QgeGhyT3BlbmVkPTE7Y29uc3QgeGhySGVhZGVyc1JlY2VpdmVkPTI7Y29uc3QgeGhyTG9hZGluZz0zO2NvbnN0IHhockRvbmU9NDtjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbD1TeW1ib2woImRlZmVycmVkSGFuZGxlIik7Y29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2w9U3ltYm9sKCJvbmxvYWRzdGFydCIpO2NvbnN0IHhock9uUHJvZ3Jlc3NTeW1ib2w9U3ltYm9sKCJvbnByb2dyZXNzIik7Y29uc3QgeGhyT25BYm9ydFN5bWJvbD1TeW1ib2woIm9uYWJvcnQiKTtjb25zdCB4aHJPbkVycm9yU3ltYm9sPVN5bWJvbCgib25lcnJvciIpO2NvbnN0IHhock9uTG9hZFN5bWJvbD1TeW1ib2woIm9ubG9hZCIpO2NvbnN0IHhock9uVGltZW91dFN5bWJvbD1TeW1ib2woIm9udGltZW91dCIpO2NvbnN0IHhock9uTG9hZEVuZFN5bWJvbD1TeW1ib2woIm9ubG9hZGVuZCIpO2NvbnN0IHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpO2NvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2w9U3ltYm9sKCJyZWFkeVN0YXRlIik7Y29uc3QgeGhyVGltZW91dFN5bWJvbD1TeW1ib2woInRpbWVvdXQiKTtjb25zdCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2w9U3ltYm9sKCJ3aXRoQ3JlZGVudGlhbHMiKTtjb25zdCB4aHJVcGxvYWRTeW1ib2w9U3ltYm9sKCJ1cGxvYWQiKTtjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2w9U3ltYm9sKCJyZXNwb25zZVR5cGUiKTtjb25zdCBkZWZpbmVFdmVudD0ob2JqLHN5bWJvbCk9Pntjb25zdCB0eXBlPXN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixzeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZnVuY3Rpb24oZXZlbnQpe2NvbnN0IGhhbmRsZXI9dGhpc1tzeW1ib2xdO2lmKGhhbmRsZXIpe2hhbmRsZXIuY2FsbCh0aGlzLGV2ZW50KX19KX07Y29uc3QgY2hhbmdlUmVhZHlTdGF0ZT0oeGhyLHJlYWR5U3RhdGUpPT57eGhyW3hoclJlYWR5U3RhdGVTeW1ib2xdPXJlYWR5U3RhdGU7eGhyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZWFkeXN0YXRlY2hhbmdlIikpfTtsZXQgaXNTZWFsZWQ9dHJ1ZTtjbGFzcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IGV4dGVuZHMgRXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSYmISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIil9ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTdGFydFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblByb2dyZXNzU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uQWJvcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25FcnJvclN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25UaW1lb3V0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uTG9hZEVuZFN5bWJvbCl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdfXNldCBvbmxvYWRzdGFydCh2YWx1ZSl7dGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF09dmFsdWV9Z2V0IG9ucHJvZ3Jlc3MoKXtyZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXX1zZXQgb25wcm9ncmVzcyh2YWx1ZSl7dGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXT12YWx1ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3hock9uQWJvcnRTeW1ib2xdfXNldCBvbmFib3J0KHZhbHVlKXt0aGlzW3hock9uQWJvcnRTeW1ib2xdPXZhbHVlfWdldCBvbmVycm9yKCl7cmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF19c2V0IG9uZXJyb3IodmFsdWUpe3RoaXNbeGhyT25FcnJvclN5bWJvbF09dmFsdWV9Z2V0IG9udGltZW91dCgpe3JldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF19c2V0IG9udGltZW91dCh2YWx1ZSl7dGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdPXZhbHVlfWdldCBvbmxvYWRlbmQoKXtyZXR1cm4gdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdfXNldCBvbmxvYWRlbmQodmFsdWUpe3RoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXT12YWx1ZX19ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfXN1cGVyKCl9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQ9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpYTUxIdHRwUmVxdWVzdFVwbG9hZCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lzU2VhbGVkPWZhbHNlO2NvbnN0IHhoclVwbG9hZD1uZXcgWE1MSHR0cFJlcXVlc3RVcGxvYWQ7aXNTZWFsZWQ9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6bnVsbCx3cml0YWJsZTp0cnVlfSk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclJlYWR5U3RhdGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOnhoclVuc2VudCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVGltZW91dFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6MCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpmYWxzZSx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVXBsb2FkU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVcGxvYWQsd3JpdGFibGU6ZmFsc2V9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZXNwb25zZVR5cGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiIiLHdyaXRhYmxlOnRydWV9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXX1zZXQgb25yZWFkeXN0YXRlY2hhbmdlKHZhbHVlKXt0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF09dmFsdWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXX1vcGVuKG1ldGhvZCx1cmwpe3N3aXRjaCh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKXtjYXNlIHhoclVuc2VudDpjYXNlIHhockRvbmU6e2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJPcGVuZWQpO2JyZWFrfX19c2V0UmVxdWVzdEhlYWRlcihuYW1lLHZhbHVlKXt9c2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKXt9Z2V0IHRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXX1zZXQgdGltZW91dCh2YWx1ZSl7dGhpc1t4aHJUaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgd2l0aENyZWRlbnRpYWxzKCl7cmV0dXJuIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXX1zZXQgd2l0aENyZWRlbnRpYWxzKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJPcGVuZWQ6e2JyZWFrfWRlZmF1bHQ6e3Rocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICd3aXRoQ3JlZGVudGlhbHMnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIFVOU0VOVCBvciBPUEVORUQuIil9fXRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXT0hIXZhbHVlfWdldCB1cGxvYWQoKXtyZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdfXNlbmQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT09PW51bGwpe3RoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdPXNldFRpbWVvdXQoKCk9Pnt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJEb25lKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImVycm9yIikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX0sMCl9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpfX1hYm9ydCgpe2lmKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF09PT14aHJPcGVuZWQmJnRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdIT09bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdKTt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJVbnNlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgiYWJvcnQiKSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJsb2FkZW5kIikpfX1nZXQgcmVzcG9uc2VVUkwoKXtyZXR1cm4iIn1nZXQgc3RhdHVzKCl7cmV0dXJuIDB9Z2V0IHN0YXR1c1RleHQoKXtyZXR1cm4iIn1nZXRSZXNwb25zZUhlYWRlcihuYW1lKXtyZXR1cm4gbnVsbH1vdmVycmlkZU1pbWVUeXBlKG1pbWUpe31nZXQgcmVzcG9uc2VUeXBlKCl7cmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXX1zZXQgcmVzcG9uc2VUeXBlKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJEb25lOnt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAncmVzcG9uc2VUeXBlJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBMT0FESU5HIG9yIERPTkUuIil9fXN3aXRjaCh2YWx1ZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnt0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF09dmFsdWU7YnJlYWt9fX1nZXQgcmVzcG9uc2UoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO3JldHVybiByZXNwb25zZVR5cGU9PT0iInx8cmVzcG9uc2VUeXBlPT09InRleHQiPyIiOm51bGx9Z2V0IHJlc3BvbnNlVGV4dCgpe2NvbnN0IHJlc3BvbnNlVHlwZT10aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07aWYocmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Iil7cmV0dXJuIiJ9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCB0aGUgJ3Jlc3BvbnNlVGV4dCcgcHJvcGVydHkgZnJvbSAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3QncyAncmVzcG9uc2VUeXBlJyBpcyAnJyBvciAndGV4dCcgKHdhcyAnYXJyYXlidWZmZXInKS4iKX19Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiVU5TRU5UIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJVbnNlbnR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyT3BlbmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJIRUFERVJTX1JFQ0VJVkVEIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJIZWFkZXJzUmVjZWl2ZWR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkxPQURJTkciLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockxvYWRpbmd9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkRPTkUiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockRvbmV9KTtleHBvcnRzLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3Qsd3JpdGFibGU6dHJ1ZX19KSgkX19fbW9ja183MGUwYzliNjJlMTAwMDFkKTsoZnVuY3Rpb24oKXsoZnVuY3Rpb24oRSl7dmFyIHdpbmRvdz10aGlzO2lmKHdpbmRvdy5nb29nbGV0YWcmJmdvb2dsZXRhZy5ldmFsU2NyaXB0cyl7Z29vZ2xldGFnLmV2YWxTY3JpcHRzKCl9aWYod2luZG93Lmdvb2dsZXRhZyYmZ29vZ2xldGFnLl9sb2FkZWRfKXJldHVybjt2YXIgYWE9ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX19LGJhPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PUFycmF5LnByb3RvdHlwZXx8YT09T2JqZWN0LnByb3RvdHlwZSlyZXR1cm4gYTthW2JdPWMudmFsdWU7cmV0dXJuIGF9LGNhPWZ1bmN0aW9uKGEpe2E9WyJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyxhLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWxdO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgYz1hW2JdO2lmKGMmJmMuTWF0aD09TWF0aClyZXR1cm4gY310aHJvdyBFcnJvcigiQ2Fubm90IGZpbmQgZ2xvYmFsIG9iamVjdCIpfSxkYT1jYSh0aGlzKSxlYT0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PT10eXBlb2YgU3ltYm9sKCJ4IiksbT17fSxmYT17fSxuPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZmFbYl07aWYobnVsbD09YylyZXR1cm4gYVtiXTtjPWFbY107cmV0dXJuIHZvaWQgMCE9PWM/YzphW2JdfSxwPWZ1bmN0aW9uKGEsYixjKXtpZihiKWE6e3ZhciBkPWEuc3BsaXQoIi4iKTthPTE9PT1kLmxlbmd0aDt2YXIgZT1kWzBdLGY7IWEmJmUgaW4gbT9mPW06Zj1kYTtmb3IoZT0wO2U8ZC5sZW5ndGgtMTtlKyspe3ZhciBnPWRbZV07aWYoIShnIGluIGYpKWJyZWFrIGE7Zj1mW2ddfWQ9ZFtkLmxlbmd0aC0xXTtjPWVhJiYiZXM2Ij09PWM/ZltkXTpudWxsO2I9YihjKTtudWxsIT1iJiYoYT9iYShtLGQse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpifSk6YiE9PWMmJih2b2lkIDA9PT1mYVtkXSYmKGE9MWU5Kk1hdGgucmFuZG9tKCk+Pj4wLGZhW2RdPWVhP2RhLlN5bWJvbChkKToiJGpzY3AkIithKyIkIitkKSxiYShmLGZhW2RdLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Yn0pKSl9fTtwKCJTeW1ib2wiLGZ1bmN0aW9uKGEpe2lmKGEpcmV0dXJuIGE7dmFyIGI9ZnVuY3Rpb24oZixnKXt0aGlzLmc9ZjtiYSh0aGlzLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpnfSl9O2IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307dmFyIGM9ImpzY29tcF9zeW1ib2xfIisoMWU5Kk1hdGgucmFuZG9tKCk+Pj4wKSsiXyIsZD0wLGU9ZnVuY3Rpb24oZil7aWYodGhpcyBpbnN0YW5jZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBiKGMrKGZ8fCIiKSsiXyIrZCsrLGYpfTtyZXR1cm4gZX0sImVzNiIpO3AoIlN5bWJvbC5pdGVyYXRvciIsZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4gYTthPSgwLG0uU3ltYm9sKSgiU3ltYm9sLml0ZXJhdG9yIik7Zm9yKHZhciBiPSJBcnJheSBJbnQ4QXJyYXkgVWludDhBcnJheSBVaW50OENsYW1wZWRBcnJheSBJbnQxNkFycmF5IFVpbnQxNkFycmF5IEludDMyQXJyYXkgVWludDMyQXJyYXkgRmxvYXQzMkFycmF5IEZsb2F0NjRBcnJheSIuc3BsaXQoIiAiKSxjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWRhW2JbY11dOyJmdW5jdGlvbiI9PT10eXBlb2YgZCYmImZ1bmN0aW9uIiE9dHlwZW9mIGQucHJvdG90eXBlW2FdJiZiYShkLnByb3RvdHlwZSxhLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gaGEoYWEodGhpcykpfX0pfXJldHVybiBhfSwiZXM2Iik7dmFyIGhhPWZ1bmN0aW9uKGEpe2E9e25leHQ6YX07YVtuKG0uU3ltYm9sLCJpdGVyYXRvciIpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX0scj1mdW5jdGlvbihhKXt2YXIgYj0idW5kZWZpbmVkIiE9dHlwZW9mIG0uU3ltYm9sJiZuKG0uU3ltYm9sLCJpdGVyYXRvciIpJiZhW24obS5TeW1ib2wsIml0ZXJhdG9yIildO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGlhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfSx0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQXJyYXk/YTppYShyKGEpKX0samE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbigpe307Yi5wcm90b3R5cGU9YTtyZXR1cm4gbmV3IGJ9LGthO2lmKGVhJiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKWthPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBsYTthOnt2YXIgbmE9e2E6ITB9LG9hPXt9O3RyeXtvYS5fX3Byb3RvX189bmE7bGE9b2EuYTticmVhayBhfWNhdGNoKGEpe31sYT0hMX1rYT1sYT9mdW5jdGlvbihhLGIpe2EuX19wcm90b19fPWI7aWYoYS5fX3Byb3RvX18hPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoYSsiIGlzIG5vdCBleHRlbnNpYmxlIik7cmV0dXJuIGF9Om51bGx9dmFyIHBhPWthLHU9ZnVuY3Rpb24oYSxiKXthLnByb3RvdHlwZT1qYShiLnByb3RvdHlwZSk7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTtpZihwYSlwYShhLGIpO2Vsc2UgZm9yKHZhciBjIGluIGIpaWYoInByb3RvdHlwZSIhPWMpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYixjKTtkJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxjLGQpfWVsc2UgYVtjXT1iW2NdO2EueGE9Yi5wcm90b3R5cGV9LHY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3AoIldlYWtNYXAiLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt9ZnVuY3Rpb24gYyhnKXt2YXIgaD10eXBlb2YgZztyZXR1cm4ib2JqZWN0Ij09PWgmJm51bGwhPT1nfHwiZnVuY3Rpb24iPT09aH1pZihmdW5jdGlvbigpe2lmKCFhfHwhT2JqZWN0LnNlYWwpcmV0dXJuITE7dHJ5e3ZhciBnPU9iamVjdC5zZWFsKHt9KSxoPU9iamVjdC5zZWFsKHt9KSxrPW5ldyBhKFtbZywyXSxbaCwzXV0pO2lmKDIhPWsuZ2V0KGcpfHwzIT1rLmdldChoKSlyZXR1cm4hMTtrLmRlbGV0ZShnKTtrLnNldChoLDQpO3JldHVybiFrLmhhcyhnKSYmND09ay5nZXQoaCl9Y2F0Y2gobCl7cmV0dXJuITF9fSgpKXJldHVybiBhO3ZhciBkPSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCksZT0wLGY9ZnVuY3Rpb24oZyl7dGhpcy5nPShlKz1NYXRoLnJhbmRvbSgpKzEpLnRvU3RyaW5nKCk7aWYoZyl7Zz1yKGcpO2Zvcih2YXIgaDshKGg9Zy5uZXh0KCkpLmRvbmU7KWg9aC52YWx1ZSx0aGlzLnNldChoWzBdLGhbMV0pfX07Zi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGcsaCl7aWYoIWMoZykpdGhyb3cgRXJyb3IoIkludmFsaWQgV2Vha01hcCBrZXkiKTtpZighdihnLGQpKXt2YXIgaz1uZXcgYjtiYShnLGQse3ZhbHVlOmt9KX1pZighdihnLGQpKXRocm93IEVycm9yKCJXZWFrTWFwIGtleSBmYWlsOiAiK2cpO2dbZF1bdGhpcy5nXT1oO3JldHVybiB0aGlzfTtmLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZyl7cmV0dXJuIGMoZykmJnYoZyxkKT9nW2RdW3RoaXMuZ106dm9pZCAwfTtmLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZyl7cmV0dXJuIGMoZykmJnYoZyxkKSYmdihnW2RdLHRoaXMuZyl9O2YucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihnKXtyZXR1cm4gYyhnKSYmdihnLGQpJiZ2KGdbZF0sdGhpcy5nKT9kZWxldGUgZ1tkXVt0aGlzLmddOiExfTtyZXR1cm4gZn0sImVzNiIpO3AoIk1hcCIsZnVuY3Rpb24oYSl7aWYoZnVuY3Rpb24oKXtpZighYXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGF8fCFhLnByb3RvdHlwZS5lbnRyaWVzfHwiZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LnNlYWwpcmV0dXJuITE7dHJ5e3ZhciBoPU9iamVjdC5zZWFsKHt4OjR9KSxrPW5ldyBhKHIoW1toLCJzIl1dKSk7aWYoInMiIT1rLmdldChoKXx8MSE9ay5zaXplfHxrLmdldCh7eDo0fSl8fGsuc2V0KHt4OjR9LCJ0IikhPWt8fDIhPWsuc2l6ZSlyZXR1cm4hMTt2YXIgbD1rLmVudHJpZXMoKSxxPWwubmV4dCgpO2lmKHEuZG9uZXx8cS52YWx1ZVswXSE9aHx8InMiIT1xLnZhbHVlWzFdKXJldHVybiExO3E9bC5uZXh0KCk7cmV0dXJuIHEuZG9uZXx8NCE9cS52YWx1ZVswXS54fHwidCIhPXEudmFsdWVbMV18fCFsLm5leHQoKS5kb25lPyExOiEwfWNhdGNoKG1hKXtyZXR1cm4hMX19KCkpcmV0dXJuIGE7dmFyIGI9bmV3IG0uV2Vha01hcCxjPWZ1bmN0aW9uKGgpe3RoaXMuaD17fTt0aGlzLmc9ZigpO3RoaXMuc2l6ZT0wO2lmKGgpe2g9cihoKTtmb3IodmFyIGs7IShrPWgubmV4dCgpKS5kb25lOylrPWsudmFsdWUsdGhpcy5zZXQoa1swXSxrWzFdKX19O2MucHJvdG90eXBlLnNldD1mdW5jdGlvbihoLGspe2g9MD09PWg/MDpoO3ZhciBsPWQodGhpcyxoKTtsLmxpc3R8fChsLmxpc3Q9dGhpcy5oW2wuaWRdPVtdKTtsLm0/bC5tLnZhbHVlPWs6KGwubT17bmV4dDp0aGlzLmcsczp0aGlzLmcucyxoZWFkOnRoaXMuZyxrZXk6aCx2YWx1ZTprfSxsLmxpc3QucHVzaChsLm0pLHRoaXMuZy5zLm5leHQ9bC5tLHRoaXMuZy5zPWwubSx0aGlzLnNpemUrKyk7cmV0dXJuIHRoaXN9O2MucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihoKXtoPWQodGhpcyxoKTtyZXR1cm4gaC5tJiZoLmxpc3Q/KGgubGlzdC5zcGxpY2UoaC5pbmRleCwxKSxoLmxpc3QubGVuZ3RofHxkZWxldGUgdGhpcy5oW2guaWRdLGgubS5zLm5leHQ9aC5tLm5leHQsaC5tLm5leHQucz1oLm0ucyxoLm0uaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Yy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmg9e307dGhpcy5nPXRoaXMuZy5zPWYoKTt0aGlzLnNpemU9MH07Yy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGgpe3JldHVybiEhZCh0aGlzLGgpLm19O2MucHJvdG90eXBlLmdldD1mdW5jdGlvbihoKXtyZXR1cm4oaD1kKHRoaXMsaCkubSkmJmgudmFsdWV9O2MucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGZ1bmN0aW9uKGgpe3JldHVybltoLmtleSxoLnZhbHVlXX0pfTtjLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcyxmdW5jdGlvbihoKXtyZXR1cm4gaC5rZXl9KX07Yy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcyxmdW5jdGlvbihoKXtyZXR1cm4gaC52YWx1ZX0pfTtjLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGgsayl7Zm9yKHZhciBsPXRoaXMuZW50cmllcygpLHE7IShxPWwubmV4dCgpKS5kb25lOylxPXEudmFsdWUsaC5jYWxsKGsscVsxXSxxWzBdLHRoaXMpfTtjLnByb3RvdHlwZVtuKG0uU3ltYm9sLCJpdGVyYXRvciIpXT1jLnByb3RvdHlwZS5lbnRyaWVzO3ZhciBkPWZ1bmN0aW9uKGgsayl7dmFyIGw9ayYmdHlwZW9mIGs7Im9iamVjdCI9PWx8fCJmdW5jdGlvbiI9PWw/Yi5oYXMoayk/bD1iLmdldChrKToobD0iIisgKytnLGIuc2V0KGssbCkpOmw9InBfIitrO3ZhciBxPWguaFtsXTtpZihxJiZ2KGguaCxsKSlmb3IoaD0wO2g8cS5sZW5ndGg7aCsrKXt2YXIgbWE9cVtoXTtpZihrIT09ayYmbWEua2V5IT09bWEua2V5fHxrPT09bWEua2V5KXJldHVybntpZDpsLGxpc3Q6cSxpbmRleDpoLG06bWF9fXJldHVybntpZDpsLGxpc3Q6cSxpbmRleDotMSxtOnZvaWQgMH19LGU9ZnVuY3Rpb24oaCxrKXt2YXIgbD1oLmc7cmV0dXJuIGhhKGZ1bmN0aW9uKCl7aWYobCl7Zm9yKDtsLmhlYWQhPWguZzspbD1sLnM7Zm9yKDtsLm5leHQhPWwuaGVhZDspcmV0dXJuIGw9bC5uZXh0LHtkb25lOiExLHZhbHVlOmsobCl9O2w9bnVsbH1yZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fSl9LGY9ZnVuY3Rpb24oKXt2YXIgaD17fTtyZXR1cm4gaC5zPWgubmV4dD1oLmhlYWQ9aH0sZz0wO3JldHVybiBjfSwiZXM2Iik7dmFyIHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuIitjKyIgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihiIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuIitjKyIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4gYSsiIn07cCgiQXJyYXkucHJvdG90eXBlLmZpbmQiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjKXthOnt2YXIgZD10aGlzO2QgaW5zdGFuY2VvZiBTdHJpbmcmJihkPVN0cmluZyhkKSk7Zm9yKHZhciBlPWQubGVuZ3RoLGY9MDtmPGU7ZisrKXt2YXIgZz1kW2ZdO2lmKGIuY2FsbChjLGcsZixkKSl7Yj1nO2JyZWFrIGF9fWI9dm9pZCAwfXJldHVybiBifX0sImVzNiIpO3AoIlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3ZhciBkPXFhKHRoaXMsYiwic3RhcnRzV2l0aCIpLGU9ZC5sZW5ndGgsZj1iLmxlbmd0aDtjPU1hdGgubWF4KDAsTWF0aC5taW4oY3wwLGQubGVuZ3RoKSk7Zm9yKHZhciBnPTA7ZzxmJiZjPGU7KWlmKGRbYysrXSE9YltnKytdKXJldHVybiExO3JldHVybiBnPj1mfX0sImVzNiIpO3AoIlN0cmluZy5wcm90b3R5cGUucmVwZWF0IixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGIpe3ZhciBjPXFhKHRoaXMsbnVsbCwicmVwZWF0Iik7aWYoMD5ifHwxMzQyMTc3Mjc5PGIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgY291bnQgdmFsdWUiKTtifD0wO2Zvcih2YXIgZD0iIjtiOylpZihiJjEmJihkKz1jKSxiPj4+PTEpYys9YztyZXR1cm4gZH19LCJlczYiKTt2YXIgcmE9ZnVuY3Rpb24oYSxiKXthIGluc3RhbmNlb2YgU3RyaW5nJiYoYSs9IiIpO3ZhciBjPTAsZD0hMSxlPXtuZXh0OmZ1bmN0aW9uKCl7aWYoIWQmJmM8YS5sZW5ndGgpe3ZhciBmPWMrKztyZXR1cm57dmFsdWU6YihmLGFbZl0pLGRvbmU6ITF9fWQ9ITA7cmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfX19O2VbbihtLlN5bWJvbCwiaXRlcmF0b3IiKV09ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIGV9O3AoIlN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjKXt2YXIgZD1xYSh0aGlzLG51bGwsInBhZFN0YXJ0Iik7Yi09ZC5sZW5ndGg7Yz12b2lkIDAhPT1jP1N0cmluZyhjKToiICI7cmV0dXJuKDA8YiYmYz9uKGMsInJlcGVhdCIpLmNhbGwoYyxNYXRoLmNlaWwoYi9jLmxlbmd0aCkpLnN1YnN0cmluZygwLGIpOiIiKStkfX0sImVzOCIpO3AoIkFycmF5LnByb3RvdHlwZS5rZXlzIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKCl7cmV0dXJuIHJhKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGJ9KX19LCJlczYiKTtwKCJBcnJheS5wcm90b3R5cGUudmFsdWVzIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKCl7cmV0dXJuIHJhKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gY30pfX0sImVzOCIpO3AoIlNldCIsZnVuY3Rpb24oYSl7aWYoZnVuY3Rpb24oKXtpZighYXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGF8fCFhLnByb3RvdHlwZS5lbnRyaWVzfHwiZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LnNlYWwpcmV0dXJuITE7dHJ5e3ZhciBjPU9iamVjdC5zZWFsKHt4OjR9KSxkPW5ldyBhKHIoW2NdKSk7aWYoIWQuaGFzKGMpfHwxIT1kLnNpemV8fGQuYWRkKGMpIT1kfHwxIT1kLnNpemV8fGQuYWRkKHt4OjR9KSE9ZHx8MiE9ZC5zaXplKXJldHVybiExO3ZhciBlPWQuZW50cmllcygpLGY9ZS5uZXh0KCk7aWYoZi5kb25lfHxmLnZhbHVlWzBdIT1jfHxmLnZhbHVlWzFdIT1jKXJldHVybiExO2Y9ZS5uZXh0KCk7cmV0dXJuIGYuZG9uZXx8Zi52YWx1ZVswXT09Y3x8NCE9Zi52YWx1ZVswXS54fHxmLnZhbHVlWzFdIT1mLnZhbHVlWzBdPyExOmUubmV4dCgpLmRvbmV9Y2F0Y2goZyl7cmV0dXJuITF9fSgpKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGMpe3RoaXMuZz1uZXcgbS5NYXA7aWYoYyl7Yz1yKGMpO2Zvcih2YXIgZDshKGQ9Yy5uZXh0KCkpLmRvbmU7KXRoaXMuYWRkKGQudmFsdWUpfXRoaXMuc2l6ZT10aGlzLmcuc2l6ZX07Yi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGMpe2M9MD09PWM/MDpjO3RoaXMuZy5zZXQoYyxjKTt0aGlzLnNpemU9dGhpcy5nLnNpemU7cmV0dXJuIHRoaXN9O2IucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihjKXtjPXRoaXMuZy5kZWxldGUoYyk7dGhpcy5zaXplPXRoaXMuZy5zaXplO3JldHVybiBjfTtiLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuZy5jbGVhcigpO3RoaXMuc2l6ZT0wfTtiLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuZy5oYXMoYyl9O2IucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nLmVudHJpZXMoKX07Yi5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5nLCJ2YWx1ZXMiKS5jYWxsKHRoaXMuZyl9O2IucHJvdG90eXBlLmtleXM9bihiLnByb3RvdHlwZSwidmFsdWVzIik7Yi5wcm90b3R5cGVbbihtLlN5bWJvbCwiaXRlcmF0b3IiKV09bihiLnByb3RvdHlwZSwidmFsdWVzIik7Yi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihjLGQpe3ZhciBlPXRoaXM7dGhpcy5nLmZvckVhY2goZnVuY3Rpb24oZil7cmV0dXJuIGMuY2FsbChkLGYsZixlKX0pfTtyZXR1cm4gYn0sImVzNiIpO3AoIk9iamVjdC5pcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3JldHVybiBiPT09Yz8wIT09Ynx8MS9iPT09MS9jOmIhPT1iJiZjIT09Y319LCJlczYiKTtwKCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzO2QgaW5zdGFuY2VvZiBTdHJpbmcmJihkPVN0cmluZyhkKSk7dmFyIGU9ZC5sZW5ndGg7Yz1jfHwwO2ZvcigwPmMmJihjPU1hdGgubWF4KGMrZSwwKSk7YzxlO2MrKyl7dmFyIGY9ZFtjXTtpZihmPT09Ynx8bihPYmplY3QsImlzIikuY2FsbChPYmplY3QsZixiKSlyZXR1cm4hMH1yZXR1cm4hMX19LCJlczciKTtwKCJTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGIsYyl7cmV0dXJuLTEhPT1xYSh0aGlzLGIsImluY2x1ZGVzIikuaW5kZXhPZihiLGN8fDApfX0sImVzNiIpO3ZhciB3PXRoaXN8fHNlbGYsc2E9ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCIuIik7Zm9yKHZhciBiPXcsYz0wO2M8YS5sZW5ndGg7YysrKWlmKGI9YlthW2NdXSxudWxsPT1iKXJldHVybiBudWxsO3JldHVybiBifSx2YT1mdW5jdGlvbihhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsdGEpJiZhW3RhXXx8KGFbdGFdPSsrdWEpfSx0YT0iY2xvc3VyZV91aWRfIisoMWU5Kk1hdGgucmFuZG9tKCk+Pj4wKSx1YT0wLHdhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfSx4YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiLiIpO3ZhciBjPXc7YVswXWluIGN8fCJ1bmRlZmluZWQiPT10eXBlb2YgYy5leGVjU2NyaXB0fHxjLmV4ZWNTY3JpcHQoInZhciAiK2FbMF0pO2Zvcih2YXIgZDthLmxlbmd0aCYmKGQ9YS5zaGlmdCgpKTspYS5sZW5ndGh8fHZvaWQgMD09PWI/Y1tkXSYmY1tkXSE9PU9iamVjdC5wcm90b3R5cGVbZF0/Yz1jW2RdOmM9Y1tkXT17fTpjW2RdPWJ9O3ZhciB5YTt2YXIgemE9ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYztyZXR1cm4gZnVuY3Rpb24oKXtifHwoYz1hKCksYj0hMCk7cmV0dXJuIGN9fTt2YXIgQWE9ZnVuY3Rpb24oYSxiKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsYix2b2lkIDApfSxCYT1mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSxiLHZvaWQgMCl9LENhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChhLGIsdm9pZCAwKX07ZnVuY3Rpb24gRGEoYSxiKXthOntmb3IodmFyIGM9YS5sZW5ndGgsZD0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspaWYoZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKSl7Yj1lO2JyZWFrIGF9Yj0tMX1yZXR1cm4gMD5iP251bGw6InN0cmluZyI9PT10eXBlb2YgYT9hLmNoYXJBdChiKTphW2JdfWZ1bmN0aW9uIEVhKGEsYil7YTp7Zm9yKHZhciBjPSJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdCgiIik6YSxkPWEubGVuZ3RoLTE7MDw9ZDtkLS0paWYoZCBpbiBjJiZiLmNhbGwodm9pZCAwLGNbZF0sZCxhKSl7Yj1kO2JyZWFrIGF9Yj0tMX1yZXR1cm4gMD5iP251bGw6InN0cmluZyI9PT10eXBlb2YgYT9hLmNoYXJBdChiKTphW2JdfWZ1bmN0aW9uIEZhKGEsYil7cmV0dXJuIDA8PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYSxiLHZvaWQgMCl9ZnVuY3Rpb24gR2EoYSl7dmFyIGI9W10sYz0wLGQ7Zm9yKGQgaW4gYSliW2MrK109YVtkXTtyZXR1cm4gYn12YXIgSGE9e2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsY29tbWFuZDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfTt2YXIgS2E9ZnVuY3Rpb24oYSxiKXt0aGlzLmg9YT09PUlhJiZifHwiIjt0aGlzLmk9SmF9O0thLnByb3RvdHlwZS51PSEwO0thLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaH07dmFyIExhPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgS2EmJmEuY29uc3RydWN0b3I9PT1LYSYmYS5pPT09SmE/YS5oOiJ0eXBlX2Vycm9yOkNvbnN0In0seD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEthKElhLGEpfSxKYT17fSxJYT17fTt2YXIgeT1mdW5jdGlvbihhLGIpe3RoaXMuaT1iPT09TWE/YToiIn07eS5wcm90b3R5cGUudT0hMDt5LnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaS50b1N0cmluZygpfTt5LnByb3RvdHlwZS5qPSEwO3kucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4gMX07dmFyIFFhPWZ1bmN0aW9uKGEsYixjKXthPU5hLmV4ZWMoT2EoYSkudG9TdHJpbmcoKSk7dmFyIGQ9YVszXXx8IiI7cmV0dXJuIG5ldyB5KGFbMV0rUGEoIj8iLGFbMl18fCIiLGIpK1BhKCIjIixkLGMpLE1hKX07eS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pKyIifTt2YXIgT2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB5JiZhLmNvbnN0cnVjdG9yPT09eT9hLmk6InR5cGVfZXJyb3I6VHJ1c3RlZFJlc291cmNlVXJsIn0sVGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MYShhKTtpZighUmEudGVzdChjKSl0aHJvdyBFcnJvcigiSW52YWxpZCBUcnVzdGVkUmVzb3VyY2VVcmwgZm9ybWF0OiAiK2MpO2E9Yy5yZXBsYWNlKFNhLGZ1bmN0aW9uKGQsZSl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGUpKXRocm93IEVycm9yKCdGb3VuZCBtYXJrZXIsICInK2UrJyIsIGluIGZvcm1hdCBzdHJpbmcsICInK2MrJyIsIGJ1dCBubyB2YWxpZCBsYWJlbCBtYXBwaW5nIGZvdW5kIGluIGFyZ3M6ICcrSlNPTi5zdHJpbmdpZnkoYikpO2Q9YltlXTtyZXR1cm4gZCBpbnN0YW5jZW9mIEthP0xhKGQpOmVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZCkpfSk7cmV0dXJuIG5ldyB5KGEsTWEpfSxTYT0vJXsoXHcrKX0vZyxSYT0vXigoaHR0cHM6KT9cL1wvWzAtOWEtei46W1xdLV0rXC98XC9bXi9cXF18W146L1xcJV0rXC98W146L1xcJV0qWz8jXXxhYm91dDpibGFuayMpL2ksTmE9L14oW14/I10qKShcP1teI10qKT8oI1tcc1xTXSopPy8sVWE9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1MYShhW2NdKTtyZXR1cm4gbmV3IHkoYixNYSl9LE1hPXt9LFBhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1jKXJldHVybiBiO2lmKCJzdHJpbmciPT09dHlwZW9mIGMpcmV0dXJuIGM/YStlbmNvZGVVUklDb21wb25lbnQoYyk6IiI7Zm9yKHZhciBkIGluIGMpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsZCkpe3ZhciBlPWNbZF07ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO251bGwhPWcmJihifHwoYj1hKSxiKz0oYi5sZW5ndGg+YS5sZW5ndGg/IiYiOiIiKStlbmNvZGVVUklDb21wb25lbnQoZCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZykpKX19cmV0dXJuIGJ9O3ZhciBWYT1mdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfSxjYj1mdW5jdGlvbihhKXtpZighV2EudGVzdChhKSlyZXR1cm4gYTstMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShYYSwiJmFtcDsiKSk7LTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoWWEsIiZsdDsiKSk7LTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoWmEsIiZndDsiKSk7LTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoJGEsIiZxdW90OyIpKTstMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShhYiwiJiMzOTsiKSk7LTEhPWEuaW5kZXhPZigiXDAiKSYmKGE9YS5yZXBsYWNlKGJiLCImIzA7IikpO3JldHVybiBhfSxYYT0vJi9nLFlhPS88L2csWmE9Lz4vZywkYT0vIi9nLGFiPS8nL2csYmI9L1x4MDAvZyxXYT0vW1x4MDAmPD4iJ10vLGViPWZ1bmN0aW9uKGEsYil7dmFyIGM9MDthPVZhKFN0cmluZyhhKSkuc3BsaXQoIi4iKTtiPVZhKFN0cmluZyhiKSkuc3BsaXQoIi4iKTtmb3IodmFyIGQ9TWF0aC5tYXgoYS5sZW5ndGgsYi5sZW5ndGgpLGU9MDswPT1jJiZlPGQ7ZSsrKXt2YXIgZj1hW2VdfHwiIixnPWJbZV18fCIiO2Rve2Y9LyhcZCopKFxEKikoLiopLy5leGVjKGYpfHxbIiIsIiIsIiIsIiJdO2c9LyhcZCopKFxEKikoLiopLy5leGVjKGcpfHxbIiIsIiIsIiIsIiJdO2lmKDA9PWZbMF0ubGVuZ3RoJiYwPT1nWzBdLmxlbmd0aClicmVhaztjPWRiKDA9PWZbMV0ubGVuZ3RoPzA6cGFyc2VJbnQoZlsxXSwxMCksMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSl8fGRiKDA9PWZbMl0ubGVuZ3RoLDA9PWdbMl0ubGVuZ3RoKXx8ZGIoZlsyXSxnWzJdKTtmPWZbM107Zz1nWzNdfXdoaWxlKDA9PWMpfXJldHVybiBjfSxkYj1mdW5jdGlvbihhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6MH07dmFyIHo9ZnVuY3Rpb24oYSxiKXt0aGlzLmk9Yj09PWZiP2E6IiJ9O3oucHJvdG90eXBlLnU9ITA7ei5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmkudG9TdHJpbmcoKX07ei5wcm90b3R5cGUuaj0hMDt6LnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O3oucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaS50b1N0cmluZygpfTt2YXIgZ2I9L14oPzphdWRpb1wvKD86M2dwcDJ8M2dwcHxhYWN8TDE2fG1pZGl8bXAzfG1wNHxtcGVnfG9nYXxvZ2d8b3B1c3x4LW00YXx4LW1hdHJvc2thfHgtd2F2fHdhdnx3ZWJtKXxmb250XC9cdyt8aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicHx4LWljb24pfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibXxxdWlja3RpbWV8eC1tYXRyb3NrYSkpKD86O1x3Kz0oPzpcdyt8IltcdzssPSBdKyIpKSokL2ksaGI9L15kYXRhOiguKik7YmFzZTY0LFthLXowLTkrXC9dKz0qJC9pLGliPS9eKD86KD86aHR0cHM/fG1haWx0b3xmdHApOnxbXjovPyNdKig/OlsvPyNdfCQpKS9pLGZiPXt9LGpiPW5ldyB6KCJhYm91dDppbnZhbGlkI3pDbG9zdXJleiIsZmIpO3ZhciBBO2E6e3ZhciBrYj13Lm5hdmlnYXRvcjtpZihrYil7dmFyIGxiPWtiLnVzZXJBZ2VudDtpZihsYil7QT1sYjticmVhayBhfX1BPSIifXZhciBCPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmk9Yz09PW1iP2E6IiI7dGhpcy5sPWJ9O0IucHJvdG90eXBlLmo9ITA7Qi5wcm90b3R5cGUuaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmx9O0IucHJvdG90eXBlLnU9ITA7Qi5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmkudG9TdHJpbmcoKX07Qi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pLnRvU3RyaW5nKCl9O3ZhciBuYj1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEImJmEuY29uc3RydWN0b3I9PT1CP2EuaToidHlwZV9lcnJvcjpTYWZlSHRtbCJ9LG9iPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBCKXJldHVybiBhO3ZhciBiPSJvYmplY3QiPT10eXBlb2YgYSxjPW51bGw7YiYmYS5qJiYoYz1hLmgoKSk7YT1jYihiJiZhLnU/YS5nKCk6U3RyaW5nKGEpKTtyZXR1cm4gbmV3IEIoYSxjLG1iKX0scGI9L15bYS16QS1aMC05LV0rJC8scWI9e2FjdGlvbjohMCxjaXRlOiEwLGRhdGE6ITAsZm9ybWFjdGlvbjohMCxocmVmOiEwLG1hbmlmZXN0OiEwLHBvc3RlcjohMCxzcmM6ITB9LHNiPWZ1bmN0aW9uKGEsYil7dmFyIGM9e3NyYzphfSxkPXt9O2E9e307Zm9yKHZhciBlIGluIGMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsZSkmJihhW2VdPWNbZV0pO2ZvcihlIGluIGQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsZSkmJihhW2VdPWRbZV0pO2lmKGIpZm9yKGUgaW4gYilpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYixlKSl7dmFyIGY9ZS50b0xvd2VyQ2FzZSgpO2lmKGYgaW4gYyl0aHJvdyBFcnJvcigiIik7ZiBpbiBkJiZkZWxldGUgYVtmXTthW2VdPWJbZV19Yj1udWxsO2U9IiI7aWYoYSlmb3IoZyBpbiBhKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGcpKXtpZighcGIudGVzdChnKSl0aHJvdyBFcnJvcigiIik7ZD1hW2ddO2lmKG51bGwhPWQpe2M9ZztpZihkIGluc3RhbmNlb2YgS2EpZD1MYShkKTtlbHNle2lmKCJzdHlsZSI9PWMudG9Mb3dlckNhc2UoKSl0aHJvdyBFcnJvcigiIik7aWYoL15vbi9pLnRlc3QoYykpdGhyb3cgRXJyb3IoIiIpO2lmKGMudG9Mb3dlckNhc2UoKWluIHFiKWlmKGQgaW5zdGFuY2VvZiB5KWQ9T2EoZCkudG9TdHJpbmcoKTtlbHNlIGlmKGQgaW5zdGFuY2VvZiB6KWQ9ZCBpbnN0YW5jZW9mIHomJmQuY29uc3RydWN0b3I9PT16P2QuaToidHlwZV9lcnJvcjpTYWZlVXJsIjtlbHNlIGlmKCJzdHJpbmciPT09dHlwZW9mIGQpZCBpbnN0YW5jZW9mIHp8fChkPSJvYmplY3QiPT10eXBlb2YgZCYmZC51P2QuZygpOlN0cmluZyhkKSxpYi50ZXN0KGQpP2Q9bmV3IHooZCxmYik6KGQ9U3RyaW5nKGQpLGQ9ZC5yZXBsYWNlKC8oJTBBfCUwRCkvZywiIiksZD0oZj1kLm1hdGNoKGhiKSkmJmdiLnRlc3QoZlsxXSk/bmV3IHooZCxmYik6bnVsbCkpLGQ9KGR8fGpiKS5nKCk7ZWxzZSB0aHJvdyBFcnJvcigiIil9ZC51JiYoZD1kLmcoKSk7Yz1jKyc9IicrY2IoU3RyaW5nKGQpKSsnIic7ZSs9IiAiK2N9fXZhciBnPSI8c2NyaXB0IitlO2U9dm9pZCAwO251bGw9PWU/ZT1bXTpBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pOyEwPT09SGEuc2NyaXB0P2crPSI+IjooYj1yYihlKSxnKz0iPiIrbmIoYikudG9TdHJpbmcoKSsiPFwvc2NyaXB0PiIsYj1iLmgoKSk7KGE9YSYmYS5kaXIpJiYoL14obHRyfHJ0bHxhdXRvKSQvaS50ZXN0KGEpP2I9MDpiPW51bGwpO3JldHVybiBuZXcgQihnLGIsbWIpfSx1Yj1mdW5jdGlvbihhKXt2YXIgYj1vYih0YiksYz1iLmgoKSxkPVtdLGU9ZnVuY3Rpb24oZil7QXJyYXkuaXNBcnJheShmKT9mLmZvckVhY2goZSk6KGY9b2IoZiksZC5wdXNoKG5iKGYpLnRvU3RyaW5nKCkpLGY9Zi5oKCksMD09Yz9jPWY6MCE9ZiYmYyE9ZiYmKGM9bnVsbCkpfTthLmZvckVhY2goZSk7cmV0dXJuIG5ldyBCKGQuam9pbihuYihiKS50b1N0cmluZygpKSxjLG1iKX0scmI9ZnVuY3Rpb24oYSl7cmV0dXJuIHViKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfSxtYj17fSx0Yj1uZXcgQih3LnRydXN0ZWRUeXBlcyYmdy50cnVzdGVkVHlwZXMuZW1wdHlIVE1MfHwiIiwwLG1iKTt2YXIgdmI9ZnVuY3Rpb24oYSxiKXthLndyaXRlKG5iKGIpKX0seGI9ZnVuY3Rpb24oKXthOnt2YXIgYT13LmRvY3VtZW50O2lmKGEucXVlcnlTZWxlY3RvciYmKGE9YS5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbbm9uY2VdIikpJiYoYT1hLm5vbmNlfHxhLmdldEF0dHJpYnV0ZSgibm9uY2UiKSkmJndiLnRlc3QoYSkpYnJlYWsgYTthPSIifXJldHVybiBhfSx3Yj0vXltcdysvXy1dK1s9XXswLDJ9JC87dmFyIHliPXt9LHpiPW51bGwsQmI9ZnVuY3Rpb24oYSl7dmFyIGI7dm9pZCAwPT09YiYmKGI9MCk7QWIoKTtiPXliW2JdO2Zvcih2YXIgYz1BcnJheShNYXRoLmZsb29yKGEubGVuZ3RoLzMpKSxkPWJbNjRdfHwiIixlPTAsZj0wO2U8YS5sZW5ndGgtMjtlKz0zKXt2YXIgZz1hW2VdLGg9YVtlKzFdLGs9YVtlKzJdLGw9YltnPj4yXTtnPWJbKGcmMyk8PDR8aD4+NF07aD1iWyhoJjE1KTw8MnxrPj42XTtrPWJbayY2M107Y1tmKytdPWwrZytoK2t9bD0wO2s9ZDtzd2l0Y2goYS5sZW5ndGgtZSl7Y2FzZSAyOmw9YVtlKzFdLGs9YlsobCYxNSk8PDJdfHxkO2Nhc2UgMTphPWFbZV0sY1tmXT1iW2E+PjJdK2JbKGEmMyk8PDR8bD4+NF0raytkfXJldHVybiBjLmpvaW4oIiIpfSxEYj1mdW5jdGlvbihhKXt2YXIgYj1bXTtDYihhLGZ1bmN0aW9uKGMpe2IucHVzaChjKX0pO3JldHVybiBifSxDYj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoayl7Zm9yKDtkPGEubGVuZ3RoOyl7dmFyIGw9YS5jaGFyQXQoZCsrKSxxPXpiW2xdO2lmKG51bGwhPXEpcmV0dXJuIHE7aWYoIS9eW1xzXHhhMF0qJC8udGVzdChsKSl0aHJvdyBFcnJvcigiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogIitsKX1yZXR1cm4ga31BYigpO2Zvcih2YXIgZD0wOzspe3ZhciBlPWMoLTEpLGY9YygwKSxnPWMoNjQpLGg9Yyg2NCk7aWYoNjQ9PT1oJiYtMT09PWUpYnJlYWs7YihlPDwyfGY+PjQpOzY0IT1nJiYoYihmPDw0JjI0MHxnPj4yKSw2NCE9aCYmYihnPDw2JjE5MnxoKSl9fSxBYj1mdW5jdGlvbigpe2lmKCF6Yil7emI9e307Zm9yKHZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIuc3BsaXQoIiIpLGI9WyIrLz0iLCIrLyIsIi1fPSIsIi1fLiIsIi1fIl0sYz0wOzU+YztjKyspe3ZhciBkPWEuY29uY2F0KGJbY10uc3BsaXQoIiIpKTt5YltjXT1kO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO3ZvaWQgMD09PXpiW2ZdJiYoemJbZl09ZSl9fX19O3ZhciBFYj0iZnVuY3Rpb24iPT09dHlwZW9mIFVpbnQ4QXJyYXk7ZnVuY3Rpb24gRmIoYSxiLGMpe3JldHVybiJvYmplY3QiPT09dHlwZW9mIGE/RWImJiFBcnJheS5pc0FycmF5KGEpJiZhIGluc3RhbmNlb2YgVWludDhBcnJheT9jKGEpOkdiKGEsYixjKTpiKGEpfWZ1bmN0aW9uIEdiKGEsYixjKXtpZihBcnJheS5pc0FycmF5KGEpKXtmb3IodmFyIGQ9QXJyYXkoYS5sZW5ndGgpLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGY9YVtlXTtudWxsIT1mJiYoZFtlXT1GYihmLGIsYykpfUFycmF5LmlzQXJyYXkoYSkmJmEuZGEmJkhiKGQpO3JldHVybiBkfWQ9e307Zm9yKGUgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxlKSYmKGY9YVtlXSxudWxsIT1mJiYoZFtlXT1GYihmLGIsYykpKTtyZXR1cm4gZH1mdW5jdGlvbiBJYihhKXtyZXR1cm4gR2IoYSxmdW5jdGlvbihiKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBiP2lzTmFOKGIpfHxJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/U3RyaW5nKGIpOmI6Yn0sZnVuY3Rpb24oYil7cmV0dXJuIEJiKGIpfSl9dmFyIEpiPXtkYTp7dmFsdWU6ITAsY29uZmlndXJhYmxlOiEwfX0sSGI9ZnVuY3Rpb24oYSl7QXJyYXkuaXNBcnJheShhKSYmIU9iamVjdC5pc0Zyb3plbihhKSYmT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSxKYik7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7fSxLYixEPWZ1bmN0aW9uKGEsYixjLGQpe2EuZz1udWxsO0tiJiYoYnx8KGI9S2IpLEtiPW51bGwpO3ZhciBlPWEuY29uc3RydWN0b3IubWVzc2FnZUlkO2J8fChiPWU/W2VdOltdKTthLmk9ZT8wOi0xO2EuaD1iO2E6e2lmKGI9YS5oLmxlbmd0aClpZigtLWIsZT1hLmhbYl0sIShudWxsPT09ZXx8Im9iamVjdCIhPXR5cGVvZiBlfHxBcnJheS5pc0FycmF5KGUpfHxFYiYmZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXthLmw9Yi1hLmk7YS5qPWU7YnJlYWsgYX1hLmw9TnVtYmVyLk1BWF9WQUxVRX1hLm89e307aWYoYylmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKWlmKGU9Y1tiXSxlPGEubCl7ZSs9YS5pO3ZhciBmPWEuaFtlXTtmP0hiKGYpOmEuaFtlXT1MYn1lbHNlIE1iKGEpLChmPWEualtlXSk/SGIoZik6YS5qW2VdPUxiO2lmKGQmJmQubGVuZ3RoKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspTmIoYSxkW2NdKX0sTGI9T2JqZWN0LmZyZWV6ZShIYihbXSkpLE1iPWZ1bmN0aW9uKGEpe3ZhciBiPWEubCthLmk7YS5oW2JdfHwoYS5qPWEuaFtiXT17fSl9LEY9ZnVuY3Rpb24oYSxiKXtpZihiPGEubCl7Yis9YS5pO3ZhciBjPWEuaFtiXTtyZXR1cm4gYyE9PUxiP2M6YS5oW2JdPUhiKFtdKX1pZihhLmopcmV0dXJuIGM9YS5qW2JdLGMhPT1MYj9jOmEualtiXT1IYihbXSl9LEc9ZnVuY3Rpb24oYSxiLGMpe2E9RihhLGIpO3JldHVybiBudWxsPT1hP2M6YX0sT2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz12b2lkIDA9PT1jPzA6YzthPUYoYSxiKTthPW51bGw9PWE/YTorYTtyZXR1cm4gbnVsbD09YT9jOmF9LEg9ZnVuY3Rpb24oYSxiLGMpe2I8YS5sP2EuaFtiK2EuaV09YzooTWIoYSksYS5qW2JdPWMpO3JldHVybiBhfSxOYj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9YltlXSxnPUYoYSxmKTtudWxsIT1nJiYoYz1mLGQ9ZyxIKGEsZix2b2lkIDApKX1yZXR1cm4gYz8oSChhLGMsZCksYyk6MH0sST1mdW5jdGlvbihhLGIsYyl7YS5nfHwoYS5nPXt9KTtpZighYS5nW2NdKXt2YXIgZD1GKGEsYyk7ZCYmKGEuZ1tjXT1uZXcgYihkKSl9cmV0dXJuIGEuZ1tjXX0sSj1mdW5jdGlvbihhLGIsYyl7YS5nfHwoYS5nPXt9KTtpZighYS5nW2NdKXtmb3IodmFyIGQ9RihhLGMpLGU9W10sZj0wO2Y8ZC5sZW5ndGg7ZisrKWVbZl09bmV3IGIoZFtmXSk7YS5nW2NdPWV9Yj1hLmdbY107Yj09TGImJihiPWEuZ1tjXT1bXSk7cmV0dXJuIGJ9LFFiPWZ1bmN0aW9uKGEsYixjKXthLmd8fChhLmc9e30pO2M9Y3x8W107Zm9yKHZhciBkPUhiKFtdKSxlPTA7ZTxjLmxlbmd0aDtlKyspZFtlXT1QYihjW2VdKTthLmdbYl09YztIKGEsYixkKX0sUmI9ZnVuY3Rpb24oYSl7aWYoYS5nKWZvcih2YXIgYiBpbiBhLmcpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEuZyxiKSl7dmFyIGM9YS5nW2JdO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXSYmUGIoY1tkXSk7ZWxzZSBjJiZQYihjKX19LFBiPWZ1bmN0aW9uKGEpe1JiKGEpO3JldHVybiBhLmh9LFNiPWZ1bmN0aW9uKGEpe1JiKGEpO3JldHVybiBJYihhLmgpfSxUYj1mdW5jdGlvbihhLGIpe3N3aXRjaCh0eXBlb2YgYil7Y2FzZSJudW1iZXIiOnJldHVybiBpc05hTihiKXx8SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1iP1N0cmluZyhiKTpiO2Nhc2Uib2JqZWN0IjppZihFYiYmbnVsbCE9YiYmYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIEJiKGIpfXJldHVybiBifTtmdW5jdGlvbiBVYihhKXt2YXIgYixjPShhLm93bmVyRG9jdW1lbnQmJmEub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5kb2N1bWVudDsoYj0oYz1udWxsPT09KGI9Yy5xdWVyeVNlbGVjdG9yKXx8dm9pZCAwPT09Yj92b2lkIDA6Yi5jYWxsKGMsInNjcmlwdFtub25jZV0iKSk/Yy5ub25jZXx8Yy5nZXRBdHRyaWJ1dGUoIm5vbmNlIil8fCIiOiIiKSYmYS5zZXRBdHRyaWJ1dGUoIm5vbmNlIixiKX12YXIgVmI9ZnVuY3Rpb24oYSxiKXt2YXIgYz12b2lkIDA9PT1jP3t9OmM7dGhpcy5lcnJvcj1hO3RoaXMuY29udGV4dD1iLmNvbnRleHQ7dGhpcy5tc2c9Yi5tZXNzYWdlfHwiIjt0aGlzLmlkPWIuaWR8fCJqc2Vycm9yIjt0aGlzLm1ldGE9Y307dmFyIFdiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHx3LmRvY3VtZW50fHxkb2N1bWVudH07V2IucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO2E9U3RyaW5nKGEpOyJhcHBsaWNhdGlvbi94aHRtbCt4bWwiPT09Yi5jb250ZW50VHlwZSYmKGE9YS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gYi5jcmVhdGVFbGVtZW50KGEpfTtXYi5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oYSxiKXthLmFwcGVuZENoaWxkKGIpfTt2YXIgWGI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9QS5pbmRleE9mKCJpUGFkIil8fC0xIT1BLmluZGV4T2YoIkFuZHJvaWQiKSYmLTE9PUEuaW5kZXhPZigiTW9iaWxlIil8fC0xIT1BLmluZGV4T2YoIlNpbGsiKX07dmFyIFliPS9eKD86KFteOi8/Iy5dKyk6KT8oPzpcL1wvKD86KFteXFwvPyNdKilAKT8oW15cXC8/I10qPykoPzo6KFswLTldKykpPyg/PVtcXC8/I118JCkpPyhbXj8jXSspPyg/Olw/KFteI10qKSk/KD86IyhbXHNcU10qKSk/JC8sWmI9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZGVjb2RlVVJJKGEpOmF9LCRiPS8jfCQvLGFjPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zZWFyY2goJGIpO2E6e3ZhciBkPTA7Zm9yKHZhciBlPWIubGVuZ3RoOzA8PShkPWEuaW5kZXhPZihiLGQpKSYmZDxjOyl7dmFyIGY9YS5jaGFyQ29kZUF0KGQtMSk7aWYoMzg9PWZ8fDYzPT1mKWlmKGY9YS5jaGFyQ29kZUF0KGQrZSksIWZ8fDYxPT1mfHwzOD09Znx8MzU9PWYpYnJlYWsgYTtkKz1lKzF9ZD0tMX1pZigwPmQpcmV0dXJuIG51bGw7ZT1hLmluZGV4T2YoIiYiLGQpO2lmKDA+ZXx8ZT5jKWU9YztkKz1iLmxlbmd0aCsxO3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYS5zdWJzdHIoZCxlLWQpLnJlcGxhY2UoL1wrL2csIiAiKSl9O3ZhciBlYz1mdW5jdGlvbihhLGIpe2lmKCFiYygpJiYhY2MoKSl7dmFyIGM9TWF0aC5yYW5kb20oKTtpZihjPGIpcmV0dXJuIGM9ZGModyksYVtNYXRoLmZsb29yKGMqYS5sZW5ndGgpXX1yZXR1cm4gbnVsbH0sZGM9ZnVuY3Rpb24oYSl7aWYoIWEuY3J5cHRvKXJldHVybiBNYXRoLnJhbmRvbSgpO3RyeXt2YXIgYj1uZXcgVWludDMyQXJyYXkoMSk7YS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGIpO3JldHVybiBiWzBdLzY1NTM2LzY1NTM2fWNhdGNoKGMpe3JldHVybiBNYXRoLnJhbmRvbSgpfX0sZmM9ZnVuY3Rpb24oYSxiKXtpZihhKWZvcih2YXIgYyBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpJiZiLmNhbGwodm9pZCAwLGFbY10sYyxhKX0sY2M9emEoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChbIkdvb2dsZSBXZWIgUHJldmlldyIsIk1lZGlhcGFydG5lcnMtR29vZ2xlIiwiR29vZ2xlLVJlYWQtQWxvdWQiLCJHb29nbGUtQWR3b3JkcyJdLGdjLHZvaWQgMCl8fDFlLTQ+TWF0aC5yYW5kb20oKX0pLGJjPXphKGZ1bmN0aW9uKCl7cmV0dXJuIGdjKCJNU0lFIil9KSxnYz1mdW5jdGlvbihhKXtyZXR1cm4tMSE9QS5pbmRleE9mKGEpfSxoYz0vXigtP1swLTkuXXsxLDMwfSkkLyxpYz1mdW5jdGlvbihhLGIpe3JldHVybiBoYy50ZXN0KGEpJiYoYT1OdW1iZXIoYSksIWlzTmFOKGEpKT9hOnZvaWQgMD09Yj9udWxsOmJ9LGpjPWZ1bmN0aW9uKGEpe3JldHVybi9edHJ1ZSQvLnRlc3QoYSl9LGtjPXphKGZ1bmN0aW9uKCl7cmV0dXJuIFhiKCl8fC0xPT1BLmluZGV4T2YoImlQb2QiKSYmLTE9PUEuaW5kZXhPZigiaVBob25lIikmJi0xPT1BLmluZGV4T2YoIkFuZHJvaWQiKSYmLTE9PUEuaW5kZXhPZigiSUVNb2JpbGUiKT9YYigpPzE6MDoyfSksbGM9ZnVuY3Rpb24oYSxiKXthPXZvaWQgMD09PWE/IiI6YTtiPXZvaWQgMD09PWI/d2luZG93OmI7aWYoYj1aYihiLmxvY2F0aW9uLmhyZWYubWF0Y2goWWIpWzNdfHxudWxsKSlpZihhPWIrYSxiPWEubGVuZ3RoLDA9PWIpYT0wO2Vsc2V7Zm9yKHZhciBjPTMwNTQxOTg5NixkPTA7ZDxiO2QrKyljXj0oYzw8NSkrKGM+PjIpK2EuY2hhckNvZGVBdChkKSY0Mjk0OTY3Mjk1O2E9MDxjP2M6NDI5NDk2NzI5NitjfWVsc2UgYT1udWxsO3JldHVybiBhfSxtYz1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj93aW5kb3cuZG9jdW1lbnQ6YjswIT1hLmxlbmd0aCYmYi5oZWFkJiZhLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoYyl7dmFyIGQ9YjtkPXZvaWQgMD09PWQ/d2luZG93LmRvY3VtZW50OmQ7aWYoYyYmZC5oZWFkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIik7ZC5oZWFkLmFwcGVuZENoaWxkKGUpO2UuaHR0cEVxdWl2PSJvcmlnaW4tdHJpYWwiO2UuY29udGVudD1jfX19KX07dmFyIG9jPWZ1bmN0aW9uKGEsYil7dmFyIGM9Imh0dHBzOi8vcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL2dlbl8yMDQ/aWQ9IitiO2ZjKGEsZnVuY3Rpb24oZCxlKXtkJiYoYys9IiYiK2UrIj0iK2VuY29kZVVSSUNvbXBvbmVudChkKSl9KTtuYyhjKX0sbmM9ZnVuY3Rpb24oYSl7dmFyIGI9d2luZG93O2lmKGIuZmV0Y2gpYi5mZXRjaChhLHtrZWVwYWxpdmU6ITAsY3JlZGVudGlhbHM6ImluY2x1ZGUiLHJlZGlyZWN0OiJmb2xsb3ciLG1ldGhvZDoiZ2V0Iixtb2RlOiJuby1jb3JzIn0pO2Vsc2V7Yi5nb29nbGVfaW1hZ2VfcmVxdWVzdHN8fChiLmdvb2dsZV9pbWFnZV9yZXF1ZXN0cz1bXSk7dmFyIGM9Yi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtjLnNyYz1hO2IuZ29vZ2xlX2ltYWdlX3JlcXVlc3RzLnB1c2goYyl9fTt2YXIgcGM9ImEiLmNoYXJDb2RlQXQoKSxxYz1HYSh7b2E6MCxuYToxLGthOjIsZmE6MyxsYTo0LGdhOjUsbWE6NixpYTo3LGphOjgsZWE6OSxoYToxMH0pLHJjPUdhKHtxYTowLHJhOjEscGE6Mn0pO3ZhciBzYz1mdW5jdGlvbihhKXtpZigvW14wMV0vLnRlc3QoYSkpdGhyb3cgRXJyb3IoIklucHV0IGJpdHN0cmluZyAiK2ErIiBpcyBtYWxmb3JtZWQhIik7dGhpcy5oPWE7dGhpcy5nPTB9LHZjPWZ1bmN0aW9uKGEpe3ZhciBiPUsoYSwxNik7cmV0dXJuITA9PT0hIUsoYSwxKT8oYT10YyhhKSxhLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoYz5iKXRocm93IEVycm9yKCJJRCAiK2MrIiBpcyBwYXN0IE1heFZlbmRvcklkICIrYisiISIpfSksYSk6dWMoYSxiKX0sdGM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPUsoYSwxMiksYz1bXTtiLS07KXt2YXIgZD0hMD09PSEhSyhhLDEpLGU9SyhhLDE2KTtpZihkKWZvcihkPUsoYSwxNik7ZTw9ZDtlKyspYy5wdXNoKGUpO2Vsc2UgYy5wdXNoKGUpfWMuc29ydChmdW5jdGlvbihmLGcpe3JldHVybiBmLWd9KTtyZXR1cm4gY30sdWM9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxiO2UrKylpZihLKGEsMSkpe3ZhciBmPWUrMTtpZihjJiYtMT09PWMuaW5kZXhPZihmKSl0aHJvdyBFcnJvcigiSUQ6ICIrZisiIGlzIG91dHNpZGUgb2YgYWxsb3dlZCB2YWx1ZXMhIik7ZC5wdXNoKGYpfXJldHVybiBkfSxLPWZ1bmN0aW9uKGEsYil7aWYoYS5nK2I+YS5oLmxlbmd0aCl0aHJvdyBFcnJvcigiUmVxdWVzdGVkIGxlbmd0aCAiK2IrIiBpcyBwYXN0IGVuZCBvZiBzdHJpbmcuIik7dmFyIGM9YS5oLnN1YnN0cmluZyhhLmcsYS5nK2IpO2EuZys9YjtyZXR1cm4gcGFyc2VJbnQoYywyKX07dmFyIHhjPWZ1bmN0aW9uKGEsYil7dHJ5e3ZhciBjPURiKGEuc3BsaXQoIi4iKVswXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUudG9TdHJpbmcoMiksInBhZFN0YXJ0IikuY2FsbChlLnRvU3RyaW5nKDIpLDgsIjAiKX0pLmpvaW4oIiIpLGQ9bmV3IHNjKGMpO2M9e307Yy50Y1N0cmluZz1hO2MuZ2RwckFwcGxpZXM9ITA7ZC5nKz03ODtjLmNtcElkPUsoZCwxMik7Yy5jbXBWZXJzaW9uPUsoZCwxMik7ZC5nKz0zMDtjLnRjZlBvbGljeVZlcnNpb249SyhkLDYpO2MuaXNTZXJ2aWNlU3BlY2lmaWM9ISFLKGQsMSk7Yy51c2VOb25TdGFuZGFyZFN0YWNrcz0hIUsoZCwxKTtjLnNwZWNpYWxGZWF0dXJlT3B0aW5zPXdjKHVjKGQsMTIscmMpLHJjKTtjLnB1cnBvc2U9e2NvbnNlbnRzOndjKHVjKGQsMjQscWMpLHFjKSxsZWdpdGltYXRlSW50ZXJlc3RzOndjKHVjKGQsMjQscWMpLHFjKX07Yy5wdXJwb3NlT25lVHJlYXRtZW50PSEhSyhkLDEpO2MucHVibGlzaGVyQ0M9U3RyaW5nLmZyb21DaGFyQ29kZShwYytLKGQsNikpK1N0cmluZy5mcm9tQ2hhckNvZGUocGMrSyhkLDYpKTtjLnZlbmRvcj17Y29uc2VudHM6d2ModmMoZCksYiksbGVnaXRpbWF0ZUludGVyZXN0czp3Yyh2YyhkKSxiKX07cmV0dXJuIGN9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSx3Yz1mdW5jdGlvbihhLGIpe3ZhciBjPXt9O2lmKEFycmF5LmlzQXJyYXkoYikmJjAhPT1iLmxlbmd0aCl7Yj1yKGIpO2Zvcih2YXIgZD1iLm5leHQoKTshZC5kb25lO2Q9Yi5uZXh0KCkpZD1kLnZhbHVlLGNbZF09LTEhPT1hLmluZGV4T2YoZCl9ZWxzZSBmb3IoYT1yKGEpLGQ9YS5uZXh0KCk7IWQuZG9uZTtkPWEubmV4dCgpKWNbZC52YWx1ZV09ITA7ZGVsZXRlIGNbMF07cmV0dXJuIGN9O3ZhciBMPWZ1bmN0aW9uKGEsYil7dGhpcy5nPWE7dGhpcy5kZWZhdWx0VmFsdWU9dm9pZCAwPT09Yj8hMTpifSx5Yz1mdW5jdGlvbihhLGIpe3RoaXMuZz1hO3RoaXMuZGVmYXVsdFZhbHVlPXZvaWQgMD09PWI/MDpifTt2YXIgemM9bmV3IEwoMzc0MjAxMjY4LCEwKSxBYz1uZXcgTCg1MzAsITApLEJjPW5ldyBMKDM3ODg5NjA3NCksQ2M9bmV3IGZ1bmN0aW9uKGEsYil7dGhpcy5nPWE7dGhpcy5kZWZhdWx0VmFsdWU9dm9pZCAwPT09Yj8iIjpifSg1MzEpLERjPW5ldyB5Yyg1MzIpLEVjPW5ldyBMKDM3MTM2NDIxMiwhMCksRmM9bmV3IHljKDI0KSxHYz1uZXcgTCgyMDMpLEhjPW5ldyBMKDI0MSksSWM9bmV3IHljKDE5MjksNTApLEpjPW5ldyB5YygxOTA1KSxLYz1uZXcgTCgyNDApLExjPW5ldyBMKDE5MjgpLE1jPW5ldyBMKDE5NDEpLE5jPW5ldyBMKDM3MDk0NjM0OSksT2M9bmV3IEwoMzc0MzI2NTg4KSxQYz1uZXcgTCgzNzk4NDE5MTcpLFFjPW5ldyBMKDM3NzEwNTI1OCksUmM9bmV3IHljKDE5MzUpLFNjPW5ldyBMKDE5NDIpO3ZhciBVYz1mdW5jdGlvbihhKXtEKHRoaXMsYSxUYyxudWxsKX07dShVYyxDKTt2YXIgVGM9WzZdO3ZhciBWYz1mdW5jdGlvbihhKXtEKHRoaXMsYSxudWxsLG51bGwpfTt1KFZjLEMpO3ZhciBXYz1mdW5jdGlvbihhKXtEKHRoaXMsYSxudWxsLG51bGwpfTt1KFdjLEMpO3ZhciBYYz1mdW5jdGlvbihhKXtEKHRoaXMsYSxudWxsLG51bGwpfTt1KFhjLEMpO3ZhciBZYz1mdW5jdGlvbihhKXt0aGlzLmc9YXx8e2Nvb2tpZToiIn19O1ljLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2lmKCJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBlPWMudmE7ZD1jLndhfHwhMTt2YXIgZj1jLmRvbWFpbnx8dm9pZCAwO3ZhciBnPWMucGF0aHx8dm9pZCAwO3ZhciBoPWMudWF9aWYoL1s7PVxzXS8udGVzdChhKSl0aHJvdyBFcnJvcignSW52YWxpZCBjb29raWUgbmFtZSAiJythKyciJyk7aWYoL1s7XHJcbl0vLnRlc3QoYikpdGhyb3cgRXJyb3IoJ0ludmFsaWQgY29va2llIHZhbHVlICInK2IrJyInKTt2b2lkIDA9PT1oJiYoaD0tMSk7dGhpcy5nLmNvb2tpZT1hKyI9IitiKyhmPyI7ZG9tYWluPSIrZjoiIikrKGc/IjtwYXRoPSIrZzoiIikrKDA+aD8iIjowPT1oPyI7ZXhwaXJlcz0iK25ldyBEYXRlKDE5NzAsMSwxKS50b1VUQ1N0cmluZygpOiI7ZXhwaXJlcz0iK25ldyBEYXRlKERhdGUubm93KCkrMWUzKmgpLnRvVVRDU3RyaW5nKCkpKyhkPyI7c2VjdXJlIjoiIikrKG51bGwhPWU/IjtzYW1lc2l0ZT0iK2U6IiIpfTtZYy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWErIj0iLGQ9KHRoaXMuZy5jb29raWV8fCIiKS5zcGxpdCgiOyIpLGU9MCxmO2U8ZC5sZW5ndGg7ZSsrKXtmPVZhKGRbZV0pO2lmKDA9PWYubGFzdEluZGV4T2YoYywwKSlyZXR1cm4gZi5zdWJzdHIoYy5sZW5ndGgpO2lmKGY9PWEpcmV0dXJuIiJ9cmV0dXJuIGJ9O3ZhciBaYz1mdW5jdGlvbihhKXthPShhPW5ldyBZYyhhKS5nZXQoIkZDQ0RDRiIsIiIpKT9hOm51bGw7dHJ5e2lmKGEpe3ZhciBiPWE/SlNPTi5wYXJzZShhKTpudWxsO0tiPWI7dmFyIGM9bmV3IFZjKGIpO0tiPW51bGw7dmFyIGQ9Y31lbHNlIGQ9bnVsbDtyZXR1cm4gZH1jYXRjaChlKXtyZXR1cm4gbnVsbH19LCRjPWZ1bmN0aW9uKGEpe3JldHVybihhPVpjKGEpKT9JKGEsV2MsNCk6bnVsbH07dmFyIGFkPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0cnl7dmFyIGc9YS5nLGg9YS5jcmVhdGVFbGVtZW50KCJTQ1JJUFQiKTtoLmFzeW5jPSEwO2guc3JjPU9hKGIpO1ViKGgpO2cuaGVhZC5hcHBlbmRDaGlsZChoKTtoLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7ZSgpO2QmJmcuaGVhZC5yZW1vdmVDaGlsZChoKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7MDxjP2FkKGEsYixjLTEsZCxlLGYpOihkJiZnLmhlYWQucmVtb3ZlQ2hpbGQoaCksZigpKX0pfWNhdGNoKGspe2YoKX19LGJkPWZ1bmN0aW9uKGEsYixjLGQpe2FkKGE/bmV3IFdiKDk9PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnQpOnlhfHwoeWE9bmV3IFdiKSxiLDAsITEsdm9pZCAwPT09Yz9mdW5jdGlvbigpe306Yyx2b2lkIDA9PT1kP2Z1bmN0aW9uKCl7fTpkKX07dmFyIGNkPWZ1bmN0aW9uKGEpe3RoaXMuZz1hO3RoaXMuaD1udWxsfSxlZD1mdW5jdGlvbihhKXthLl9fdGNmYXBpUG9zdE1lc3NhZ2VSZWFkeXx8ZGQobmV3IGNkKGEpKX0sZGQ9ZnVuY3Rpb24oYSl7YS5oPWZ1bmN0aW9uKGIpe3ZhciBjPSJzdHJpbmciPT10eXBlb2YgYi5kYXRhO3RyeXt2YXIgZD1jP0pTT04ucGFyc2UoYi5kYXRhKTpiLmRhdGF9Y2F0Y2goZil7cmV0dXJufXZhciBlPWQuX190Y2ZhcGlDYWxsOyFlfHwicGluZyIhPT1lLmNvbW1hbmQmJiJnZXRUQ0RhdGEiIT09ZS5jb21tYW5kJiYiYWRkRXZlbnRMaXN0ZW5lciIhPT1lLmNvbW1hbmQmJiJyZW1vdmVFdmVudExpc3RlbmVyIiE9PWUuY29tbWFuZHx8YS5nLl9fdGNmYXBpKGUuY29tbWFuZCxlLnZlcnNpb24sZnVuY3Rpb24oZixnKXt2YXIgaD17fTtoLl9fdGNmYXBpUmV0dXJuPSJyZW1vdmVFdmVudExpc3RlbmVyIj09PWUuY29tbWFuZD97c3VjY2VzczpmLGNhbGxJZDplLmNhbGxJZH06e3JldHVyblZhbHVlOmYsc3VjY2VzczpnLGNhbGxJZDplLmNhbGxJZH07Zj1jP0pTT04uc3RyaW5naWZ5KGgpOmg7Yi5zb3VyY2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5zb3VyY2UucG9zdE1lc3NhZ2UmJmIuc291cmNlLnBvc3RNZXNzYWdlKGYsYi5vcmlnaW4pO3JldHVybiBmfSxlLnBhcmFtZXRlcil9O2EuZy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhLmgpO2EuZy5fX3RjZmFwaVBvc3RNZXNzYWdlUmVhZHk9ITB9O3ZhciBmZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZG9jdW1lbnQsZD1hP25ldyBXYig5PT1hLm5vZGVUeXBlP2E6YS5vd25lckRvY3VtZW50fHxhLmRvY3VtZW50KTp5YXx8KHlhPW5ldyBXYiksZT1mdW5jdGlvbigpe2lmKCFhLmZyYW1lc1tiXSlpZihjLmJvZHkpe3ZhciBmPWQuY3JlYXRlRWxlbWVudCgiSUZSQU1FIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnN0eWxlLndpZHRoPSIwcHgiO2Yuc3R5bGUuaGVpZ2h0PSIwcHgiO2Yuc3R5bGUuYm9yZGVyPSJub25lIjtmLnN0eWxlLnpJbmRleD0iLTEwMDAiO2Yuc3R5bGUubGVmdD0iLTEwMDBweCI7Zi5zdHlsZS50b3A9Ii0xMDAwcHgiO2YubmFtZT1iO2MuYm9keS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0VGltZW91dChlLDUpfTtlKCl9O3ZhciBnZD1mdW5jdGlvbihhKXt0aGlzLmc9YTt0aGlzLmg9YS5kb2N1bWVudDt0aGlzLmw9KGE9KGE9WmModGhpcy5oKSk/SShhLFhjLDUpfHxudWxsOm51bGwpP0YoYSwyKTpudWxsO3RoaXMuaj0oYT0kYyh0aGlzLmgpKSYmbnVsbCE9RihhLDEpP0YoYSwxKTpudWxsO3RoaXMuaT0oYT0kYyh0aGlzLmgpKSYmbnVsbCE9RihhLDIpP0YoYSwyKTpudWxsfSxqZD1mdW5jdGlvbihhKXthLl9fdXNwYXBpfHxhLmZyYW1lcy5fX3VzcGFwaUxvY2F0b3J8fChhPW5ldyBnZChhKSxoZChhKSxpZChhKSl9LGhkPWZ1bmN0aW9uKGEpeyFhLmx8fGEuZy5fX3VzcGFwaXx8YS5nLmZyYW1lcy5fX3VzcGFwaUxvY2F0b3J8fChhLmcuX191c3BhcGlNYW5hZ2VyPSJmYyIsZmQoYS5nLCJfX3VzcGFwaUxvY2F0b3IiKSx4YSgiX191c3BhcGkiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtyZXR1cm4gYS5BLmFwcGx5KGEsdChjKSl9KSl9O2dkLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEsYixjKXsiZnVuY3Rpb24iPT09dHlwZW9mIGMmJiJnZXRVU1BEYXRhIj09PWEmJmMoe3ZlcnNpb246MSx1c3BTdHJpbmc6dGhpcy5sfSwhMCl9O3ZhciBpZD1mdW5jdGlvbihhKXshYS5qfHxhLmcuX190Y2ZhcGl8fGEuZy5mcmFtZXMuX190Y2ZhcGlMb2NhdG9yfHwoYS5nLl9fdGNmYXBpTWFuYWdlcj0iZmMiLGZkKGEuZywiX190Y2ZhcGlMb2NhdG9yIiksYS5nLl9fdGNmYXBpRXZlbnRMaXN0ZW5lcnM9YS5nLl9fdGNmYXBpRXZlbnRMaXN0ZW5lcnN8fFtdLHhhKCJfX3RjZmFwaSIsZnVuY3Rpb24oYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZF09YXJndW1lbnRzW2RdO3JldHVybiBhLm8uYXBwbHkoYSx0KGMpKX0pLGVkKGEuZykpfTtnZC5wcm90b3R5cGUubz1mdW5jdGlvbihhLGIsYyxkKXtkPXZvaWQgMD09PWQ/bnVsbDpkO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYylpZihiJiYyIT09YiljKG51bGwsITEpO2Vsc2Ugc3dpdGNoKGI9dGhpcy5nLl9fdGNmYXBpRXZlbnRMaXN0ZW5lcnMsYSl7Y2FzZSJnZXRUQ0RhdGEiOiFkfHxBcnJheS5pc0FycmF5KGQpJiZkLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT09dHlwZW9mIGV9KT9jKGtkKHRoaXMsZCxudWxsKSwhMCk6YyhudWxsLCExKTticmVhaztjYXNlInBpbmciOmMoe2dkcHJBcHBsaWVzOiEwLGNtcExvYWRlZDohMCxjbXBTdGF0dXM6ImxvYWRlZCIsZGlzcGxheVN0YXR1czoiZGlzYWJsZWQiLGFwaVZlcnNpb246IjIuMCIsY21wVmVyc2lvbjoxLGNtcElkOjMwMH0pO2JyZWFrO2Nhc2UiYWRkRXZlbnRMaXN0ZW5lciI6YT1iLnB1c2goYyk7YyhrZCh0aGlzLG51bGwsYS0xKSwhMCk7YnJlYWs7Y2FzZSJyZW1vdmVFdmVudExpc3RlbmVyIjpiW2RdPyhiW2RdPW51bGwsYyghMCkpOmMoITEpO2JyZWFrO2Nhc2UiZ2V0SW5BcHBUQ0RhdGEiOmNhc2UiZ2V0VmVuZG9yTGlzdCI6YyhudWxsLCExKX19O3ZhciBrZD1mdW5jdGlvbihhLGIsYyl7aWYoIWEuailyZXR1cm4gbnVsbDtiPXhjKGEuaixiKTtiLmFkZHRsQ29uc2VudD1udWxsIT1hLmk/YS5pOnZvaWQgMDtiLmNtcFN0YXR1cz0ibG9hZGVkIjtiLmV2ZW50U3RhdHVzPSJ0Y2xvYWRlZCI7bnVsbCE9YyYmKGIubGlzdGVuZXJJZD1jKTtyZXR1cm4gYn07dmFyIE09ZnVuY3Rpb24oYSl7aWYoYS5JJiZhLmhhc093blByb3BlcnR5KCJJIikpcmV0dXJuIGEuSTt2YXIgYj1uZXcgYTtyZXR1cm4gYS5JPWJ9O3ZhciBsZD1mdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZz1mdW5jdGlvbihiLGMpe3JldHVybiBudWxsIT1hW2JdP2FbYl06Y307dGhpcy5oPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIG51bGwhPWFbYl0/YVtiXTpjfTt0aGlzLmo9ZnVuY3Rpb24oYixjKXtyZXR1cm4gbnVsbCE9YVtiXT9hW2JdOmN9O3RoaXMubD1mdW5jdGlvbihiLGMpe3JldHVybiBudWxsIT1hW2JdP2FbYl06Y307dGhpcy5pPWZ1bmN0aW9uKCl7fX0sTj1mdW5jdGlvbihhKXtyZXR1cm4gTShsZCkuZyhhLmcsYS5kZWZhdWx0VmFsdWUpfSxtZD1mdW5jdGlvbihhKXtyZXR1cm4gTShsZCkuaChhLmcsYS5kZWZhdWx0VmFsdWUpfTt2YXIgbmQ9ZnVuY3Rpb24oKXt0aGlzLmo9dGhpcy5qO3RoaXMuaT10aGlzLml9O25kLnByb3RvdHlwZS5qPSExO25kLnByb3RvdHlwZS5KPWZ1bmN0aW9uKCl7aWYodGhpcy5pKWZvcig7dGhpcy5pLmxlbmd0aDspdGhpcy5pLnNoaWZ0KCkoKX07dmFyIG9kPWZ1bmN0aW9uKGEsYil7dGhpcy5nPWE7dGhpcy5oPWJ9O29kLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RyeXtmZCh0aGlzLmcsImdvb2dsZWZjUHJlc2VudCIpLHBkKHRoaXMpfWNhdGNoKGEpe319O3ZhciBwZD1mdW5jdGlvbihhKXt2YXIgYj1UYSh4KCJodHRwczovL2Z1bmRpbmdjaG9pY2VzbWVzc2FnZXMuZ29vZ2xlLmNvbS9pLyV7aWR9P2Vycz0le2Vyc30iKSx7aWQ6YS5oLGVyczo1fSk7YmQoYS5nLGIsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSl9O3ZhciBxZD1udWxsLHJkPWZ1bmN0aW9uKCl7aWYobnVsbD09PXFkKXtxZD0iIjt0cnl7dmFyIGE9IiI7dHJ5e2E9dy50b3AubG9jYXRpb24uaGFzaH1jYXRjaChjKXthPXcubG9jYXRpb24uaGFzaH1pZihhKXt2YXIgYj1hLm1hdGNoKC9cYmRlaWQ9KFtcZCxdKykvKTtxZD1iP2JbMV06IiJ9fWNhdGNoKGMpe319cmV0dXJuIHFkfTt2YXIgdWQ9ZnVuY3Rpb24oYSl7RCh0aGlzLGEsc2QsdGQpfTt1KHVkLEMpO3ZhciBzZD1bMiw4XSx0ZD1bWzMsNCw1XSxbNiw3XV07dmFyIHZkO3ZkPXtzYTowLGFhOjMsYmE6NCxjYTo1fTt2YXIgd2Q9dmQuYWEsTz12ZC5iYSxQPXZkLmNhLHhkPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPyFhOmF9LHlkPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXSgpO2lmKGU9PT1iKXJldHVybiBlO251bGw9PWUmJihjPSEwKX1pZighYylyZXR1cm4hYn0sQWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1KKGEsdWQsMik7aWYoIWMubGVuZ3RoKXJldHVybiB6ZChhLGIpO2E9RyhhLDEsMCk7aWYoMT09PWEpcmV0dXJuIHhkKEFkKGNbMF0sYikpO2M9Q2EoYyxmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gQWQoZCxiKX19KTtzd2l0Y2goYSl7Y2FzZSAyOnJldHVybiB5ZChjLCExKTtjYXNlIDM6cmV0dXJuIHlkKGMsITApfX0semQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1OYihhLHRkWzBdKTthOntzd2l0Y2goYyl7Y2FzZSB3ZDp2YXIgZD1HKGEsMywwKTticmVhayBhO2Nhc2UgTzpkPUcoYSw0LDApO2JyZWFrIGE7Y2FzZSBQOmQ9RyhhLDUsMCk7YnJlYWsgYX1kPXZvaWQgMH1pZihkJiYoYj0oYj1iW2NdKSYmYltkXSkpe3RyeXt2YXIgZT1iLmFwcGx5KG51bGwsdChGKGEsOCkpKX1jYXRjaChmKXtyZXR1cm59Yj1HKGEsMSwwKTtpZig0PT09YilyZXR1cm4hIWU7ZD1udWxsIT1lO2lmKDU9PT1iKXJldHVybiBkO2lmKDEyPT09YilhPUcoYSw3LCIiKTtlbHNlIGE6e3N3aXRjaChjKXtjYXNlIE86YT1PYihhLDYpO2JyZWFrIGE7Y2FzZSBQOmE9RyhhLDcsIiIpO2JyZWFrIGF9YT12b2lkIDB9aWYobnVsbCE9YSl7aWYoNj09PWIpcmV0dXJuIGU9PT1hO2lmKDk9PT1iKXJldHVybiBudWxsIT1lJiYwPT09ZWIoU3RyaW5nKGUpLGEpO2lmKGQpc3dpdGNoKGIpe2Nhc2UgNzpyZXR1cm4gZTxhO2Nhc2UgODpyZXR1cm4gZT5hO2Nhc2UgMTI6cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYSYmInN0cmluZyI9PT10eXBlb2YgZSYmbmV3IFJlZ0V4cChhKS50ZXN0KGUpO2Nhc2UgMTA6cmV0dXJuIG51bGwhPWUmJi0xPT09ZWIoU3RyaW5nKGUpLGEpO2Nhc2UgMTE6cmV0dXJuIG51bGwhPWUmJjE9PT1lYihTdHJpbmcoZSksYSl9fX19LEJkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIWF8fCEoIWJ8fCFBZChhLGIpKX07dmFyIERkPWZ1bmN0aW9uKGEpe0QodGhpcyxhLENkLG51bGwpfTt1KERkLEMpO3ZhciBDZD1bNF07dmFyIEVkPWZ1bmN0aW9uKGEpe0QodGhpcyxhLG51bGwsbnVsbCl9O3UoRWQsQyk7dmFyIFE9ZnVuY3Rpb24oYSl7RCh0aGlzLGEsRmQsR2QpfTt1KFEsQyk7dmFyIEZkPVs1XSxHZD1bWzEsMiwzLDYsN11dO3ZhciBSPWZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nPShhW3dkXT17fSxhW09dPXt9LGFbUF09e30sYSl9O3ZhciBIZD1qYygiZmFsc2UiKTt2YXIgSWQ9SGQsSmQ9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAxOnJldHVybiBHKGEsMSwwKTtjYXNlIDI6cmV0dXJuIEcoYSwyLDApO2Nhc2UgMzpyZXR1cm4gRyhhLDMsMCk7Y2FzZSA2OnJldHVybiBHKGEsNiwwKTtkZWZhdWx0OnJldHVybiBudWxsfX0sS2Q9ZnVuY3Rpb24oYSxiKXtpZighYSlyZXR1cm4gbnVsbDtzd2l0Y2goYil7Y2FzZSAxOnZhciBjPXZvaWQgMD09PWM/ITE6YzthPUYoYSwxKTthPW51bGw9PWE/YTohIWE7cmV0dXJuIG51bGw9PWE/YzphO2Nhc2UgNzpyZXR1cm4gRyhhLDMsIiIpO2Nhc2UgMjpyZXR1cm4gT2IoYSwyKTtjYXNlIDM6cmV0dXJuIEcoYSwzLCIiKTtjYXNlIDY6cmV0dXJuIEYoYSw0KTtkZWZhdWx0OnJldHVybiBudWxsfX0sTGQ9emEoZnVuY3Rpb24oKXtpZighSWQpcmV0dXJue307dHJ5e3ZhciBhPXdpbmRvdy5zZXNzaW9uU3RvcmFnZSYmd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIkdHREZTU0siKTtpZihhKXJldHVybiBKU09OLnBhcnNlKGEpfWNhdGNoKGIpe31yZXR1cm57fX0pLE9kPWZ1bmN0aW9uKGEsYixjLGQpe2Q9dm9pZCAwPT09ZD8wOmQ7dmFyIGU9TGQoKTtpZihudWxsIT1lW2JdKXJldHVybiBlW2JdO2I9TWQoZClbYl07aWYoIWIpcmV0dXJuIGM7Yj1uZXcgUShiKTtiPU5kKGIpO2E9S2QoYixhKTtyZXR1cm4gbnVsbCE9YT9hOmN9LE5kPWZ1bmN0aW9uKGEpe3ZhciBiPU0oUikuZztpZihiKXt2YXIgYz1FYShKKGEsRWQsNSksZnVuY3Rpb24oZCl7cmV0dXJuIEJkKEkoZCx1ZCwxKSxiKX0pO2lmKGMpcmV0dXJuIEkoYyxEZCwyKX1yZXR1cm4gSShhLERkLDQpfSxQZD1mdW5jdGlvbigpe3RoaXMuZz17fTt0aGlzLmg9W119LFFkPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIU9kKDEsYSx2b2lkIDA9PT1iPyExOmIsYyl9LFJkPWZ1bmN0aW9uKGEsYixjKXtiPXZvaWQgMD09PWI/MDpiO2E9TnVtYmVyKE9kKDIsYSxiLGMpKTtyZXR1cm4gaXNOYU4oYSk/YjphfSxTZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIE9kKDMsYSx2b2lkIDA9PT1iPyIiOmIsYyl9LFRkPWZ1bmN0aW9uKGEsYixjKXtiPXZvaWQgMD09PWI/W106YjtyZXR1cm4gT2QoNixhLGIsYyl9LE1kPWZ1bmN0aW9uKGEpe3JldHVybiBNKFBkKS5nW2FdfHwoTShQZCkuZ1thXT17fSl9LFVkPWZ1bmN0aW9uKGEsYil7dmFyIGM9TWQoYik7ZmMoYSxmdW5jdGlvbihkLGUpe3JldHVybiBjW2VdPWR9KX0sVmQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1NZChiKTtBYShhLGZ1bmN0aW9uKGQpe3ZhciBlPU5iKGQsR2RbMF0pOyhlPUpkKGQsZSkpJiYoY1tlXT1TYihkKSl9KX0sV2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1NZChiKTtBYShhLGZ1bmN0aW9uKGQpe3ZhciBlPW5ldyBRKGQpLGY9TmIoZSxHZFswXSk7KGU9SmQoZSxmKSkmJihjW2VdfHwoY1tlXT1kKSl9KX0sWGQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ2EobihPYmplY3QsImtleXMiKS5jYWxsKE9iamVjdCxNKFBkKS5nKSxmdW5jdGlvbihhKXtyZXR1cm4gTnVtYmVyKGEpfSl9LFlkPWZ1bmN0aW9uKGEpe0ZhKE0oUGQpLmgsYSl8fFVkKE1kKDQpLGEpfTt2YXIgUz1mdW5jdGlvbihhKXt0aGlzLm1ldGhvZE5hbWU9YX0sWmQ9bmV3IFMoMSksJGQ9bmV3IFMoMTUpLGFlPW5ldyBTKDIpLGJlPW5ldyBTKDMpLGNlPW5ldyBTKDQpLGRlPW5ldyBTKDUpLGVlPW5ldyBTKDYpLGZlPW5ldyBTKDcpLGdlPW5ldyBTKDgpLGhlPW5ldyBTKDkpLGllPW5ldyBTKDEwKSxqZT1uZXcgUygxMSksa2U9bmV3IFMoMTIpLGxlPW5ldyBTKDEzKSxtZT1uZXcgUygxNCksVD1mdW5jdGlvbihhLGIsYyl7Yy5oYXNPd25Qcm9wZXJ0eShhLm1ldGhvZE5hbWUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTdHJpbmcoYS5tZXRob2ROYW1lKSx7dmFsdWU6Yn0pfSxVPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYlthLm1ldGhvZE5hbWVdfHxjfHxmdW5jdGlvbigpe319LG5lPWZ1bmN0aW9uKGEpe1QoZGUsUWQsYSk7VChlZSxSZCxhKTtUKGZlLFNkLGEpO1QoZ2UsVGQsYSk7VChsZSxXZCxhKTtUKCRkLFlkLGEpfSxvZT1mdW5jdGlvbihhKXtUKGNlLGZ1bmN0aW9uKGIpe00oUikuZz1ifSxhKTtUKGhlLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9TShSKTtkLmdbd2RdW2JdfHwoZC5nW3dkXVtiXT1jKX0sYSk7VChpZSxmdW5jdGlvbihiLGMpe3ZhciBkPU0oUik7ZC5nW09dW2JdfHwoZC5nW09dW2JdPWMpfSxhKTtUKGplLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9TShSKTtkLmdbUF1bYl18fChkLmdbUF1bYl09Yyl9LGEpO1QobWUsZnVuY3Rpb24oYil7Zm9yKHZhciBjPU0oUiksZD1yKFt3ZCxPLFBdKSxlPWQubmV4dCgpOyFlLmRvbmU7ZT1kLm5leHQoKSllPWUudmFsdWUsd2EoYy5nW2VdLGJbZV0pfSxhKX0scGU9ZnVuY3Rpb24oYSl7YS5oYXNPd25Qcm9wZXJ0eSgiaW5pdC1kb25lIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJpbml0LWRvbmUiLHt2YWx1ZTohMH0pfTt2YXIgcWU9ZnVuY3Rpb24oKXt0aGlzLmc9ZnVuY3Rpb24oKXt9O3RoaXMuaD1mdW5jdGlvbigpe3JldHVybltdfX0scmU9ZnVuY3Rpb24oYSxiLGMpe2EuZz1mdW5jdGlvbihkKXtVKGFlLGIsZnVuY3Rpb24oKXtyZXR1cm5bXX0pKGQsYyl9O2EuaD1mdW5jdGlvbigpe3JldHVybiBVKGJlLGIsZnVuY3Rpb24oKXtyZXR1cm5bXX0pKGMpfX07dmFyIHNlPWZ1bmN0aW9uKGEsYil7dHJ5e2E6e3ZhciBjPWEuc3BsaXQoIi4iKTthPXc7Zm9yKHZhciBkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWEsYT1hW2NbZF1dLG51bGw9PWEpe3ZhciBmPW51bGw7YnJlYWsgYX1mPSJmdW5jdGlvbiI9PT10eXBlb2YgYT9lW2NbZC0xXV0oKTphfWlmKHR5cGVvZiBmPT09YilyZXR1cm4gZn1jYXRjaChnKXt9fSx0ZT1mdW5jdGlvbigpe3ZhciBhPXt9O3RoaXNbd2RdPShhWzhdPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gbnVsbCE9c2EoYil9Y2F0Y2goYyl7fX0sYVs5XT1mdW5jdGlvbihiKXt0cnl7dmFyIGM9c2EoYil9Y2F0Y2goZCl7cmV0dXJufWlmKGI9ImZ1bmN0aW9uIj09PXR5cGVvZiBjKWM9YyYmYy50b1N0cmluZyYmYy50b1N0cmluZygpLGI9InN0cmluZyI9PT10eXBlb2YgYyYmLTEhPWMuaW5kZXhPZigiW25hdGl2ZSBjb2RlXSIpO3JldHVybiBifSxhWzEwXT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3c9PXdpbmRvdy50b3B9LGFbNl09ZnVuY3Rpb24oYil7cmV0dXJuIEZhKE0ocWUpLmgoKSxwYXJzZUludChiLDEwKSl9LGFbMjddPWZ1bmN0aW9uKGIpe2I9c2UoYiwiYm9vbGVhbiIpO3JldHVybiB2b2lkIDAhPT1iP2I6dm9pZCAwfSxhKTthPXt9O3RoaXNbT109KGFbM109ZnVuY3Rpb24oKXtyZXR1cm4ga2MoKX0sYVs2XT1mdW5jdGlvbihiKXtiPXNlKGIsIm51bWJlciIpO3JldHVybiB2b2lkIDAhPT1iP2I6dm9pZCAwfSxhWzExXT1mdW5jdGlvbihiKXtiPWxjKHZvaWQgMD09PWI/IiI6Yix3KTtyZXR1cm4gbnVsbD09Yj92b2lkIDA6YiUxZTN9LGEpO2E9e307dGhpc1tQXT0oYVsyXT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZn0sYVszXT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gd2luZG93LnRvcC5sb2NhdGlvbi5oYXNofWNhdGNoKGIpe3JldHVybiIifX0sYVs0XT1mdW5jdGlvbihiKXtiPXNlKGIsInN0cmluZyIpO3JldHVybiB2b2lkIDAhPT1iP2I6dm9pZCAwfSxhKX07dmFyIHVlPWZ1bmN0aW9uKCl7dmFyIGE9dm9pZCAwPT09YT93OmE7cmV0dXJuIGEuZ2dlYWN8fChhLmdnZWFjPXt9KX07dmFyIHdlPWZ1bmN0aW9uKGEpe0QodGhpcyxhLHZlLG51bGwpfTt1KHdlLEMpO3dlLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiBHKHRoaXMsMSwwKX07d2UucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4gRyh0aGlzLDcsMCl9O3ZhciB2ZT1bMl07dmFyIHllPWZ1bmN0aW9uKGEpe0QodGhpcyxhLHhlLG51bGwpfTt1KHllLEMpO3llLnByb3RvdHlwZS5CPWZ1bmN0aW9uKCl7cmV0dXJuIEcodGhpcyw1LDApfTt2YXIgeGU9WzJdO3ZhciBBZT1mdW5jdGlvbihhKXtEKHRoaXMsYSx6ZSxudWxsKX07dShBZSxDKTt2YXIgVj1mdW5jdGlvbihhKXtEKHRoaXMsYSxCZSxudWxsKX07dShWLEMpO1YucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4gRyh0aGlzLDEsMCl9O3ZhciB6ZT1bMSw0LDIsM10sQmU9WzJdO3ZhciBDZT1bMTIsMTMsMjBdLERlPWZ1bmN0aW9uKCl7fSxFZT1mdW5jdGlvbihhLGIsYyxkKXtkPXZvaWQgMD09PWQ/e306ZDt2YXIgZT12b2lkIDA9PT1kLlk/ITE6ZC5ZLGY9dm9pZCAwPT09ZC5aP3t9OmQuWjtkPXZvaWQgMD09PWQuJD9bXTpkLiQ7YS5qPWI7YS5sPXt9O2Eubz1lO2EuaT1mO2I9e307YS5nPShiW2NdPVtdLGJbNF09W10sYik7YS5oPXt9OyhjPXJkKCkpJiZBYShjLnNwbGl0KCIsIil8fFtdLGZ1bmN0aW9uKGcpeyhnPXBhcnNlSW50KGcsMTApKSYmKGEuaFtnXT0hMCl9KTtBYShkLGZ1bmN0aW9uKGcpe2EuaFtnXT0hMH0pO3JldHVybiBhfSxGZT1mdW5jdGlvbihhLGIsYyl7aWYoYS5sW2JdKXJldHVybi4wMDE+PU1hdGgucmFuZG9tKCkmJm9jKHtiOmMsZHA6Yn0sInRhZ2dpbmdfZHVwZGl2IiksITA7YS5sW2JdPSEwO3JldHVybiExfSxKZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT1HZShhLmosYik7aWYoOSE9PWImJkZlKGEsYixjKXx8IWUubGVuZ3RoKXJldHVybiBkO3ZhciBmPUZhKENlLGIpO0FhKGUsZnVuY3Rpb24oZyl7aWYoZz1IZShhLGcsYykpe3ZhciBoPWcuZ2V0SWQoKTtkLnB1c2goaCk7SWUoYSxoLGY/NDpjKTt2YXIgaz1KKGcsUSwyKTtrJiYoZj9BYShYZCgpLGZ1bmN0aW9uKGwpe3JldHVybiBWZChrLGwpfSk6VmQoayxjKSl9fSk7cmV0dXJuIGR9LEllPWZ1bmN0aW9uKGEsYixjKXthLmdbY118fChhLmdbY109W10pO2E9YS5nW2NdO0ZhKGEsYik/b2Moe2VpZHM6SlNPTi5zdHJpbmdpZnkoYSksZHVwOmJ9LCJncHRfZHVwZWlkIik6YS5wdXNoKGIpfSxLZT1mdW5jdGlvbihhLGIpe2Euai5wdXNoLmFwcGx5KGEuaix0KEJhKENhKGIsZnVuY3Rpb24oYyl7cmV0dXJuIG5ldyBWKGMpfSksZnVuY3Rpb24oYyl7cmV0dXJuIUZhKENlLGMuQigpKX0pKSl9LEhlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1NKFIpLmc7aWYoIUJkKEkoYix1ZCwzKSxkKSlyZXR1cm4gbnVsbDt2YXIgZT1KKGIsd2UsMiksZj1lLmxlbmd0aCpHKGIsMSwwKSxnPUcoYiw2LDApO2lmKGcpe2Y9ZFtPXTtzd2l0Y2goYyl7Y2FzZSAyOnZhciBoPWZbOF07YnJlYWs7Y2FzZSAxOmg9Zls3XX1jPXZvaWQgMDtpZihoKXRyeXtjPWgoZyl9Y2F0Y2goayl7fXJldHVybihiPUxlKGIsYykpP01lKGEsW2JdLDEpOm51bGx9aWYoZz1HKGIsMTAsMCkpe2Y9bnVsbDtzd2l0Y2goYyl7Y2FzZSAxOmY9ZFtPXVs5XTticmVhaztjYXNlIDI6Zj1kW09dWzEwXTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfWM9Zj9mKFN0cmluZyhnKSk6dm9pZCAwO3JldHVybiB2b2lkIDA9PT1jJiYxPT09RyhiLDExLDApP251bGw6KGI9TGUoYixjKSk/TWUoYSxbYl0sMSk6bnVsbH1jPWQ/QmEoZSxmdW5jdGlvbihrKXtyZXR1cm4gQmQoSShrLHVkLDMpLGQpfSk6ZTtyZXR1cm4gYy5sZW5ndGg/KGI9RyhiLDQsMCkpP05lKGEsYixmLGMpOk1lKGEsYyxmLzFlMyk6bnVsbH0sTmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bnVsbCE9YS5pW2JdP2EuaVtiXToxZTM7aWYoMD49ZSlyZXR1cm4gbnVsbDtkPU1lKGEsZCxjL2UpO2EuaVtiXT1kPzA6ZS1jO3JldHVybiBkfSxNZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5oLGU9RGEoYixmdW5jdGlvbihmKXtyZXR1cm4hIWRbZi5nZXRJZCgpXX0pO3JldHVybiBlP2U6YS5vP251bGw6ZWMoYixjKX0sT2U9ZnVuY3Rpb24oYSxiKXtUKFpkLGZ1bmN0aW9uKGMpe2EuaFtjXT0hMH0sYik7VChhZSxmdW5jdGlvbihjLGQpe3JldHVybiBKZShhLGMsZCl9LGIpO1QoYmUsZnVuY3Rpb24oYyl7cmV0dXJuKGEuZ1tjXXx8W10pLmNvbmNhdChhLmdbNF0pfSxiKTtUKGtlLGZ1bmN0aW9uKGMpe3JldHVybiBLZShhLGMpfSxiKX0sR2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT1EYShhLGZ1bmN0aW9uKGMpe3JldHVybiBjLkIoKT09Yn0pKSYmSihhLHllLDIpfHxbXX0sTGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1KKGEsd2UsMiksZD1jLmxlbmd0aCxlPUcoYSwxLDApO2E9RyhhLDgsMCk7Yj12b2lkIDAhPT1iP2I6TWF0aC5mbG9vcigxZTMqZGMod2luZG93KSk7dmFyIGY9KGItYSklZDtpZihiPGF8fGItYS1mPj1kKmUtMSlyZXR1cm4gbnVsbDtjPWNbZl07ZD1NKFIpLmc7cmV0dXJuIWN8fGQmJiFCZChJKGMsdWQsMyksZCk/bnVsbDpjfTt2YXIgUGU9ZnVuY3Rpb24oKXt0aGlzLmc9ZnVuY3Rpb24oKXt9fSxRZT1mdW5jdGlvbihhKXtNKFBlKS5nKGEpfTt2YXIgVGU9ZnVuY3Rpb24oYSl7dmFyIGI9TShSZSksYz17WTpNKFcpWzIxMV0sWjpNKFcpWzIyN10sJDpNKFcpWzIyNl19LGQ9dm9pZCAwLGU9MjtkPXZvaWQgMD09PWQ/dWUoKTpkO2U9dm9pZCAwPT09ZT8wOmU7ZC5oYXNPd25Qcm9wZXJ0eSgiaW5pdC1kb25lIik/KFUoa2UsZCkoQ2EoSihhLFYsMiksZnVuY3Rpb24oZil7cmV0dXJuIFNiKGYpfSkpLFUobGUsZCkoQ2EoSihhLFEsMSksZnVuY3Rpb24oZil7cmV0dXJuIFNiKGYpfSksZSksYiYmVShtZSxkKShiKSxTZShkLGUpKTooT2UoRWUoTShEZSksSihhLFYsMiksZSxjKSxkKSxuZShkKSxvZShkKSxwZShkKSxTZShkLGUpLFZkKEooYSxRLDEpLGUpLElkPUlkfHwhKCFjfHwhYy50YSksUWUoTSh0ZSkpLGImJlFlKGIpKX0sU2U9ZnVuY3Rpb24oYSxiKXthPXZvaWQgMD09PWE/dWUoKTphO2I9dm9pZCAwPT09Yj8wOmI7dmFyIGM9YSxkPWI7ZD12b2lkIDA9PT1kPzA6ZDtyZShNKHFlKSxjLGQpO1VlKGEsYik7TShQZSkuZz1VKG1lLGEpO00obGQpLmkoKX0sVWU9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/MDpiO3ZhciBjPU0obGQpO2MuZz1mdW5jdGlvbihkLGUpe3JldHVybiBVKGRlLGEsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKGQsZSxiKX07Yy5oPWZ1bmN0aW9uKGQsZSl7cmV0dXJuIFUoZWUsYSxmdW5jdGlvbigpe3JldHVybiAwfSkoZCxlLGIpfTtjLmo9ZnVuY3Rpb24oZCxlKXtyZXR1cm4gVShmZSxhLGZ1bmN0aW9uKCl7cmV0dXJuIiJ9KShkLGUsYil9O2MubD1mdW5jdGlvbihkLGUpe3JldHVybiBVKGdlLGEsZnVuY3Rpb24oKXtyZXR1cm5bXX0pKGQsZSxiKX07Yy5pPWZ1bmN0aW9uKCl7VSgkZCxhKShiKX19O3ZhciBWZT1bIkF3Zkc4aEFjSG5QYS9rSjFDbzBFdkcvSzBGOWwxczJKWkdpREx0Mm1oQzNRSTVGaDRxbXNtU3dyV09iWkZiUkM5aWVEYVNMVTZsSFJ4aEdVRi9pOXNnb0FBQUNCZXlKdmNtbG5hVzRpT2lKb2RIUndjem92TDJSdmRXSnNaV05zYVdOckxtNWxkRG8wTkRNaUxDSm1aV0YwZFhKbElqb2lTVzUwWlhKbGMzUkRiMmh2Y25SQlVFa2lMQ0psZUhCcGNua2lPakUyTWpZeU1qQTNPVGtzSW1selUzVmlaRzl0WVdsdUlqcDBjblZsTENKcGMxUm9hWEprVUdGeWRIa2lPblJ5ZFdWOSIsIkF3UTdkQ21Ia3ZSNkZ1T0Z4QXVObmt0WVNRckdiTDRkRitlQmtyd05MQUxjNjlXci8vUG5PMXl6bnMzcGpVb0NhWWJLSHRWY25uZzJoVSs4T1VtMFBBWUFBQUNIZXlKdmNtbG5hVzRpT2lKb2RIUndjem92TDJkdmIyZHNaWE41Ym1ScFkyRjBhVzl1TG1OdmJUbzBORE1pTENKbVpXRjBkWEpsSWpvaVNXNTBaWEpsYzNSRGIyaHZjblJCVUVraUxDSmxlSEJwY25raU9qRTJNall5TWpBM09Ua3NJbWx6VTNWaVpHOXRZV2x1SWpwMGNuVmxMQ0pwYzFSb2FYSmtVR0Z5ZEhraU9uUnlkV1Y5IiwiQXlzVkRQR1FUTEQvU2NuNzh4NG1Md0IxdE1mamU1andVcEFBekdScFdzcjFOem9ON01URmhUM0NsbUltaTJzdkRaQTdWNm5XR0lWOFlUUHNTUlRlMHdZQUFBQ0hleUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMMmR2YjJkc1pYUmhaM05sY25acFkyVnpMbU52YlRvME5ETWlMQ0ptWldGMGRYSmxJam9pU1c1MFpYSmxjM1JEYjJodmNuUkJVRWtpTENKbGVIQnBjbmtpT2pFMk1qWXlNakEzT1Rrc0ltbHpVM1ZpWkc5dFlXbHVJanAwY25WbExDSnBjMVJvYVhKa1VHRnlkSGtpT25SeWRXVjkiXTtmdW5jdGlvbiBXZShhKXthPXZvaWQgMD09PWE/d2luZG93LmRvY3VtZW50OmE7bWMoVmUsYSl9dmFyIFhlPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT93OmE7cmV0dXJuKGE9YS5wZXJmb3JtYW5jZSkmJmEubm93P2Eubm93KCk6bnVsbH07dmFyIFllPXcucGVyZm9ybWFuY2UsWmU9ISEoWWUmJlllLm1hcmsmJlllLm1lYXN1cmUmJlllLmNsZWFyTWFya3MpLCRlPXphKGZ1bmN0aW9uKCl7dmFyIGE7aWYoYT1aZSlhPXJkKCksYT0hIWEuaW5kZXhPZiYmMDw9YS5pbmRleE9mKCIxMzM3Iik7cmV0dXJuIGF9KTt2YXIgYWY9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZz12b2lkIDA9PT1hP251bGw6YTt0aGlzLmk9dm9pZCAwPT09Yj8ianNlcnJvciI6Yjt0aGlzLmg9bnVsbDt0aGlzLmo9dm9pZCAwPT09Yz8uMDE6Yzt0aGlzLm89dGhpcy5sfSxiZj1mdW5jdGlvbihhLGIpe2EuaD1ifTthZi5wcm90b3R5cGUubD1mdW5jdGlvbihhLGIsYyxkLGUpe2M9dm9pZCAwPT09Yz90aGlzLmo6YztlPXZvaWQgMD09PWU/dGhpcy5pOmU7aWYoTWF0aC5yYW5kb20oKT5jKXJldHVybiExO2IuZXJyb3ImJmIubWV0YSYmYi5pZHx8KGI9bmV3IFZiKGIse2NvbnRleHQ6YSxpZDplfSkpO2lmKGR8fHRoaXMuaCliLm1ldGE9e30sdGhpcy5oJiZ0aGlzLmgoYi5tZXRhKSxkJiZkKGIubWV0YSk7dy5nb29nbGVfanNfZXJyb3JzPXcuZ29vZ2xlX2pzX2Vycm9yc3x8W107dy5nb29nbGVfanNfZXJyb3JzLnB1c2goYik7dy5lcnJvcl9yZXBfbG9hZGVkfHwoYj13LmRvY3VtZW50LGE9Yi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxhLnNyYz1PYShuZXcgeSh3LmxvY2F0aW9uLnByb3RvY29sKyIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9qcy9lcnJfcmVwLmpzIixNYSkpLFViKGEpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdKSYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYiksdy5lcnJvcl9yZXBfbG9hZGVkPSEwKTtyZXR1cm4hMX07dmFyIGNmPWZ1bmN0aW9uKGEsYil7dHJ5e3ZhciBjPWEuZyYmYS5nLnN0YXJ0KCI0MjAiLDMpO2IoKTthLmcmJmMmJmEuZy5lbmQoYyl9Y2F0Y2goZCl7aWYoYS5nJiZjJiYoYj1jKSYmWWUmJiRlKCkmJihZZS5jbGVhck1hcmtzKCJnb29nXyIrYi5sYWJlbCsiXyIrYi51bmlxdWVJZCsiX3N0YXJ0IiksWWUuY2xlYXJNYXJrcygiZ29vZ18iK2IubGFiZWwrIl8iK2IudW5pcXVlSWQrIl9lbmQiKSksIWEubyg0MjAsZCxhLmosdm9pZCAwLGEuaSkpdGhyb3cgZH19O3ZhciBkZj1bIkEzSHVjSFVvMW9XOXMrOWtJS3o4bUxrYmNtZGFqNWx4dDNlaUlNcDFOaDQ5ZGtrQmxnMUZoZzRGZC9yMHZMNjltUlJBMzZZdXRJOVAvbEpVZkw4Y3NRb0FBQUNGZXlKdmNtbG5hVzRpT2lKb2RIUndjem92TDJSdmRXSnNaV05zYVdOckxtNWxkRG8wTkRNaUxDSm1aV0YwZFhKbElqb2lRMjl1ZG1WeWMybHZiazFsWVhOMWNtVnRaVzUwSWl3aVpYaHdhWEo1SWpveE5qSTJNakl3TnprNUxDSnBjMU4xWW1SdmJXRnBiaUk2ZEhKMVpTd2lhWE5VYUdseVpGQmhjblI1SWpwMGNuVmxmUT09IiwiQTBPeXNlemhMb0NSWW9tdW1lWWx1Ykx1clpUQ21zalRiMDg3T3Z0Q3k5NWpOTTY1Y2ZFc2JhanJKbmhhR3dpVHhoejM4WlpibStVaFV3UXVYZlZQVGcwQUFBQ0xleUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMMmR2YjJkc1pYTjVibVJwWTJGMGFXOXVMbU52YlRvME5ETWlMQ0ptWldGMGRYSmxJam9pUTI5dWRtVnljMmx2YmsxbFlYTjFjbVZ0Wlc1MElpd2laWGh3YVhKNUlqb3hOakkyTWpJd056azVMQ0pwYzFOMVltUnZiV0ZwYmlJNmRISjFaU3dpYVhOVWFHbHlaRkJoY25SNUlqcDBjblZsZlE9PSIsIkF4b094ZFpRbUlvQTFXZUFQRGl4UkFlV0RkZ3M3WnRWRmZIMnkxOXppVGdEMWlhSEU1Wkd6MlVkU2p1YmtXdm9iOUM1UHJqVWZrV2k0WlNMZ1drM1hnOEFBQUNMZXlKdmNtbG5hVzRpT2lKb2RIUndjem92TDJkdmIyZHNaWFJoWjNObGNuWnBZMlZ6TG1OdmJUbzBORE1pTENKbVpXRjBkWEpsSWpvaVEyOXVkbVZ5YzJsdmJrMWxZWE4xY21WdFpXNTBJaXdpWlhod2FYSjVJam94TmpJMk1qSXdOems1TENKcGMxTjFZbVJ2YldGcGJpSTZkSEoxWlN3aWFYTlVhR2x5WkZCaGNuUjVJanAwY25WbGZRPT0iLCJBNytyTVlSNW9uUG5BQ3J6K25pS1NlRmRIM3h3MUl5SG8yQVpTSG14cm9mUms5dzRIY1FQTVljcEJVS3U2T1E2enNkeGY0bS92cWE2dEc2TmE0T0xwQVFBQUFCNGV5SnZjbWxuYVc0aU9pSm9kSFJ3Y3pvdkwybHRZWE5rYXk1bmIyOW5iR1ZoY0dsekxtTnZiVG8wTkRNaUxDSm1aV0YwZFhKbElqb2lRMjl1ZG1WeWMybHZiazFsWVhOMWNtVnRaVzUwSWl3aVpYaHdhWEo1SWpveE5qSTJNakl3TnprNUxDSnBjMVJvYVhKa1VHRnlkSGtpT25SeWRXVjkiXTtmdW5jdGlvbiBlZihhKXthPXZvaWQgMD09PWE/d2luZG93LmRvY3VtZW50OmE7bWMoZGYsYSl9dmFyIGZmPXgoImdwdC9wdWJhZHNfaW1wbF8iKSxnZj14KCJodHRwczovL3NlY3VyZXB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKTt2YXIgaGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1YZShiKTtjJiYoYT17bGFiZWw6YSx0eXBlOjksdmFsdWU6Y30sYj1iLmdvb2dsZV9qc19yZXBvcnRpbmdfcXVldWU9Yi5nb29nbGVfanNfcmVwb3J0aW5nX3F1ZXVlfHxbXSwyMDQ4PmIubGVuZ3RoJiZiLnB1c2goYSkpfSxqZj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9d2luZG93O3JldHVybiBmdW5jdGlvbigpe3ZhciBlPVhlKCksZj0zO3RyeXt2YXIgZz1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChoKXtmPTEzO2lmKGMpcmV0dXJuIGMoYSxoKSxnO3Rocm93IGh9ZmluYWxseXtkLmdvb2dsZV9tZWFzdXJlX2pzX3RpbWluZyYmZSYmKGU9e2xhYmVsOmEudG9TdHJpbmcoKSx2YWx1ZTplLGR1cmF0aW9uOihYZSgpfHwwKS1lLHR5cGU6Zn0sZj1kLmdvb2dsZV9qc19yZXBvcnRpbmdfcXVldWU9ZC5nb29nbGVfanNfcmVwb3J0aW5nX3F1ZXVlfHxbXSwyMDQ4PmYubGVuZ3RoJiZmLnB1c2goZSkpfXJldHVybiBnfX0sa2Y9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gamYoYSxiLGZ1bmN0aW9uKGMsZCl7KG5ldyBhZikubChjLGQpfSl9O2Z1bmN0aW9uIFgoYSxiKXtyZXR1cm4gbnVsbD09Yj8iJiIrYSsiPW51bGwiOiImIithKyI9IitNYXRoLmZsb29yKGIpfWZ1bmN0aW9uIGxmKGEsYil7cmV0dXJuIiYiK2ErIj0iK2IudG9GaXhlZCgzKX1mdW5jdGlvbiBtZigpe3ZhciBhPW5ldyBtLlNldDt0cnl7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZ29vZ2xldGFnfHwhZ29vZ2xldGFnLnB1YmFkcylyZXR1cm4gYTtmb3IodmFyIGI9Z29vZ2xldGFnLnB1YmFkcygpLGM9cihiLmdldFNsb3RzKCkpLGQ9Yy5uZXh0KCk7IWQuZG9uZTtkPWMubmV4dCgpKWEuYWRkKGQudmFsdWUuZ2V0U2xvdElkKCkuZ2V0RG9tSWQoKSl9Y2F0Y2goZSl7fXJldHVybiBhfWZ1bmN0aW9uIG5mKGEpe2E9YS5pZDtyZXR1cm4gbnVsbCE9YSYmKG1mKCkuaGFzKGEpfHxuKGEsInN0YXJ0c1dpdGgiKS5jYWxsKGEsImdvb2dsZV9hZHNfaWZyYW1lXyIpfHxuKGEsInN0YXJ0c1dpdGgiKS5jYWxsKGEsImFzd2lmdCIpKX1mdW5jdGlvbiBvZihhLGIsYyl7aWYoIWEuc291cmNlcylyZXR1cm4hMTt2YXIgZD1tZChJYyk7c3dpdGNoKHBmKGEpKXtjYXNlIDI6dmFyIGU9cWYoYSk7aWYoZSlyZXR1cm4gYy5zb21lKGZ1bmN0aW9uKGcpe3JldHVybiByZihlLGcsZCl9KTtjYXNlIDE6dmFyIGY9c2YoYSk7aWYoZilyZXR1cm4gYi5zb21lKGZ1bmN0aW9uKGcpe3JldHVybiByZihmLGcsZCl9KX1yZXR1cm4hMX1mdW5jdGlvbiBwZihhKXtpZighYS5zb3VyY2VzKXJldHVybiAwO2E9YS5zb3VyY2VzLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5wcmV2aW91c1JlY3QmJmIuY3VycmVudFJlY3R9KTtpZigxPD1hLmxlbmd0aCl7YT1hWzBdO2lmKGEucHJldmlvdXNSZWN0LnRvcDxhLmN1cnJlbnRSZWN0LnRvcClyZXR1cm4gMjtpZihhLnByZXZpb3VzUmVjdC50b3A+YS5jdXJyZW50UmVjdC50b3ApcmV0dXJuIDF9cmV0dXJuIDB9ZnVuY3Rpb24gc2YoYSl7cmV0dXJuIHRmKGEsZnVuY3Rpb24oYil7cmV0dXJuIGIuY3VycmVudFJlY3R9KX1mdW5jdGlvbiBxZihhKXtyZXR1cm4gdGYoYSxmdW5jdGlvbihiKXtyZXR1cm4gYi5wcmV2aW91c1JlY3R9KX1mdW5jdGlvbiB0ZihhLGIpe3JldHVybiBhLnNvdXJjZXMucmVkdWNlKGZ1bmN0aW9uKGMsZCl7ZD1iKGQpO3JldHVybiBjP2QmJjAhPT1kLndpZHRoKmQuaGVpZ2h0P2QudG9wPGMudG9wP2Q6YzpjOmR9LG51bGwpfXZhciB1Zj1mdW5jdGlvbigpe25kLmNhbGwodGhpcyk7dGhpcy5oPXRoaXMuZz10aGlzLkQ9dGhpcy5DPXRoaXMuQT0wO3RoaXMuVT10aGlzLlI9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO3RoaXMuTT10aGlzLk89dGhpcy5QPXRoaXMuUz10aGlzLlg9dGhpcy5sPXRoaXMuVz10aGlzLkg9MDt0aGlzLk49ITE7dGhpcy5GPXRoaXMuSz10aGlzLm89MDt2YXIgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1nb29nbGUtcXVlcnktaWRdIik7dGhpcy5WPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtZ29vZ2xlLXF1ZXJ5LWlkIik6bnVsbDt0aGlzLkc9bnVsbDt0aGlzLlQ9ITE7dGhpcy5MPWZ1bmN0aW9uKCl7fX07dSh1ZixuZCk7dmFyIHhmPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHVmO2lmKE4oR2MpJiYhd2luZG93Lmdvb2dsZV9wbG1ldHJpY3MmJndpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyKXt3aW5kb3cuZ29vZ2xlX3BsbWV0cmljcz0hMDtmb3IodmFyIGI9cihbImxheW91dC1zaGlmdCIsImxhcmdlc3QtY29udGVudGZ1bC1wYWludCIsImZpcnN0LWlucHV0IiwibG9uZ3Rhc2siXSksYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpYz1jLnZhbHVlLHZmKGEpLm9ic2VydmUoe3R5cGU6YyxidWZmZXJlZDohTihLYyl9KTt3ZihhKX19LHZmPWZ1bmN0aW9uKGEpe2EuR3x8KGEuRz1uZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihrZig2NDAsZnVuY3Rpb24oYil7dmFyIGM9eWYhPT13aW5kb3cuc2Nyb2xsWHx8emYhPT13aW5kb3cuc2Nyb2xsWT9bXTpBZixkPUJmKCk7Yj1yKGIuZ2V0RW50cmllcygpKTtmb3IodmFyIGU9Yi5uZXh0KCk7IWUuZG9uZTtlPWIubmV4dCgpKXN3aXRjaChlPWUudmFsdWUsZS5lbnRyeVR5cGUpe2Nhc2UibGF5b3V0LXNoaWZ0Ijp2YXIgZj1hO2lmKCFlLmhhZFJlY2VudElucHV0JiYoIU4oSGMpfHwuMDE8ZS52YWx1ZSkpe2YuQSs9TnVtYmVyKGUudmFsdWUpO051bWJlcihlLnZhbHVlKT5mLkMmJihmLkM9TnVtYmVyKGUudmFsdWUpKTtmLkQrPTE7dmFyIGc9b2YoZSxjLGQpO2cmJihmLmwrPWUudmFsdWUsZi5TKyspO2lmKDVlMzxlLnN0YXJ0VGltZS1mLlJ8fDFlMzxlLnN0YXJ0VGltZS1mLlUpZi5SPWUuc3RhcnRUaW1lLGYuZz0wLGYuaD0wO2YuVT1lLnN0YXJ0VGltZTtmLmcrPWUudmFsdWU7ZyYmKGYuaCs9ZS52YWx1ZSk7Zi5nPmYuSCYmKGYuSD1mLmcsZi5YPWYuaCxmLlc9ZS5zdGFydFRpbWUrZS5kdXJhdGlvbil9YnJlYWs7Y2FzZSJsYXJnZXN0LWNvbnRlbnRmdWwtcGFpbnQiOmEuUD1NYXRoLmZsb29yKGUucmVuZGVyVGltZXx8ZS5sb2FkVGltZSk7YS5PPWUuc2l6ZTticmVhaztjYXNlImZpcnN0LWlucHV0IjphLk09TnVtYmVyKChlLnByb2Nlc3NpbmdTdGFydC1lLnN0YXJ0VGltZSkudG9GaXhlZCgzKSk7YS5OPSEwO2JyZWFrO2Nhc2UibG9uZ3Rhc2siOmU9TWF0aC5tYXgoMCxlLmR1cmF0aW9uLTUwKSxhLm8rPWUsYS5LPU1hdGgubWF4KGEuSyxlKSxhLkYrPTF9fSkpKTtyZXR1cm4gYS5HfSx3Zj1mdW5jdGlvbihhKXt2YXIgYj1rZig2NDEsZnVuY3Rpb24oKXt2YXIgZj1kb2N1bWVudDsyPT0oe3Zpc2libGU6MSxoaWRkZW46MixwcmVyZW5kZXI6MyxwcmV2aWV3OjQsdW5sb2FkZWQ6NX1bZi52aXNpYmlsaXR5U3RhdGV8fGYud2Via2l0VmlzaWJpbGl0eVN0YXRlfHxmLm1velZpc2liaWxpdHlTdGF0ZXx8IiJdfHwwKSYmQ2YoYSl9KSxjPWtmKDY0MSxmdW5jdGlvbigpe3JldHVybiB2b2lkIENmKGEpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsYik7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixjKTt2YXIgZD1tZChKYyksZTswPGQmJihlPXNldFRpbWVvdXQoYywxZTMqZCkpO2EuTD1mdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLGIpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInVubG9hZCIsYyk7dmYoYSkuZGlzY29ubmVjdCgpO2UmJmNsZWFyVGltZW91dChlKX19O3VmLnByb3RvdHlwZS5KPWZ1bmN0aW9uKCl7bmQucHJvdG90eXBlLkouY2FsbCh0aGlzKTt0aGlzLkwoKX07dmFyIENmPWZ1bmN0aW9uKGEpe2lmKCFhLlQpe2EuVD0hMDt2ZihhKS50YWtlUmVjb3JkcygpO3ZhciBiPSJodHRwczovL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9nZW5fMjA0P2lkPXBsbWV0cmljcyI7d2luZG93LkxheW91dFNoaWZ0JiYoYis9bGYoImNscyIsYS5BKSxiKz1sZigibWxzIixhLkMpLGIrPVgoIm5scyIsYS5EKSx3aW5kb3cuTGF5b3V0U2hpZnRBdHRyaWJ1dGlvbiYmKGIrPWxmKCJjYXMiLGEubCksYis9WCgibmFzIixhLlMpKSxiKz1sZigid2xzIixhLkgpLGIrPWxmKCJ0bHMiLGEuVyksd2luZG93LkxheW91dFNoaWZ0QXR0cmlidXRpb24mJihiKz1sZigid2FzIixhLlgpKSk7d2luZG93Lkxhcmdlc3RDb250ZW50ZnVsUGFpbnQmJihiKz1YKCJsY3AiLGEuUCksYis9WCgibGNwcyIsYS5PKSk7d2luZG93LlBlcmZvcm1hbmNlRXZlbnRUaW1pbmcmJmEuTiYmKGIrPVgoImZpZCIsYS5NKSk7d2luZG93LlBlcmZvcm1hbmNlTG9uZ1Rhc2tUaW1pbmcmJihiKz1YKCJjYnQiLGEubyksYis9WCgibWJ0IixhLkspLGIrPVgoIm5sdCIsYS5GKSk7Zm9yKHZhciBjPTAsZD1yKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSksZT1kLm5leHQoKTshZS5kb25lO2U9ZC5uZXh0KCkpbmYoZS52YWx1ZSkmJmMrKztiKz1YKCJuaWYiLGMpO2M9d2luZG93Lmdvb2dsZV91bmlxdWVfaWQ7Yis9WCgiaWZpIiwibnVtYmVyIj09PXR5cGVvZiBjP2M6MCk7Yz1NKHFlKS5oKCk7Yis9IiZlaWQ9IitlbmNvZGVVUklDb21wb25lbnQoYy5qb2luKCkpO2IrPSImdG9wPSIrKHc9PT13LnRvcD8xOjApO2lmKGEuViljPSImcXFpZD0iK2VuY29kZVVSSUNvbXBvbmVudChhLlYpO2Vsc2V7aWYoIm51bWJlciIhPT10eXBlb2Ygdy5nb29nX3B2c2lkKXRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodywiZ29vZ19wdnNpZCIse3ZhbHVlOk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpNYXRoLnBvdygyLDUyKSksY29uZmlndXJhYmxlOiExfSl9Y2F0Y2goZil7fWM9WCgicHZzaWQiLE51bWJlcih3Lmdvb2dfcHZzaWQpfHwtMSl9Yis9Yzt3aW5kb3cuZ29vZ2xldGFnJiYoYis9IiZncHQ9MSIpO3dpbmRvdy5mZXRjaChiLHtrZWVwYWxpdmU6ITAsY3JlZGVudGlhbHM6ImluY2x1ZGUiLHJlZGlyZWN0OiJmb2xsb3ciLG1ldGhvZDoiZ2V0Iixtb2RlOiJuby1jb3JzIn0pO2Euanx8KGEuaj0hMCxhLkooKSl9fSxyZj1mdW5jdGlvbihhLGIsYyl7aWYoMD09PWMpcmV0dXJuITA7dmFyIGQ9TWF0aC5taW4oYS5yaWdodCxiLnJpZ2h0KS1NYXRoLm1heChhLmxlZnQsYi5sZWZ0KTthPU1hdGgubWluKGEuYm90dG9tLGIuYm90dG9tKS1NYXRoLm1heChhLnRvcCxiLnRvcCk7cmV0dXJuIDA+PWR8fDA+PWE/ITE6MTAwKmQqYS8oKGIucmlnaHQtYi5sZWZ0KSooYi5ib3R0b20tYi50b3ApKT49Y30sQmY9ZnVuY3Rpb24oKXt2YXIgYT1bXS5jb25jYXQodChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIikpKS5maWx0ZXIobmYpLGI9W10uY29uY2F0KHQobWYoKSkpLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYyl9KS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIG51bGwhPT1jfSk7eWY9d2luZG93LnNjcm9sbFg7emY9d2luZG93LnNjcm9sbFk7cmV0dXJuIEFmPVtdLmNvbmNhdCh0KGEpLHQoYikpLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pfSx5Zj12b2lkIDAsemY9dm9pZCAwLEFmPVtdO3ZhciBEZj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/d2luZG93OmE7cmV0dXJuIWEuUGVyaW9kaWNTeW5jTWFuYWdlcn0sRWY9e2lzc3Vlck9yaWdpbjoiaHR0cHM6Ly9hZHNlcnZpY2UuZ29vZ2xlLmNvbSIsaXNzdWFuY2VQYXRoOiIvdHQvaSIscmVkZW1wdGlvblBhdGg6Ii90dC9yIixzaG91bGRSZWRlZW1Ub2tlbjpmdW5jdGlvbigpe3ZhciBhPXZvaWQgMD09PWE/d2luZG93OmE7cmV0dXJuIURmKGEpfHxOKFNjKT8hMDohMX0sc2hvdWxkUmVxdWVzdFRva2VuOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSxGZj1mdW5jdGlvbigpe3ZhciBhPXZvaWQgMD09PWE/d2luZG93OmE7aWYoIURmKGEpJiZOKExjKXx8RGYoYSkmJk4oTWMpKXthPWEubmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgYj0vQ2hyb21lLy50ZXN0KGEpO3JldHVybi9BbmRyb2lkLy50ZXN0KGEpJiZifXJldHVybiExfSxHZj17aXNzdWVyT3JpZ2luOiJodHRwczovL2F0dGVzdGF0aW9uLmFuZHJvaWQuY29tIixpc3N1YW5jZVBhdGg6Ii9hdHQvaSIscmVkZW1wdGlvblBhdGg6Ii9hdHQvciIsc2hvdWxkUmVkZWVtVG9rZW46ZnVuY3Rpb24oKXtyZXR1cm4gRmYoKX0sc2hvdWxkUmVxdWVzdFRva2VuOmZ1bmN0aW9uKCl7cmV0dXJuIEZmKCl9fTt2YXIgSGY9WyJBK2IvSDBiOFJQWE5hSmdhTkZwTzBZT0Z1R0s2bXlEUVhsd25KQjNTd3p2Tk1mY25kYXQ0RFpZTXJQNENsSkl6WVdvMy95UDJTKzhGVFovbHBxYlBBQUVBQUFCdWV5SnZjbWxuYVc0aU9pSm9kSFJ3Y3pvdkwybHRZWE5rYXk1bmIyOW5iR1ZoY0dsekxtTnZiVG8wTkRNaUxDSm1aV0YwZFhKbElqb2lWSEoxYzNSVWIydGxibk1pTENKbGVIQnBjbmtpT2pFMk1qWXlNakEzT1Rrc0ltbHpWR2hwY21SUVlYSjBlU0k2ZEhKMVpYMD0iLCJBOVpnYlJ0bTRwVTNvWml1TnpPc0tjQzhwcEZTWmRjalAycVljZFFyRktWemttaVdIMWtkWVkxTWk5eDdHOCtQUzhIVjlIYTlDejBnYU1kS3NpVlpJZ01BQUFCN2V5SnZjbWxuYVc0aU9pSm9kSFJ3Y3pvdkwyUnZkV0pzWldOc2FXTnJMbTVsZERvME5ETWlMQ0ptWldGMGRYSmxJam9pVkhKMWMzUlViMnRsYm5NaUxDSmxlSEJwY25raU9qRTJNall5TWpBM09Ua3NJbWx6VTNWaVpHOXRZV2x1SWpwMGNuVmxMQ0pwYzFSb2FYSmtVR0Z5ZEhraU9uUnlkV1Y5IiwiQXhMNm9CeGNwbjVyUURQS1NBcytkMG94TnlKWXEyLzRlc0JVaDNZeDV6OFFmY0x1K0FVOGlGQ1hZUmNyL0NFRWZEbmt4eExUc3ZYUEpGUUJ4SGZ2a2dNQUFBQ0JleUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMMmR2YjJkc1pYUmhaM05sY25acFkyVnpMbU52YlRvME5ETWlMQ0ptWldGMGRYSmxJam9pVkhKMWMzUlViMnRsYm5NaUxDSmxlSEJwY25raU9qRTJNall5TWpBM09Ua3NJbWx6VTNWaVpHOXRZV2x1SWpwMGNuVmxMQ0pwYzFSb2FYSmtVR0Z5ZEhraU9uUnlkV1Y5IiwiQTlLUHRHNWtsM29MVGsyMXhxeW5EUEdRNXQxOGJTT3B3dDB3NmtHYTZkRVdidXdqcGZmbWRVcFIzVytmYVpEdWJHVCtLSWsyZG8wQlgyY2ExNng4cUFjQUFBQ0JleUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMMmR2YjJkc1pYTjVibVJwWTJGMGFXOXVMbU52YlRvME5ETWlMQ0ptWldGMGRYSmxJam9pVkhKMWMzUlViMnRsYm5NaUxDSmxlSEJwY25raU9qRTJNall5TWpBM09Ua3NJbWx6VTNWaVpHOXRZV2x1SWpwMGNuVmxMQ0pwYzFSb2FYSmtVR0Z5ZEhraU9uUnlkV1Y5IiwiQW9va2dNMEs2ekFCaXVSVFp3cG4rUjk1RzJDS21VSC8yK3pmMmtTL1FwTWxWWjZIVEk2UWVrZUxrckp5eGVJaTYycDJlamNRVEY0NjRwa2RseDBOd2cwQUFBQm1leUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMM2QzZHk1bmIyOW5iR1V1WTI5dE9qUTBNeUlzSW1abFlYUjFjbVVpT2lKVWNuVnpkRlJ2YTJWdWN5SXNJbVY0Y0dseWVTSTZNVFl6TkRBNE16RTVPU3dpYVhOVGRXSmtiMjFoYVc0aU9uUnlkV1Y5Il0sS2Y9ZnVuY3Rpb24oYSxiLGMpe2E9dm9pZCAwPT09YT9mdW5jdGlvbigpe306YTtiPXZvaWQgMD09PWI/bnVsbDpiO2M9dm9pZCAwPT09Yz8hMTpjO25kLmNhbGwodGhpcyk7SWYoKTt0aGlzLm89Ynx8TihPYyk/W0dmXTpbRWYsR2ZdO3RoaXMuaD1jO3RoaXMubD1hO2lmKGRvY3VtZW50Lmhhc1RydXN0VG9rZW4mJiFOKE5jKSlpZihOKFFjKSl7aWYoIUFycmF5LmlzQXJyYXkod2luZG93Lmdvb2dfdHRfc3RhdGUpKXt2YXIgZD1KZih0aGlzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnb29nX3R0X3N0YXRlIix7Y29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiBkLnNsaWNlKCl9fSl9fWVsc2UgdGhpcy5nPUpmKHRoaXMpfTt1KEtmLG5kKTt2YXIgSWY9ZnVuY3Rpb24oKXt2YXIgYT12b2lkIDA9PT1hP3dpbmRvdy5kb2N1bWVudDphO21jKEhmLGEpfSxKZj1mdW5jdGlvbihhKXt2YXIgYj1hLm8ubWFwKGZ1bmN0aW9uKGMpe3JldHVybntpc3N1ZXJPcmlnaW46Yy5pc3N1ZXJPcmlnaW4sc3RhdGU6TihQYykmJiFhLmg/MTI6MX19KTtOKFFjKXx8YS5sKGIpO3JldHVybiBifSxZPWZ1bmN0aW9uKGEsYixjKXtpZihOKFFjKSl7aWYoYT1uKHdpbmRvdy5nb29nX3R0X3N0YXRlLCJmaW5kIikuY2FsbCh3aW5kb3cuZ29vZ190dF9zdGF0ZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5pc3N1ZXJPcmlnaW49PT1ifSkpYS5zdGF0ZT1jfWVsc2V7dmFyIGQ9bihhLmcsImZpbmQiKS5jYWxsKGEuZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5pc3N1ZXJPcmlnaW49PT1ifSk7ZCYmKGQuc3RhdGU9YyxhLmwoYS5nKSl9fSxMZj1mdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5nb29nX3R0X3N0YXRlO3JldHVybiBBcnJheS5pc0FycmF5KGEpJiZhLnNvbWUoZnVuY3Rpb24oYil7cmV0dXJuIDEhPWIuc3RhdGV9KX0sTWY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmlzc3Vlck9yaWdpbitiLnJlZGVtcHRpb25QYXRoLGQ9e2tlZXBhbGl2ZTohMCxyZWRpcmVjdDoiZm9sbG93IixtZXRob2Q6ImdldCIsdHJ1c3RUb2tlbjp7dHlwZToidG9rZW4tcmVkZW1wdGlvbiIsaXNzdWVyOmIuaXNzdWVyT3JpZ2luLHJlZnJlc2hQb2xpY3k6Im5vbmUifX07WShhLGIuaXNzdWVyT3JpZ2luLDIpO3JldHVybiB3aW5kb3cuZmV0Y2goYyxkKS50aGVuKGZ1bmN0aW9uKGUpe2lmKCFlLm9rKXRocm93IEVycm9yKGUuc3RhdHVzKyI6IE5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvayEiKTtZKGEsYi5pc3N1ZXJPcmlnaW4sNil9KS5jYXRjaChmdW5jdGlvbihlKXtlJiYiTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3IiPT09ZS5uYW1lP1koYSxiLmlzc3Vlck9yaWdpbiw2KTpZKGEsYi5pc3N1ZXJPcmlnaW4sNSl9KX0sTmY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIuaXNzdWVyT3JpZ2luK2IuaXNzdWFuY2VQYXRoO1koYSxiLmlzc3Vlck9yaWdpbiw4KTtyZXR1cm4gd2luZG93LmZldGNoKGQse3RydXN0VG9rZW46e3R5cGU6InRva2VuLXJlcXVlc3QifX0pLnRoZW4oZnVuY3Rpb24oZSl7aWYoIWUub2spdGhyb3cgRXJyb3IoZS5zdGF0dXMrIjogTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rISIpO1koYSxiLmlzc3Vlck9yaWdpbiwxMCk7aWYoYylyZXR1cm4gTWYoYSxiKX0pLmNhdGNoKGZ1bmN0aW9uKGUpe2lmKGUmJiJOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvciI9PT1lLm5hbWUpe2lmKFkoYSxiLmlzc3Vlck9yaWdpbiwxMCksYylyZXR1cm4gTWYoYSxiKX1lbHNlIFkoYSxiLmlzc3Vlck9yaWdpbiw5KX0pfSxPZj1mdW5jdGlvbihhKXtpZighKCFkb2N1bWVudC5oYXNUcnVzdFRva2VufHxOKE5jKXx8TihQYykmJiFhLmh8fE4oUWMpJiZMZigpKSl7dmFyIGI9W107YS5vLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5zaG91bGRSZWRlZW1Ub2tlbigpLGU9Yy5zaG91bGRSZXF1ZXN0VG9rZW4oKTtpZihkfHxlKXt2YXIgZj1kb2N1bWVudC5oYXNUcnVzdFRva2VuKGMuaXNzdWVyT3JpZ2luKS50aGVuKGZ1bmN0aW9uKGcpe2lmKGcpe2lmKGQpcmV0dXJuIE1mKGEsYyl9ZWxzZXtpZihlKXJldHVybiBOZihhLGMsZCk7WShhLGMuaXNzdWVyT3JpZ2luLDMpfX0pO2IucHVzaChmKX1lbHNlIFkoYSxjLmlzc3Vlck9yaWdpbiw3KX0pO2lmKHdpbmRvdy5Qcm9taXNlJiZ3aW5kb3cuUHJvbWlzZS5hbGwpcmV0dXJuIHdpbmRvdy5Qcm9taXNlLmFsbChiKX19O3ZhciBQZj0icGxhdGZvcm0gcGxhdGZvcm1WZXJzaW9uIGFyY2hpdGVjdHVyZSBtb2RlbCB1YUZ1bGxWZXJzaW9uIGJpdG5lc3MiLnNwbGl0KCIgIiksUWY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmF2aWdhdG9yJiZhLm5hdmlnYXRvci51c2VyQWdlbnREYXRhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXM/YS5uYXZpZ2F0b3IudXNlckFnZW50RGF0YS5nZXRIaWdoRW50cm9weVZhbHVlcyhQZikudGhlbihmdW5jdGlvbihiKXt2YXIgYz1uZXcgVWM7Yz1IKGMsMSxiLnBsYXRmb3JtKTtjPUgoYywyLGIucGxhdGZvcm1WZXJzaW9uKTtjPUgoYywzLGIuYXJjaGl0ZWN0dXJlKTtjPUgoYyw0LGIubW9kZWwpO2M9SChjLDUsYi51YUZ1bGxWZXJzaW9uKTtyZXR1cm4gSChjLDksYi5iaXRuZXNzKX0pOm51bGx9O3ZhciBSZj1mdW5jdGlvbigpe3JldHVybiB3Lmdvb2dsZXRhZ3x8KHcuZ29vZ2xldGFnPXt9KX0sU2Y9ZnVuY3Rpb24oYSxiKXt2YXIgYz1SZigpO2MuaGFzT3duUHJvcGVydHkoYSl8fChjW2FdPWIpfSxUZj1mdW5jdGlvbihhLGIpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIsITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYil9O3ZhciBaPXsyNDc6Imh0dHBzOi8vc2VjdXJlcHViYWRzLmcuZG91YmxlY2xpY2submV0Iiw3Oi4wMiwxMzoxNTAwLDIzOi4wMDEsMzg6LjAwMSw1ODoxLDE1MDoiIiwyMTE6ITEsMjUzOiExLDE3MjpudWxsLDI0NTp7fSwxODA6bnVsbCwyNDY6W10sMjI3Ont9LDIyNjpbXSwyNDg6MCwyMjg6Ii8vd3d3Lmdvb2dsZXRhZ3NlcnZpY2VzLmNvbS9wdWJjb25zb2xlLyIsMjYxOiIvL2NvbnNvbGUuZ29vZ2xldGFnc2VydmljZXMuY29tL3B1YmNvbnNvbGUvIiwyNTA6bnVsbCwyNTI6bnVsbCwyNTg6bnVsbCwyNTE6bnVsbCwyNTk6bnVsbH07Wls2XT1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8hMDpiO3RyeXtmb3IodmFyIGM9bnVsbDtjIT1hO2M9YSxhPWEucGFyZW50KXN3aXRjaChhLmxvY2F0aW9uLnByb3RvY29sKXtjYXNlImh0dHBzOiI6cmV0dXJuITA7Y2FzZSJmaWxlOiI6cmV0dXJuIGI7Y2FzZSJodHRwOiI6cmV0dXJuITF9fWNhdGNoKGQpe31yZXR1cm4hMH0od2luZG93KTtaWzQ5XT0obmV3IERhdGUpLmdldFRpbWUoKTtaWzM2XT1qYygiZmFsc2UiKTtaWzE0OF09SGQ7WlsyMjFdPWpjKCIiKTtaWzI1NF09amMoInRydWUiKTtaWzIwNF09aWMoInt7TU9EfX0iLC0xKTtaWzI1N109amMoImZhbHNlIik7WlsyNjBdPXZvaWQgMDt2YXIgVz1mdW5jdGlvbigpe3dhKHRoaXMsWil9LFVmPWZ1bmN0aW9uKGEsYil7TShXKVthXT1ifSxWZj1SZigpLFdmPU0oVyk7d2EoV2YsVmYuX3ZhcnNfKTtWZi5fdmFyc189V2Y7dmFyIFhmPW5ldyBtLldlYWtNYXAsWWY9ZnVuY3Rpb24oYSxiKXthPVthXTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jOy0tYylhLnB1c2godHlwZW9mIGJbY10sYltjXSk7cmV0dXJuIGEuam9pbigiXHYiKX07dmFyIFpmPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP1lmOmI7dmFyIGM9dmEoYSksZD1mdW5jdGlvbihlKXtlPXIoZSk7ZS5uZXh0KCk7ZT1pYShlKTtyZXR1cm4gYihjLGUpfTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBmPVtdLGc9MDtnPGFyZ3VtZW50cy5sZW5ndGg7KytnKWZbZ109YXJndW1lbnRzW2ddO2c9dGhpc3x8dzt2YXIgaD1YZi5nZXQoZyk7aHx8KGg9e30sWGYuc2V0KGcsaCkpO2c9aDtoPVt0aGlzXS5jb25jYXQodChmKSk7Zj1kP2QoaCk6aDtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZyxmKSlnPWdbZl07ZWxzZXt2YXIgaz1yKGgpO2g9ay5uZXh0KCkudmFsdWU7az1pYShrKTtoPWEuYXBwbHkoaCxrKTtnPWdbZl09aH1yZXR1cm4gZ319KGZ1bmN0aW9uKGEpe3JldHVybihudWxsPT09YXx8dm9pZCAwPT09YT8wOmEuc3JjKT8vXig/Omh0dHBzPzopP1wvXC8oPzp3d3dcLmdvb2dsZXRhZ3NlcnZpY2VzXC5jb218c2VjdXJlcHViYWRzXC5nXC5kb3VibGVjbGlja1wubmV0fHBhZ2VhZDJcLmdvb2dsZXN5bmRpY2F0aW9uXC5jb20pXC90YWdcL2pzXC9ncHQoPzpfW2Etel0rKSpcLmpzLy50ZXN0KGEuc3JjKT8wOjE6Mn0sZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gYSsiXHYiKyhudWxsPT09KGM9YlswXSl8fHZvaWQgMD09PWM/dm9pZCAwOmMuc3JjKX0pO2Z1bmN0aW9uICRmKCl7cmV0dXJuIDA9PT1aZihNKFcpWzE3Ml0pfWZ1bmN0aW9uIGFnKCl7cmV0dXJuIGljKCIxIil8fDB9ZnVuY3Rpb24gYmcoKXt2YXIgYT1OdW1iZXIoIjIwMjEwNzAxMDEiKTsxPmF8fE1hdGguZmxvb3IoYSkhPT1hPyhvYyh7djoiMjAyMTA3MDEwMSJ9LCJncHRfaW52X3ZlciIpLGE9IjEiKTphPSIyMDIxMDcwMTAxIjtyZXR1cm4gYX12YXIgUmU9ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzW3dkXT0oYVszXT0kZixhWzJdPU0oVylbMzZdLGFbMTddPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtyZXR1cm4gbihjLCJpbmNsdWRlcyIpLmNhbGwoYyxTdHJpbmcobGMoKSkpfSxhWzIxXT1mdW5jdGlvbigpe3JldHVybiBNKFcpWzE0OF19LGFbNTBdPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1NYXRoLmZsb29yKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzI0LzYwLzYwLzFlMyklMn0sYVs1NF09ZnVuY3Rpb24oKXtyZXR1cm4gTShXKVsyNTldfSxhKTthPXt9O3RoaXNbT109KGFbMV09ZnVuY3Rpb24oKXtyZXR1cm4gTShXKVsyMDRdfSxhWzRdPWFnLGEpO3RoaXNbUF09e319O3ZhciBjZz1bXSxkZz1mdW5jdGlvbihhKXt2YXIgYj1uZXcgQWUoTShXKVsyNDZdKTthPW5ldyBBZShhfHxjZyk7aWYoIUooYixRLDEpLmxlbmd0aCYmSihhLFEsMSkubGVuZ3RoKXt2YXIgYz1KKGEsUSwxKTtRYihiLDEsYyl9IUooYixWLDIpLmxlbmd0aCYmSihhLFYsMikubGVuZ3RoJiYoYT1KKGEsViwyKSxRYihiLDIsYSkpO1RlKGIpfTt2YXIgZWc9ZnVuY3Rpb24oYSl7aWYoYT1hLnNjcmlwdHMpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07aWYoLTE8Yy5zcmMuaW5kZXhPZigiL3RhZy9qcy9ncHQiKSlyZXR1cm4gY31yZXR1cm4gbnVsbH0sZmcsZ2csaGc9ZnVuY3Rpb24oYSl7YT0obnVsbCE9KGdnPW51bGw9PShmZz1hKT92b2lkIDA6Zmcuc3JjKT9nZzoiIikubWF0Y2goWWIpWzNdfHxudWxsO3JldHVybiJwYWdlYWQyLmdvb2dsZXN5bmRpY2F0aW9uLmNvbSI9PT1aYihhKX0saWc9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50U2NyaXB0O3JldHVybiJjb21wbGV0ZSI9PT1hLnJlYWR5U3RhdGV8fCJsb2FkZWQiPT09YS5yZWFkeVN0YXRlfHwhKG51bGw9PWJ8fCFiLmFzeW5jKX0samc9ZnVuY3Rpb24oYSl7YT1oZyhhKT94KCJodHRwczovL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tLyIpOmdmO2E9VWEoW2EsZmYseCgiMjAyMTA3MDEwMSIpLHgoIi5qcyIpXSk7dmFyIGI9bWQoRmMpO3JldHVybiBiP1FhKGEsU3RyaW5nKGIpKTphfSxrZz1mdW5jdGlvbigpe3RoaXMuaj1bXTt0aGlzLmg9dGhpcy5nPXZvaWQgMH0sbGc9ZnVuY3Rpb24oYSxiLGMpe2EuZz1iO2EuaD1jO2Zvcih2YXIgZD1yKGEuaiksZT1kLm5leHQoKTshZS5kb25lO2U9ZC5uZXh0KCkpZT1lLnZhbHVlLGUoYixjKTthLmoubGVuZ3RoPTB9LG1nPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmxvY2F0aW9uLmhvc3Q7aWYoTihFYykpe3ZhciBlPWImJmFjKGIuc3JjLCJkb21haW4iKSxmPWImJmFjKGIuc3JjLCJuZXR3b3JrLWNvZGUiKTtpZighZCYmIWUmJiFmKXJldHVybiBsZyhjLHZvaWQgMCxuZXcgYS5FcnJvcigibm8gcHJvdmlkZWQgb3IgaW5mZXJyZWQgZGF0YSIpKSxudWxsO2E9aGcoYik/eCgiaHR0cHM6Ly9wYWdlYWQyLmdvb2dsZXN5bmRpY2F0aW9uLmNvbSIpOngoImh0dHBzOi8vc2VjdXJlcHViYWRzLmcuZG91YmxlY2xpY2submV0Iik7cmV0dXJuIFFhKFVhKFthLHgoIi9wYWdlYWQvcHB1Yl9jb25maWciKV0pLHtpcHBkOmQscHBwZDplLHBwcG5jOmZ9KX1kPWhnKGIpP3goImh0dHBzOi8vcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL21hbmFnZWQvanMvY29uZmlnXyV7c3p9X18le3R0bH0uanNvbiIpOngoImh0dHBzOi8vc2VjdXJlcHViYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9tYW5hZ2VkL2pzL2NvbmZpZ18le3N6fV9fJXt0dGx9Lmpzb24iKTtlPXtzejpNKGxkKS5qKENjLmcsQ2MuZGVmYXVsdFZhbHVlKSx0dGw6bWQoRGMpfTthPXtkb21haW46YS5sb2NhdGlvbi5ob3N0fTtyZXR1cm4gUWEoVGEoZCxlKSxhLHZvaWQgMCl9LG5nPWZ1bmN0aW9uKGEsYil7Y29uc3QgJF9fX29sZF82ZDlmNzJjZTBmNjMyODQ0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2lmKCRfX19vbGRfNmQ5ZjcyY2UwZjYzMjg0NCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19tb2NrXzcwZTBjOWI2MmUxMDAwMWQuWE1MSHR0cFJlcXVlc3QpO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPW5ldyBhLlhNTEh0dHBSZXF1ZXN0LGQ9bmV3IGtnO2I9bWcoYSxiLGQpO1VmKDI2MCxmdW5jdGlvbihlKXt2b2lkIDAhPT1kLmd8fGQuaD9lKGQuZyxkLmgpOmQuai5wdXNoKGUpfSk7YiYmKGMub3BlbigiR0VUIixiLnRvU3RyaW5nKCksITApLGMud2l0aENyZWRlbnRpYWxzPSExLGMub25sb2FkPWZ1bmN0aW9uKCl7MzAwPmMuc3RhdHVzPyhoZigiMTMiLGEpLGxnKGQsMjA0PT1jLnN0YXR1cz8iIjpjLnJlc3BvbnNlVGV4dCkpOmxnKGQsdm9pZCAwLG5ldyBhLkVycm9yKCJyZXNwOiIrYy5zdGF0dXMpKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIGxnKGQsdm9pZCAwLG5ldyBhLkVycm9yKCJzOiIrYy5zdGF0dXMrIiByczoiK2MucmVhZHlTdGF0ZSkpfSxjLnNlbmQoKSl9LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2lmKCRfX19vbGRfNmQ5ZjcyY2UwZjYzMjg0NCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19vbGRfNmQ5ZjcyY2UwZjYzMjg0NCl9fSxvZz1mdW5jdGlvbihhLGIsYyxkKXtVZigxNzIsZCk7VWYoMjU5LGlnKGEpKTtuZXcgZGcoYik7TShxZSkuZygxMik7TShxZSkuZyg1KTtOKFBjKXx8KGE9TihRYyk/bmV3IEtmOm5ldyBLZihmdW5jdGlvbihlKXtVZigyNTAsZSl9KSwwPG1kKFJjKT9VZigyNTgsT2YoYSkpOk9mKGEpKTsoYT1RZihjKSkmJmEudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gVWYoMjUxLEpTT04uc3RyaW5naWZ5KGUuaCYmUGIoZSksVGIpKX0pO2VmKGMuZG9jdW1lbnQpO1dlKGMuZG9jdW1lbnQpO04oemMpfHwoYT0iIixkJiZkLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkLWZjIikmJihhPWFjKGQuc3JjLCJuZXR3b3JrLWNvZGUiKSkmJm5ldyBvZChjLGEpLnN0YXJ0KCkpfSxwZz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9UmYoKTthPWF8fGQuZmlmV2lufHx3aW5kb3c7Yj1ifHxhLmRvY3VtZW50O3ZhciBlPWQuZmlmV2luP3dpbmRvdzphO1NmKCJfbG9hZGVkXyIsITApO1NmKCJnZXRWZXJzaW9uIixiZyk7U2YoImNtZCIsW10pO3ZhciBmPWIuY3VycmVudFNjcmlwdHx8ZWcoYik7b2coYixjLGEsZik7dHJ5e3hmKCl9Y2F0Y2gobCl7fWhmKCIxIixhKTthPWpnKGYpO2lmKCFNKFcpWzI1OV0pe2M9ImdwdC1pbXBsLSIrTWF0aC5yYW5kb20oKTt0cnl7dmIoYixzYihhLHtpZDpjLG5vbmNlOnhiKCl9KSl9Y2F0Y2gobCl7fWIuZ2V0RWxlbWVudEJ5SWQoYykmJihkLl9sb2FkU3RhcnRlZF89ITApfWlmKCFkLl9sb2FkU3RhcnRlZF8pe2M9ZC5maWZXaW4/ZS5kb2N1bWVudDpiO3ZhciBnPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Zy5zcmM9T2EoYSk7VWIoZyk7Zy5hc3luYz0hMDt2YXIgaD1jLmhlYWR8fGMuYm9keXx8Yy5kb2N1bWVudEVsZW1lbnQ7ImNvbXBsZXRlIiE9PWUuZG9jdW1lbnQucmVhZHlTdGF0ZSYmZC5maWZXaW4/VGYoZSxmdW5jdGlvbigpe3JldHVybiB2b2lkIGguYXBwZW5kQ2hpbGQoZyl9KTpoLmFwcGVuZENoaWxkKGcpO2QuX2xvYWRTdGFydGVkXz0hMH12YXIgaztOKEFjKSYmZT09PWUudG9wJiYoTShXKVsyNTldfHwhYi5jdXJyZW50U2NyaXB0JiYobnVsbD09KGs9ZWcoYikpPzA6ay5hc3luYykpJiYoTihCYykmJmpkKGUpLG5nKGUsZikpfTt2YXIgcWc7YTp7dHJ5e2lmKEFycmF5LmlzQXJyYXkoRSkpe3FnPUU7YnJlYWsgYX19Y2F0Y2goYSl7fXFnPVtdfShmdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IGFmKG51bGwsImdwdF9leGNlcHRpb24iLC4wMSk7YmYoZCxmdW5jdGlvbihlKXtlLm1ldGhvZElkPTQyMH0pO2NmKGQsZnVuY3Rpb24oKXtyZXR1cm4gcGcoYSxiLGMpfSl9KSh2b2lkIDAsdm9pZCAwLHFnKX0pLmNhbGwodGhpcy5nb29nbGV0YWcmJmdvb2dsZXRhZy5maWZXaW4/Z29vZ2xldGFnLmZpZldpbi5wYXJlbnQ6dGhpcyxbW1tudWxsLDcsbnVsbCxbbnVsbCwuMV1dLFszNzYxOTA2NzcsbnVsbCxudWxsLFsxXV0sWzUxNCxudWxsLG51bGwsWzFdXSxbMzYxMTc0MzczLG51bGwsbnVsbCxbMV1dLFtudWxsLDM3ODI5MDk3NCxudWxsLFtudWxsLC4wMV1dLFtudWxsLDQ5NCxudWxsLFtudWxsLDVlM11dLFszNzU3OTQ4OTgsbnVsbCxudWxsLFsxXV0sWzM3NDY1MzU1OSxudWxsLG51bGwsWzFdXSxbMzcyNjExNDQ4LG51bGwsbnVsbCxbMV1dLFszNzc1NTgwNzMsbnVsbCxudWxsLFsxXV0sWzM3NTA5MDk5MyxudWxsLG51bGwsWzFdXSxbMjAsbnVsbCxudWxsLG51bGwsW1tbMSxbWzYsbnVsbCxudWxsLDMsbnVsbCwwXV1dLFsxXV1dXSxbbnVsbCw0OTIsbnVsbCxbbnVsbCwuMDFdXSxbMzc0NjY1Mzc5LG51bGwsbnVsbCxbMV1dLFszMzkwNDM2NjUsbnVsbCxudWxsLFsxXV0sW251bGwsNDcwLG51bGwsW251bGwsMTBdXSxbbnVsbCw4LG51bGwsW251bGwsLTFdXSxbbnVsbCwzNzQyMDEyNjksbnVsbCxbbnVsbCw2ZTRdXSxbMzc0MjAxMjY4LG51bGwsbnVsbCxbMV1dLFs1MzAsbnVsbCxudWxsLFsxXV0sW251bGwsMzcxMzY0MjEzLG51bGwsW251bGwsNmU0XV0sW251bGwsMzczNDQwOTIzLG51bGwsW251bGwsMWUtNF1dLFtudWxsLDM3NjE0OTc1NyxudWxsLFtudWxsLC4wMDI1XV0sWzM3MTM2NDIxMixudWxsLG51bGwsWzFdXSxbNDM3LG51bGwsbnVsbCxbMV1dLFtudWxsLDQ3LG51bGwsW251bGwsMV1dLFtudWxsLG51bGwsMixbbnVsbCxudWxsLCIxLTAtMzgiXV0sWzM3MzA1NjM3NyxudWxsLG51bGwsWzFdXSxbMzcwNzIzNzU5LG51bGwsbnVsbCxbMV1dLFtudWxsLDM2MDI0NTU5NSxudWxsLFtudWxsLDIwMF1dLFtudWxsLDYxLG51bGwsW251bGwsLjAwMV1dLFsxOTM2LG51bGwsbnVsbCxbMV1dLFszNjQyOTU5OTIsbnVsbCxudWxsLFsxXV0sW251bGwsbnVsbCxudWxsLFtudWxsLG51bGwsbnVsbCxbImNyaXRlbyIsImluZGV4IiwiaW5kZXh0ZXN0Iiwib3BlbngiLCJvcGVueHRlc3QiLCJwdWJjaWQub3JnIiwicHVibWF0aWMiLCJ0aGV0cmFkZWRlc2t0ZXN0Il1dLG51bGwsMTkxOF0sWzQ0NixudWxsLG51bGwsWzFdXSxbbnVsbCwxOTIxLG51bGwsW251bGwsNzJdXSxbbnVsbCwxOTIwLG51bGwsW251bGwsMjRdXSxbMzczODEwMTA2LG51bGwsbnVsbCxbMV1dLFtudWxsLDE5MjIsbnVsbCxbbnVsbCw1XV0sW251bGwsMTkxNyxudWxsLFtudWxsLC0xXV0sW251bGwsMTkxNixudWxsLFtudWxsLC4wMDFdXSxbMTkzMSxudWxsLG51bGwsWzFdXSxbMTk0NSxudWxsLG51bGwsWzFdXSxbMTkzOCxudWxsLG51bGwsWzFdXSxbbnVsbCwxOTI5LG51bGwsW251bGwsNTBdXSxbbnVsbCxudWxsLG51bGwsW251bGwsbnVsbCxudWxsLFsiZmFjZWJvb2tbLl1jb20iLCJ3aGF0c2FwcFsuXWNvbSIsInlvdXR1YmVbLl1jb20iLCJnb29nbGVbLl1jb20iLCJcXC9hZHM/XFwvIl1dLG51bGwsOV1dLFtbMTMsW1s1MCxbWzMxMDYxNDIwXSxbMzEwNjE0MjEsW1szNzc5MTQ0NTAsbnVsbCxudWxsLFsxXV1dXV1dLFsxMCxbWzIxMDY1NzI2LG51bGwsWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY1NzI3LFtbMjQwLG51bGwsbnVsbCxbMV1dXSxbNCxudWxsLDYsbnVsbCxudWxsLG51bGwsbnVsbCxbIjIxMDY1NzI1Il1dXSxbMjEwNjU3MjgsW1syNDEsbnVsbCxudWxsLFsxXV1dLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMjEwNjU3MjUiXV1dXSxbNCxudWxsLDksbnVsbCxudWxsLG51bGwsbnVsbCxbIkxheW91dFNoaWZ0Il1dXSxbMTAwLFtbMjEwNjcwODddLFsyMTA2NzA4OCxbWzc4LG51bGwsbnVsbCxbMV1dXV1dLFsyLFtbNCxudWxsLDYsbnVsbCxudWxsLG51bGwsbnVsbCxbIjMxMDYxNjkxIl1dXV1dLFsxMCxbWzIxMDY3NjY0LG51bGwsWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY3NjY1LFtbbnVsbCwxOTA1LG51bGwsW251bGwsMzBdXV0sWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY3NjY2LFtbbnVsbCwxOTA1LG51bGwsW251bGwsNjBdXV0sWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY3NjY3LFtbbnVsbCwxOTA1LG51bGwsW251bGwsMTIwXV1dLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMjEwNjU3MjUiXV1dXSxbNCxudWxsLDksbnVsbCxudWxsLG51bGwsbnVsbCxbIkxheW91dFNoaWZ0Il1dXSxbMTAsW1syMTA2OTg4OCxbW251bGwsMTkyOSxudWxsLFtudWxsLDUwXV1dLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMjEwNjU3MjUiXV1dLFsyMTA2OTg4OSxbW251bGwsMTkyOSxudWxsLFtudWxsLDI1XV1dLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMjEwNjU3MjUiXV1dLFsyMTA2OTg5MCxbW251bGwsMTkyOSxudWxsLFtudWxsLDFdXV0sWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY5ODkxLFtbbnVsbCwxOTI5LG51bGwsW251bGwsNzVdXV0sWzQsbnVsbCw2LG51bGwsbnVsbCxudWxsLG51bGwsWyIyMTA2NTcyNSJdXV0sWzIxMDY5ODkyLFtbbnVsbCwxOTI5LG51bGwsW251bGwsMTAwXV1dLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMjEwNjU3MjUiXV1dXSxbNCxudWxsLDksbnVsbCxudWxsLG51bGwsbnVsbCxbIkxheW91dFNoaWZ0Il1dXSxbNTAwLFtbMzEwNjE2OTJdLFszMTA2MTY5MyxbWzc3LG51bGwsbnVsbCxbMV1dLFs3OCxudWxsLG51bGwsWzFdXSxbODUsbnVsbCxudWxsLFsxXV0sWzgwLG51bGwsbnVsbCxbMV1dLFs3NixudWxsLG51bGwsWzFdXV1dXSxbNCxudWxsLDYsbnVsbCxudWxsLG51bGwsbnVsbCxbIjMxMDYxNjkxIl1dXV1dLFsyMCxbWzEsW1szMTA2MTY5NF0sWzMxMDYxNjk1LFtbMzgwMDI1OTQxLG51bGwsbnVsbCxbMV1dXV1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwyMDEsbnVsbCwxMDJdXV0sWzQsW1tudWxsLFtbNDQ3MTQ0NDksW1tudWxsLDcsbnVsbCxbbnVsbCwxXV1dXSxbNjc2OTgyOTYxLFtbbnVsbCw3LG51bGwsW251bGwsLjRdXSxbMjEyLG51bGwsbnVsbCxbMV1dXV0sWzY3Njk4Mjk5NixbW251bGwsNyxudWxsLFtudWxsLDFdXV1dXV0sW251bGwsW1szMTA2MTMyMixbWzQ5NyxudWxsLG51bGwsWzFdXV1dLFszMTA2MTczMyxbWzQ5NyxudWxsLG51bGwsWzFdXV1dXV1dXSxbMyxbW251bGwsW1s0NDczMjczMF0sWzQ0NzMyNzMxXV1dLFtudWxsLFtbNjc2OTgyOTYwXSxbNjc2OTgyOTk0XSxbNjc2OTgyOTk4XV1dLFtudWxsLFtbNjc2OTgyOTc1XSxbNjc2OTgyOTgwXV1dLFtudWxsLFtbMTMzNyxbWzc3LG51bGwsbnVsbCxbMV1dLFs3OCxudWxsLG51bGwsWzFdXSxbODUsbnVsbCxudWxsLFsxXV0sWzgwLG51bGwsbnVsbCxbMV1dLFs3NixudWxsLG51bGwsWzFdXSxbODQsbnVsbCxudWxsLFsxXV0sWzE4OCxudWxsLG51bGwsWzFdXV1dXV0sWzEwLFtbMjEwNjQzNjVdLFsyMTA2NDM2NixbW251bGwsbnVsbCxudWxsLFtudWxsLG51bGwsbnVsbCxbInVfdHoiXV0sbnVsbCw0ODldXV0sWzIxMDY0MzY3LFtbbnVsbCxudWxsLG51bGwsW251bGwsbnVsbCxudWxsLFsidV9oaXMiXV0sbnVsbCw0ODldXV0sWzIxMDY0MzY4LFtbbnVsbCxudWxsLG51bGwsW251bGwsbnVsbCxudWxsLFsidV9haCIsInVfYXciXV0sbnVsbCw0ODldXV0sWzIxMDY0MzY5LFtbbnVsbCxudWxsLG51bGwsW251bGwsbnVsbCxudWxsLFsidV9jZCJdXSxudWxsLDQ4OV1dXSxbMjEwNjQzNzAsW1tudWxsLG51bGwsbnVsbCxbbnVsbCxudWxsLG51bGwsWyJ1X25wbHVnIl1dLG51bGwsNDg5XV1dLFsyMTA2NDM3MSxbW251bGwsbnVsbCxudWxsLFtudWxsLG51bGwsbnVsbCxbInVfbm1pbWUiXV0sbnVsbCw0ODldXV0sWzIxMDY0MzcyLFtbbnVsbCxudWxsLG51bGwsW251bGwsbnVsbCxudWxsLFsiZmxhc2giXV0sbnVsbCw0ODldXV1dLG51bGwsMTVdLFsxZTMsW1syMTA2NzQ5N11dLFs0LG51bGwsOSxudWxsLG51bGwsbnVsbCxudWxsLFsiZG9jdW1lbnQuaGFzVHJ1c3RUb2tlbiJdXV0sWzUwLFtbMjEwNjgwMzBdLFsyMTA2ODAzMSxbWzQzNyxudWxsLG51bGwsW11dXV1dXSxbMTAsW1syMTA2ODExMF0sWzIxMDY4MTExLFtbNDUzLG51bGwsbnVsbCxbMV1dLFs0NTQsbnVsbCxudWxsLFsxXV1dXV1dLFsxMCxbWzIxMDY4NzY2XSxbMjEwNjg3NjcsW1tudWxsLDQ4OCxudWxsLFtudWxsLC4xXV1dXV1dLFsxMCxbWzIxMDY4ODYzXSxbMjEwNjg4NjQsW1s5OCxudWxsLG51bGwsWzFdXV1dXV0sWzFlMyxbWzIyMzE2NDM3LG51bGwsWzIsW1syLFtbOCxudWxsLG51bGwsMSxudWxsLC0xXSxbNyxudWxsLG51bGwsMSxudWxsLDVdXV0sWzQsbnVsbCwzXV1dXSxbMjIzMTY0MzgsbnVsbCxbMixbWzIsW1s4LG51bGwsbnVsbCwxLG51bGwsNF0sWzcsbnVsbCxudWxsLDEsbnVsbCwxMF1dXSxbNCxudWxsLDNdXV1dXSxbNCxudWxsLDNdXSxbMTAsW1szMTA2MDM5Nl0sWzMxMDYwMzk3LG51bGwsWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3aW5kb3cudG9wLmZyYW1lcy5nb29nbGVfYWRzX3RvcF9mcmFtZSJdXV0sWzMxMDYwMzk4LG51bGwsWzEsW1s0LG51bGwsOCxudWxsLG51bGwsbnVsbCxudWxsLFsid2luZG93LnRvcC5mcmFtZXMuZ29vZ2xlX2Fkc190b3BfZnJhbWUiXV1dXV0sWzMxMDYwMzk5LG51bGwsWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3aW5kb3cudG9wLmZyYW1lcy5nb29nbGVfYWRzX3RvcF9mcmFtZV9jdHJsIl1dXSxbMzEwNjA0MDAsbnVsbCxbMSxbWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3aW5kb3cudG9wLmZyYW1lcy5nb29nbGVfYWRzX3RvcF9mcmFtZV9jdHJsIl1dXV1dXV0sWzEwLFtbMzEwNjA0MTFdLFszMTA2MDQxMixbW251bGwsMzU5MzQ2OTU2LG51bGwsW251bGwsMV1dXV0sWzMxMDYwNDEzLFtbbnVsbCwzNTkzNDY5NTYsbnVsbCxbbnVsbCwyXV1dXV1dLFsxZTMsW1szMTA2MDQ3NSxudWxsLFsyLFtbMSxbWzQsbnVsbCw5LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3aW5kb3cuUGVyaW9kaWNTeW5jTWFuYWdlciJdXV1dLFsxMixudWxsLG51bGwsbnVsbCw0LG51bGwsIkFuZHJvaWQiLFsibmF2aWdhdG9yLnVzZXJBZ2VudCJdXV1dXV1dLFsxLFtbMzEwNjA1NDRdLFszMTA2MDU0NSxbW251bGwsbnVsbCwzNjM5MzEwMjIsW251bGwsbnVsbCwiQXhTRzR3ZTdZRmduNTN6Tkg2TENCWEJLdjNVdGZ6bHpjOEdZUzhkYXFqRHFsa3ZRbnJuVGl4VWNpK1NlK3A0aStqZmRCMTBnZGxlZWI3UDRoZXBCWHdVQUFBQ0JleUp2Y21sbmFXNGlPaUpvZEhSd2N6b3ZMM05sWTNWeVpYQjFZbUZrY3k1bkxtUnZkV0pzWldOc2FXTnJMbTVsZERvME5ETWlMQ0ptWldGMGRYSmxJam9pVTNWaWNtVnpiM1Z5WTJWWFpXSkNkVzVrYkdWeklpd2laWGh3YVhKNUlqb3hOakk1T0RRNU5UazVMQ0pwYzFSb2FYSmtVR0Z5ZEhraU9uUnlkV1Y5Il1dXV1dLFsxMixudWxsLG51bGwsbnVsbCw0LG51bGwsIkNocm9tZS8oOVxcZHxcXGR7Myx9KSIsWyJuYXZpZ2F0b3IudXNlckFnZW50Il1dXSxbbnVsbCxbWzMxMDYwNzM1XSxbMzEwNjA3MzYsW1s1MjEsbnVsbCxudWxsLFsxXV1dXV0sbnVsbCwzOV0sWzEwMCxbWzMxMDYwNzQ4XSxbMzEwNjA3NDksW1szNjAyNDU1OTgsbnVsbCxudWxsLFsxXV1dXV0sWzQsbnVsbCw5LG51bGwsbnVsbCxudWxsLG51bGwsWyJkb2N1bWVudC5pbnRlcmVzdENvaG9ydCJdXV0sWzEwLFtbMzEwNjA5NzZdLFszMTA2MDk3NyxbWzM3MTM5MDM5MCxudWxsLG51bGwsWzFdXV1dXV0sWzEsW1szMTA2MTE1NV0sWzMxMDYxMTU2LFtbNDkzLG51bGwsbnVsbCxbMV1dXV1dXSxbNTAsW1szMTA2MTE4MF0sWzMxMDYxMTgxLFtbMzcwOTkzNjg4LG51bGwsbnVsbCxbMV1dXV1dXSxbMzAwLFtbMzEwNjExODQsbnVsbCxbNCxudWxsLDgsbnVsbCxudWxsLG51bGwsbnVsbCxbInRvcC5mcmFtZXMuZ29vZ2xlX2Fkc190b3BfZnJhbWUiXV1dLFszMTA2MTE4NSxbWzM2MDI0NTU5NixudWxsLG51bGwsWzFdXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ0b3AuZnJhbWVzLmdvb2dsZV9hZHNfdG9wX2ZyYW1lIl1dXSxbMzEwNjExODYsW1szNzExNTc5MTAsbnVsbCxudWxsLFsxXV0sWzM2MDI0NTU5NixudWxsLG51bGwsWzFdXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ0b3AuZnJhbWVzLmdvb2dsZV9hZHNfdG9wX2ZyYW1lIl1dXV1dLFsxZTMsW1szMTA2MTE5OSxudWxsLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMzEwNjExNjAiXV1dLFszMTA2MTIwMCxudWxsLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMzEwNjExNjEiXV1dXSxbNCxudWxsLDEwXV0sWzEwLFtbMzEwNjEzMjldLFszMTA2MTMzMF1dXSxbNTAsW1szMTA2MTQxNF0sWzMxMDYxNDE1LFtbNDQwLG51bGwsbnVsbCxbMV1dXV1dXSxbMWUzLFtbMzEwNjE0MjQsbnVsbCxbNCxudWxsLDYsbnVsbCxudWxsLG51bGwsbnVsbCxbIjMxMDYxNDIyIl1dXSxbMzEwNjE0MjUsbnVsbCxbNCxudWxsLDYsbnVsbCxudWxsLG51bGwsbnVsbCxbIjMxMDYxNDIzIl1dXV0sWzQsbnVsbCwxMF1dLFs1MCxbWzMxMDYxNDk4XSxbMzEwNjE0OTksW1szNzMwNTYzNzcsbnVsbCxudWxsLFtdXV1dXV0sWzEwLFtbMzEwNjE3MDFdLFszMTA2MTcwMixbWzQ0MCxudWxsLG51bGwsWzFdXSxbMzc4NDEwNzYzLG51bGwsbnVsbCxbMV1dXV1dXSxbNTAsW1szMTA2MTcxOV0sWzMxMDYxNzIwLFtbMzc4ODk5NDI1LG51bGwsbnVsbCxbMV1dLFszNzc5NjYwODUsbnVsbCxudWxsLFsxXV1dXV1dLFs1MCxbWzQ0NzQxODk4XSxbNDQ3NDE4OTksW1s0NzQsbnVsbCxudWxsLFsxXV1dXV1dXV0sWzUsW1s1MCxbWzIxMDYyNzg1LFtbMjMsbnVsbCxudWxsLFtdXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJfZ21wdG5sIl1dXSxbMjEwNjI3ODYsW1syMyxudWxsLG51bGwsWzFdXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJfZ21wdG5sIl1dXV0sWzEyLG51bGwsbnVsbCxudWxsLDIsbnVsbCwidG9kYXlcXC5saW5lXFwubWUvLisvKG1haW58YXJ0aWNsZSkiXV0sWzkwMCxbWzIxMDYyODEyLFtbMjMsbnVsbCxudWxsLFsxXV1dLFs0LG51bGwsOCxudWxsLG51bGwsbnVsbCxudWxsLFsiX2dtcHRubCJdXV1dLFsxMixudWxsLG51bGwsbnVsbCwyLG51bGwsInRvZGF5XFwubGluZVxcLm1lLy4rLyhtYWlufGFydGljbGUpIl1dLFs1MCxbWzIxMDYzOTE2LFtbMjMsbnVsbCxudWxsLFtdXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3ZWJraXQubWVzc2FnZUhhbmRsZXJzLl9nbXB0bmwiXV1dLFsyMTA2MzkxNyxbWzIzLG51bGwsbnVsbCxbMV1dXSxbNCxudWxsLDgsbnVsbCxudWxsLG51bGwsbnVsbCxbIndlYmtpdC5tZXNzYWdlSGFuZGxlcnMuX2dtcHRubCJdXV1dLFsxMixudWxsLG51bGwsbnVsbCwyLG51bGwsInRvZGF5XFwubGluZVxcLm1lLy4rLyhtYWlufGFydGljbGUpIl1dLFs5MDAsW1syMTA2NDExMyxbWzIzLG51bGwsbnVsbCxbMV1dXSxbNCxudWxsLDgsbnVsbCxudWxsLG51bGwsbnVsbCxbIndlYmtpdC5tZXNzYWdlSGFuZGxlcnMuX2dtcHRubCJdXV1dLFsxMixudWxsLG51bGwsbnVsbCwyLG51bGwsInRvZGF5XFwubGluZVxcLm1lLy4rLyhtYWlufGFydGljbGUpIl1dLFs1MCxbWzMxMDYwMDA2LG51bGwsWzIsW1sxMixudWxsLG51bGwsbnVsbCw0LG51bGwsIkFuZHJvaWQiLFsibmF2aWdhdG9yLnVzZXJBZ2VudCJdXSxbMTIsbnVsbCxudWxsLG51bGwsNCxudWxsLCJDaHJvbWUvKDg5fDlcXGR8XFxkezMsfSkiLFsibmF2aWdhdG9yLnVzZXJBZ2VudCJdXSxbNCxudWxsLDksbnVsbCxudWxsLG51bGwsbnVsbCxbIndpbmRvdy5QZXJpb2RpY1N5bmNNYW5hZ2VyIl1dXV1dLFszMTA2MDAwNyxbWzE5MjgsbnVsbCxudWxsLFsxXV1dLFsyLFtbMTIsbnVsbCxudWxsLG51bGwsNCxudWxsLCJBbmRyb2lkIixbIm5hdmlnYXRvci51c2VyQWdlbnQiXV0sWzEyLG51bGwsbnVsbCxudWxsLDQsbnVsbCwiQ2hyb21lLyg4OXw5XFxkfFxcZHszLH0pIixbIm5hdmlnYXRvci51c2VyQWdlbnQiXV0sWzQsbnVsbCw5LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3aW5kb3cuUGVyaW9kaWNTeW5jTWFuYWdlciJdXV1dXV1dLFsxMCxbWzMxMDYwMDMyXSxbMzEwNjAwMzMsW1sxOTI4LG51bGwsbnVsbCxbMV1dXV1dXSxbMTAsW1szMTA2MDQzN10sWzMxMDYwNDM4LFtbMjAwLG51bGwsbnVsbCxbMV1dXV0sWzMxMDYwNDM5LFtbMjIwLG51bGwsbnVsbCxbMV1dXV1dLG51bGwsMjRdLFsxMCxbWzMxMDYwODM3XSxbMzEwNjA4MzgsW1szNjgyNzk1NTYsbnVsbCxudWxsLFsxXV0sWzM2NjgwOTQxMyxudWxsLG51bGwsWzFdXV1dXV0sWzEwLFtbMzEwNjA5NzhdLFszMTA2MDk3OSxbWzM2OTQzMCxudWxsLG51bGwsWzFdXV1dXV0sWzUwLFtbMzEwNjExNjBdLFszMTA2MTE2MSxbWzUwNCxudWxsLG51bGwsWzFdXSxbbnVsbCw1MjksbnVsbCxbbnVsbCwyMF1dXV1dXSxbNTAsW1szMTA2MTQyMl0sWzMxMDYxNDIzLFtbMzY1NjM1OTY2LG51bGwsbnVsbCxbMV1dXV1dXSxbMTUwLFtbMzEwNjE0ODJdLFszMTA2MTQ4MyxbW251bGwsMzYwMjQ1NTk1LG51bGwsW251bGwsMjAwXSxbW1sxMixudWxsLG51bGwsbnVsbCw0LG51bGwsIkFuZHJvaWQiLFsibmF2aWdhdG9yLnVzZXJBZ2VudCJdXSxbbnVsbCw1MDBdXV1dLFszNjAyNDU1OTcsbnVsbCxudWxsLFsxXV0sW251bGwsNTE3LG51bGwsW251bGwsMV1dXV1dLFszLFtbNCxudWxsLDgsbnVsbCxudWxsLG51bGwsbnVsbCxbImdtYVNkay5nZXRRdWVyeUluZm8iXV0sWzQsbnVsbCw4LG51bGwsbnVsbCxudWxsLG51bGwsWyJ3ZWJraXQubWVzc2FnZUhhbmRsZXJzLmdldEdtYVF1ZXJ5SW5mby5wb3N0TWVzc2FnZSJdXSxbNCxudWxsLDgsbnVsbCxudWxsLG51bGwsbnVsbCxbIndlYmtpdC5tZXNzYWdlSGFuZGxlcnMuZ2V0R21hU2lnLnBvc3RNZXNzYWdlIl1dXV1dLFsxMDAsW1szMTA2MTY0OV0sWzMxMDYxNjUwLFtbMzU5NzYsbnVsbCxudWxsLFsxXV1dXV1dLFsxMDAsW1szMTA2MTY2M10sWzMxMDYxNjY0LFtbMzc1OTcxODM3LG51bGwsbnVsbCxbMV1dXV1dXSxbMTAsW1szMTA2MTcxNF0sWzMxMDYxNzE1LFtbMzU5NzcsbnVsbCxudWxsLFsxXV1dXV1dLFsxMCxbWzMxMDYxNzM2XSxbMzEwNjE3MzcsW1tudWxsLDM3NzI4OTAxOSxudWxsLFtudWxsLDFlNF1dXV1dXSxbMTAwLFtbMzEwNjE3MzhdLFszMTA2MTczOSxbWzM3MzgyMTg5MSxudWxsLG51bGwsWzFdXV1dXV0sWzEwMCxbWzMxMDYxNzQ4XSxbMzEwNjE3NDksW1szNzg4OTYwNzQsbnVsbCxudWxsLFsxXV1dXV1dLFsxZTMsW1szMTA2MTc1NixbW251bGwsMjQsbnVsbCxbbnVsbCwzMTA2MTc1Nl1dLFtudWxsLDI1LG51bGwsW251bGwsMzEwNjE3NTZdXV0sWzYsbnVsbCxudWxsLDQsbnVsbCwyXV0sWzMxMDYxNzU3LFtbbnVsbCwyNCxudWxsLFtudWxsLDMxMDYxNzU3XV0sW251bGwsMjUsbnVsbCxbbnVsbCwzMTA2MTc1N11dXSxbNixudWxsLG51bGwsNCxudWxsLDNdXV0sWzQsbnVsbCwzXSwxXSxbMTAsW1szMTA2MTc1OF0sWzMxMDYxNzU5LFtbMzgxMjc3MTQ4LG51bGwsbnVsbCxbMV1dXV1dXV1dLFsyLFtbMTAsW1szMTA2MDg4OF1dXSxbMTAsW1szMTA2MDg4OV0sWzMxMDYwODkwXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDRdLFsxZTMsW1szMTA2MTAyOSxudWxsLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMzEwNjA5NzgiXV1dLFszMTA2MTAzMCxudWxsLFs0LG51bGwsNixudWxsLG51bGwsbnVsbCxudWxsLFsiMzEwNjA5NzkiXV1dXSxbNCxudWxsLDEyXV0sWzEwLFtbMzEwNjExNjVdLFszMTA2MTE2NixbW251bGwsMzYzNjUwMjUxLG51bGwsW251bGwsMl1dXV0sWzMxMDYxMTY3LFtbbnVsbCwzNjM2NTAyNTEsbnVsbCxbbnVsbCwxXV1dXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEsbnVsbCwxMDJdLFs1MCxbWzMxMDYxNzE2XSxbMzEwNjE3MTcsW1szNzQ2NjUzNzksbnVsbCxudWxsLFtdXV1dXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTAxLG51bGwsMTAyXSxbMTAsW1s0NDc0Mjc2N10sWzQ0NzQyNzY4XV1dXV0sWzYsW1s1MCxbWzMxMDYxMzk1XSxbMzEwNjEzOTYsW1szNjM2NTgxNzMsbnVsbCxudWxsLFsxXV0sWzUwMSxudWxsLG51bGwsWzFdXV1dXSxbMixbWzQsbnVsbCw1M10sWzEyLG51bGwsbnVsbCxudWxsLDQsbnVsbCwiQ2hyb21lLyg5XFxkfFxcZHszLH0pIixbIm5hdmlnYXRvci51c2VyQWdlbnQiXV1dXV1dXSxbMTIsW1syMCxbWzIxMDY1NzI0XSxbMjEwNjU3MjUsW1syMDMsbnVsbCxudWxsLFsxXV1dXV0sWzQsbnVsbCw5LG51bGwsbnVsbCxudWxsLG51bGwsWyJMYXlvdXRTaGlmdCJdXV0sWzUwLFtbMzEwNjEyMTddLFszMTA2MTIxOCxbWzM3NDMyNjU4OCxudWxsLG51bGwsWzFdXV1dXV0sWzUwLFtbMzEwNjEzODJdLFszMTA2MTM4MyxbWzM3NzEwNTI1OCxudWxsLG51bGwsWzFdXV1dXV0sWzEsW1szMTA2MTQ4N10sWzMxMDYxNDg4LFtbMzc5ODQxOTE3LG51bGwsbnVsbCxbMV1dXV1dXSxbMTAwLFtbMzEwNjE2NjFdLFszMTA2MTY2MixbWzM3NzQzMTk4MSxudWxsLG51bGwsWzFdXV1dXV0sWzEwLFtbMzEwNjE2OTBdLFszMTA2MTY5MSxbWzgzLG51bGwsbnVsbCxbMV1dLFs4NCxudWxsLG51bGwsWzFdXV1dXV0sWzUwLFtbNDQ3NDAzODZdXV0sWzEwLFtbNDQ3NDMyMDMsW1sxOTQwLG51bGwsbnVsbCxbMV1dXV0sWzQ0NzQzMjA0LFtbMTk0MCxudWxsLG51bGwsW11dXV0sWzQ0NzQ0MTcwXV1dXV1dXSl9KSgpfQo="},{"name":"sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min-7754fade75bed02e4097bf3d7fff178c.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"dmFyIF9zYXRlbGxpdGU7e2NvbnN0ICRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQ9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7Y29uc3QgeGhyVW5zZW50PTA7Y29uc3QgeGhyT3BlbmVkPTE7Y29uc3QgeGhySGVhZGVyc1JlY2VpdmVkPTI7Y29uc3QgeGhyTG9hZGluZz0zO2NvbnN0IHhockRvbmU9NDtjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbD1TeW1ib2woImRlZmVycmVkSGFuZGxlIik7Y29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2w9U3ltYm9sKCJvbmxvYWRzdGFydCIpO2NvbnN0IHhock9uUHJvZ3Jlc3NTeW1ib2w9U3ltYm9sKCJvbnByb2dyZXNzIik7Y29uc3QgeGhyT25BYm9ydFN5bWJvbD1TeW1ib2woIm9uYWJvcnQiKTtjb25zdCB4aHJPbkVycm9yU3ltYm9sPVN5bWJvbCgib25lcnJvciIpO2NvbnN0IHhock9uTG9hZFN5bWJvbD1TeW1ib2woIm9ubG9hZCIpO2NvbnN0IHhock9uVGltZW91dFN5bWJvbD1TeW1ib2woIm9udGltZW91dCIpO2NvbnN0IHhock9uTG9hZEVuZFN5bWJvbD1TeW1ib2woIm9ubG9hZGVuZCIpO2NvbnN0IHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpO2NvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2w9U3ltYm9sKCJyZWFkeVN0YXRlIik7Y29uc3QgeGhyVGltZW91dFN5bWJvbD1TeW1ib2woInRpbWVvdXQiKTtjb25zdCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2w9U3ltYm9sKCJ3aXRoQ3JlZGVudGlhbHMiKTtjb25zdCB4aHJVcGxvYWRTeW1ib2w9U3ltYm9sKCJ1cGxvYWQiKTtjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2w9U3ltYm9sKCJyZXNwb25zZVR5cGUiKTtjb25zdCBkZWZpbmVFdmVudD0ob2JqLHN5bWJvbCk9Pntjb25zdCB0eXBlPXN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixzeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZnVuY3Rpb24oZXZlbnQpe2NvbnN0IGhhbmRsZXI9dGhpc1tzeW1ib2xdO2lmKGhhbmRsZXIpe2hhbmRsZXIuY2FsbCh0aGlzLGV2ZW50KX19KX07Y29uc3QgY2hhbmdlUmVhZHlTdGF0ZT0oeGhyLHJlYWR5U3RhdGUpPT57eGhyW3hoclJlYWR5U3RhdGVTeW1ib2xdPXJlYWR5U3RhdGU7eGhyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZWFkeXN0YXRlY2hhbmdlIikpfTtsZXQgaXNTZWFsZWQ9dHJ1ZTtjbGFzcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IGV4dGVuZHMgRXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSYmISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIil9ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTdGFydFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblByb2dyZXNzU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uQWJvcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25FcnJvclN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25UaW1lb3V0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uTG9hZEVuZFN5bWJvbCl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdfXNldCBvbmxvYWRzdGFydCh2YWx1ZSl7dGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF09dmFsdWV9Z2V0IG9ucHJvZ3Jlc3MoKXtyZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXX1zZXQgb25wcm9ncmVzcyh2YWx1ZSl7dGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXT12YWx1ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3hock9uQWJvcnRTeW1ib2xdfXNldCBvbmFib3J0KHZhbHVlKXt0aGlzW3hock9uQWJvcnRTeW1ib2xdPXZhbHVlfWdldCBvbmVycm9yKCl7cmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF19c2V0IG9uZXJyb3IodmFsdWUpe3RoaXNbeGhyT25FcnJvclN5bWJvbF09dmFsdWV9Z2V0IG9udGltZW91dCgpe3JldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF19c2V0IG9udGltZW91dCh2YWx1ZSl7dGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdPXZhbHVlfWdldCBvbmxvYWRlbmQoKXtyZXR1cm4gdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdfXNldCBvbmxvYWRlbmQodmFsdWUpe3RoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXT12YWx1ZX19ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfXN1cGVyKCl9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQ9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpYTUxIdHRwUmVxdWVzdFVwbG9hZCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lzU2VhbGVkPWZhbHNlO2NvbnN0IHhoclVwbG9hZD1uZXcgWE1MSHR0cFJlcXVlc3RVcGxvYWQ7aXNTZWFsZWQ9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6bnVsbCx3cml0YWJsZTp0cnVlfSk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclJlYWR5U3RhdGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOnhoclVuc2VudCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVGltZW91dFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6MCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpmYWxzZSx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVXBsb2FkU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVcGxvYWQsd3JpdGFibGU6ZmFsc2V9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZXNwb25zZVR5cGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiIiLHdyaXRhYmxlOnRydWV9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXX1zZXQgb25yZWFkeXN0YXRlY2hhbmdlKHZhbHVlKXt0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF09dmFsdWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXX1vcGVuKG1ldGhvZCx1cmwpe3N3aXRjaCh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKXtjYXNlIHhoclVuc2VudDpjYXNlIHhockRvbmU6e2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJPcGVuZWQpO2JyZWFrfX19c2V0UmVxdWVzdEhlYWRlcihuYW1lLHZhbHVlKXt9c2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKXt9Z2V0IHRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXX1zZXQgdGltZW91dCh2YWx1ZSl7dGhpc1t4aHJUaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgd2l0aENyZWRlbnRpYWxzKCl7cmV0dXJuIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXX1zZXQgd2l0aENyZWRlbnRpYWxzKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJPcGVuZWQ6e2JyZWFrfWRlZmF1bHQ6e3Rocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICd3aXRoQ3JlZGVudGlhbHMnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIFVOU0VOVCBvciBPUEVORUQuIil9fXRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXT0hIXZhbHVlfWdldCB1cGxvYWQoKXtyZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdfXNlbmQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT09PW51bGwpe3RoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdPXNldFRpbWVvdXQoKCk9Pnt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJEb25lKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImVycm9yIikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX0sMCl9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpfX1hYm9ydCgpe2lmKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF09PT14aHJPcGVuZWQmJnRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdIT09bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdKTt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJVbnNlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgiYWJvcnQiKSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJsb2FkZW5kIikpfX1nZXQgcmVzcG9uc2VVUkwoKXtyZXR1cm4iIn1nZXQgc3RhdHVzKCl7cmV0dXJuIDB9Z2V0IHN0YXR1c1RleHQoKXtyZXR1cm4iIn1nZXRSZXNwb25zZUhlYWRlcihuYW1lKXtyZXR1cm4gbnVsbH1vdmVycmlkZU1pbWVUeXBlKG1pbWUpe31nZXQgcmVzcG9uc2VUeXBlKCl7cmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXX1zZXQgcmVzcG9uc2VUeXBlKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJEb25lOnt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAncmVzcG9uc2VUeXBlJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBMT0FESU5HIG9yIERPTkUuIil9fXN3aXRjaCh2YWx1ZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnt0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF09dmFsdWU7YnJlYWt9fX1nZXQgcmVzcG9uc2UoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO3JldHVybiByZXNwb25zZVR5cGU9PT0iInx8cmVzcG9uc2VUeXBlPT09InRleHQiPyIiOm51bGx9Z2V0IHJlc3BvbnNlVGV4dCgpe2NvbnN0IHJlc3BvbnNlVHlwZT10aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07aWYocmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Iil7cmV0dXJuIiJ9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCB0aGUgJ3Jlc3BvbnNlVGV4dCcgcHJvcGVydHkgZnJvbSAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3QncyAncmVzcG9uc2VUeXBlJyBpcyAnJyBvciAndGV4dCcgKHdhcyAnYXJyYXlidWZmZXInKS4iKX19Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiVU5TRU5UIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJVbnNlbnR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyT3BlbmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJIRUFERVJTX1JFQ0VJVkVEIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJIZWFkZXJzUmVjZWl2ZWR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkxPQURJTkciLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockxvYWRpbmd9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkRPTkUiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockRvbmV9KTtleHBvcnRzLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3Qsd3JpdGFibGU6dHJ1ZX19KSgkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0KTtjb25zdCAkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3PXt9OyhleHBvcnRzPT57InVzZSBzdHJpY3QiO2xldCBpc1NlYWxlZD1mYWxzZTtjbGFzcyBTdG9yYWdle2NvbnN0cnVjdG9yKCl7aWYoaXNTZWFsZWQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKX19Z2V0IGxlbmd0aCgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGh9a2V5KGluZGV4KXtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRoaXMpO2lmKGluZGV4PDB8fGluZGV4Pj1rZXlzLmxlbmd0aCl7cmV0dXJuIG51bGx9cmV0dXJuIGtleXNbaW5kZXhdfWdldEl0ZW0oa2V5KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsa2V5KT90aGlzW2tleV06bnVsbH1zZXRJdGVtKGtleSx2YWx1ZSl7dGhpc1trZXldPVN0cmluZyh2YWx1ZSl9cmVtb3ZlSXRlbShrZXkpe2RlbGV0ZSB0aGlzW2tleV19Y2xlYXIoKXtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRoaXMpO2Zvcihjb25zdCBrZXkgb2Yga2V5cyl7ZGVsZXRlIHRoaXNba2V5XX19fWV4cG9ydHMuU3RvcmFnZT17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOlN0b3JhZ2Usd3JpdGFibGU6dHJ1ZX07Y29uc3QgbG9jYWxTdG9yYWdlPW5ldyBTdG9yYWdlO2V4cG9ydHMubG9jYWxTdG9yYWdlPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsZ2V0KCl7cmV0dXJuIGxvY2FsU3RvcmFnZX19O2NvbnN0IHNlc3Npb25TdG9yYWdlPW5ldyBTdG9yYWdlO2V4cG9ydHMuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSxnZXQoKXtyZXR1cm4gc2Vzc2lvblN0b3JhZ2V9fTtpc1NlYWxlZD10cnVlfSkoJF9fX21vY2tfYzdjYWVjNTAxZGNhMjM4Nyk7KGZ1bmN0aW9uKCl7d2luZG93Ll9zYXRlbGxpdGU9d2luZG93Ll9zYXRlbGxpdGV8fHt9LHdpbmRvdy5fc2F0ZWxsaXRlLmNvbnRhaW5lcj17YnVpbGRJbmZvOnttaW5pZmllZDohMCxidWlsZERhdGU6IjIwMjEtMDYtMTlUMTE6MDI6MjFaIixlbnZpcm9ubWVudDoicHJvZHVjdGlvbiIsdHVyYmluZUJ1aWxkRGF0ZToiMjAyMS0wNC0yNlQxNjo1NDoyOFoiLHR1cmJpbmVWZXJzaW9uOiIyNy4xLjMifSxkYXRhRWxlbWVudHM6eyJnVGFnOmJ0bkZCUGFnZUxpc3RNYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiL2VuLXVzL3ByaW50aW5nL2Rlc2lnbi1zZXJ2aWNlcy5odG1sIjoiQWRkVG9DYXJ0IiwiL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCI6IkxlYWQifX19fSwiZGZhOnBhZ2VMaXN0TWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm57c2c6eyIvZW4tc2cvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwiOiJodHRwczovLzkxODgyMDUuZmxzLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eWk7c3JjPTkxODgyMDU7dHlwZT1pbnZtZWRpYTtjYXQ9cGVyc28wO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O3RmdWE9O25wYT07b3JkPSIsIi9lbi1zZy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwiOiIgaHR0cHM6Ly85MTg4MjA1LmZscy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHlpO3NyYz05MTg4MjA1O3R5cGU9aW52bWVkaWE7Y2F0PWNvcnBvMDA7ZGNfbGF0PTtkY19yZGlkPTt0YWdfZm9yX2NoaWxkX2RpcmVjdGVkX3RyZWF0bWVudD07dGZ1YT07bnBhPTtvcmQ9In0sdHc6eyIvemgtdHcvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWw/aW50Y21wPUJBTC0xMDA1MjQ1LTQtMS05NjItMTAwMDAwMC1BUEFDLVRXLVpILUZZMTlRNFBBQ0NMTktYQSI6Imh0dHBzOi8vOTE4ODIwNS5mbHMuZG91YmxlY2xpY2submV0L2FjdGl2aXR5aTtzcmM9OTE4ODIwNTt0eXBlPWludm1lZGlhO2NhdD1wZXJzbzAwMTtkY19sYXQ9O2RjX3JkaWQ9O3RhZ19mb3JfY2hpbGRfZGlyZWN0ZWRfdHJlYXRtZW50PTt0ZnVhPTtucGE9O29yZCIsIi9lbi10dy9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbD9pbnRjbXA9QkFMLTEwMDUyNDUtNC0xLTk2Mi0xMDAwMDAwLUFQQUMtVFctWkgtRlkxOVE0UEFDQ0xOS1hBIjoiaHR0cHM6Ly85MTg4MjA1LmZscy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHlpO3NyYz05MTg4MjA1O3R5cGU9aW52bWVkaWE7Y2F0PXBlcnNvMDAxO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O3RmdWE9O25wYT07b3JkIn19fX19LCJjb250ZW50OmxvY2FsZSI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcyIsc2V0dGluZ3M6e3BhdGg6IkZEWC5EQVRBTEFZRVIucGFnZS5wYWdlSW5mby5sb2NhbGUifX0sImNvbnRlbnQ6cmVnaW9uIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPUZEWC5EQVRBTEFZRVIucGFnZS5wYWdlSW5mby5yZWdpb247cmV0dXJuImVuX2luIj09X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIikmJiJtZWlzYSIhPT1lJiYoZT0ibWVpc2EiKSxlfX19LCJkb3RUYWc6ZW5hYmxlZFBhZ2VMaXN0Ijp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIxNTkwOTY5NTk5MDAwIn0sIi9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sIi9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nLmh0bWwiOntzdGFydFRpbWU6IjE1NzgyNjg3OTkwMDAiLGVuZFRpbWU6IjE1ODg1NTAzOTkwMDAifSwiL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCI6e3N0YXJ0VGltZToiMTU3ODI2ODc5OTAwMCIsZW5kVGltZToiMTU4ODU1MDM5OTAwMCJ9LCIvZW4tdXMvaG9saWRheS5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9LCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiL2VuLXVzL2hlYWx0aGNhcmUvdmFjY2luZS1zaGlwcGluZy5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9LCIvZW4tdXMvZWNvbW1lcmNlL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dC5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9LCJlbi1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLW5vLWFjY291bnQuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiZW4tY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9LCJlbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiZnItY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS1uby1hY2NvdW50Lmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sImZyLWNhL3NoaXBwaW5nLXRvb2xzL2ZyZWlnaHQtcXVvdGUuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiZnItY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0Lmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sIi9lbi1jYS9zbWFsbC1idXNpbmVzcy9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sIi9mci1jYS9zbWFsbC1idXNpbmVzcy9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sIi9lbi1jYS9zbWFsbC1idXNpbmVzcy5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9LCIvZnItY2Evc21hbGwtYnVzaW5lc3MuaHRtbCI6e3N0YXJ0VGltZToiIixlbmRUaW1lOiIifSwiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2V4cHJlc3MtZnJlaWdodC9pbnRlcm5hdGlvbmFsLWFpci1mcmVpZ2h0LXF1b3RlLmh0bWwiOntzdGFydFRpbWU6IiIsZW5kVGltZToiIn0sIi9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQvaW50ZXJuYXRpb25hbC1haXItZnJlaWdodC1xdW90ZS5odG1sIjp7c3RhcnRUaW1lOiIiLGVuZFRpbWU6IiJ9fX19fSwiY29udGVudDpkZXZpY2VUeXBlIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgiKG1pbi13aWR0aDogOTkzcHgpIikubWF0Y2hlcyYmKGU9ImRlc2t0b3AiKSx3aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogOTkycHgpIikubWF0Y2hlcyYmKGU9InRhYmxldCIpLHdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA3NjdweCkiKS5tYXRjaGVzJiYoZT0ibW9iaWxlIiksZX19fSwiY29udGVudDpwYWdlIHR5cGUiOntkZWZhdWx0VmFsdWU6IiIsZm9yY2VMb3dlckNhc2U6ITAsY2xlYW5UZXh0OiEwLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzIixzZXR0aW5nczp7cGF0aDoiRkRYLkRBVEFMQVlFUi5wYWdlLmNhdGVnb3J5LnBhZ2VUeXBlIn19LCJnVGFnOkFkV29yZHNFdmVudE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJue3VzOnsiL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkFXLTg2MzIzODc5My95c1pUQ01PUjc0WUJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUuaHRtbCI6IkFXLTg2MzIzODc5My8wWnVGQ056WDVZWUJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9wYWNraW5nLmh0bWwiOiJBVy04NjMyMzg3OTMvanJwNUNPcUM3NFlCRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwiOiJBVy04NjMyMzg3OTMvRUFYWUNQU0Q3NFlCRUluMXo1c0QiLCIvZW4tdXMvZGVsaXZlcnktbWFuYWdlci9idXNpbmVzcy10b29sa2l0Lmh0bWwiOiJBVy04NjMyMzg3OTMvOW5EdkNJajc3TGNCRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvcmV0dXJucy9idXNpbmVzcy5odG1sIjoiQVctODYzMjM4NzkzL2I2SWRDTGZuaDdnQkVJbjF6NXNEIiwiL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwvaG93LXRvLXNoaXAuaHRtbCI6IkFXLTg2MzIzODc5My9iWnMzQ0tIcGg3Z0JFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy83LWRheS1kZWxpdmVyeS5odG1sIjoiQVctODYzMjM4NzkzL2JqblFDT3FKN2JjQkVJbjF6NXNEIiwiL2VuLXVzL2Vjb21tZXJjZS9mdWxmaWxsbWVudC1zaGlwcGluZy5odG1sIjoiQVctODYzMjM4NzkzL3RLU0xDTFhyX0xjQkVJbjF6NXNEIiwiL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2FnMTMzOTg2MDIuaHRtbCI6Ii9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9hZzEzMzk4NjAyLmh0bWwiLCIvZW4tdXMvZWNvbW1lcmNlLmh0bWwiOiJBVy04NjMyMzg3OTMvcGc0NENQT0g2TUlCRUluMXo1c0QiLCIvZW4tdXMvYmlnLWNvbW1lcmNlLmh0bWwiOiJBVy04NjMyMzg3OTMvT0FmUkNMR1R5TTBCRUluMXo1c0QiLCIvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sIjoiQVctODYzMjM4NzkzL193ZnVDS1BRdGM4QkVJbjF6NXNEIiwiL2VuLXVzL3ByaW50aW5nL2Rlc2lnbi1zZXJ2aWNlcy5odG1sIjoiQVctODYzMjM4NzkzL1ZpVWlDSzJubnRBQkVJbjF6NXNEIiwiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCI6IkFXLTg2MzIzODc5My9lUzdiQ01yaDNOd0JFSW4xejVzRCIsIi9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL21hbmFnZS15b3VyLWRlbGl2ZXJpZXMuaHRtbCI6IkFXLTg2MzIzODc5My9uVWVGQ0xEdjVkd0JFSW4xejVzRCIsIi9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwiOiJBVy04NjMyMzg3OTMvRjV2NUNKX0tydUVCRUluMXo1c0QiLCIvZW4tdXMvaG9saWRheS5odG1sIjoiQVctODYzMjM4NzkzL0tfQXlDUDYxay1FQkVJbjF6NXNEIiwiL2VuLXVzL3ByaW50aW5nL2NvbnN1bWVyLW9mZmVycy5odG1sIjoiQVctODYzMjM4NzkzL2kzN2ZDTlhwa09JQkVJbjF6NXNEIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCI6IkFXLTg2MzIzODc5My9DT3NLQ01lRWhlSUJFSW4xejVzRCIsIi9lbi11cy9wcmludGluZy9mbGFzaC1zYWxlLW9mZmVycy5odG1sIjoiQVctODYzMjM4NzkzL0M0MDJDT185a09JQkVJbjF6NXNEIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UuaHRtbCI6IkFXLTg2MzIzODc5My9TWTBxQ042NzgtRUJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9ob2xkLWF0LWxvY2F0aW9uLmh0bWwiOiJBVy04NjMyMzg3OTMvbTBGeENKcTFsdU1CRUluMXo1c0QiLCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6IkFXLTg2MzIzODc5My9WbWx3Q0lPeS1lRUJFSW4xejVzRCIsIi9lbi11cy9oZWFsdGhjYXJlL3ZhY2NpbmUtc2hpcHBpbmcuaHRtbCI6IkFXLTg2MzIzODc5My92RnpzQ09mcW5QRUJFSW4xejVzRCIsIi9lbi11cy9lY29tbWVyY2Uvb2ZmZXItc3RvcmUtcGlja3VwLWF0LWNoZWNrb3V0Lmh0bWwiOiJBVy04NjMyMzg3OTMvUkNTTENJUF9sZk1CRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvcmV0dXJucy90ZWNobm9sb2d5Lmh0bWwiOiJBVy04NjMyMzg3OTMvVEx5WUNNUDd6TzBCRUluMXo1c0QiLCIvZW4tdXMvZWNvbW1lcmNlL3NoaXBwaW5nLW9wdGlvbnMuaHRtbCI6IkFXLTg2MzIzODc5My9TMGE0Q01PZzhPMEJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9pbnRlcm5hdGlvbmFsLmh0bWwiOiJBVy04NjMyMzg3OTMvdkN3Q0NLbTUzLTBCRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvaG9tZS1kZWxpdmVyeS5odG1sIjoiQVctODYzMjM4NzkzL09FMzlDTXIzemUwQkVJbjF6NXNEIiwiL2VuLXVzL2Vjb21tZXJjZS90b29scy1hbmQtc2VydmljZXMuaHRtbCI6IkFXLTg2MzIzODc5My9JM1lZQ0kzS2xPNEJFSW4xejVzRCJ9LHphOnsiL2VuLXphL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkFXLTY5ODUyMDgxNy9ac2Z6Q1AtaXFyTUJFUEdwaXMwQyIsIi9lbi16YS9vcGVuLWFjY291bnQuaHRtbCI6IkFXLTY5ODUyMDgxNy9YUnE2Q0p2bm5iTUJFUEdwaXMwQyIsIi9lbi16YS9jYW1wYWlnbi9kZWxpdmVyaW5nLXdoYXQtbWF0dGVycy5odG1sIjoiQVctNjM0MzczNjA3L2FwSktDTHFGNGRFQkVPZUx2NjRDIn0sYXU6eyIvZW4tYXUvY2FtcGFpZ24vdHQuaHRtbCI6IkFXLTY4Mzk4NzA4Mi84clNvQ05EQmtMZ0JFSXFoazhZQyIsIi9lbi1hdS9uZXctY3VzdG9tZXIuaHRtbCI6IkFXLTY4Mzk4NzA4Mi9wci1yQ0pfYmhiZ0JFSXFoazhZQyJ9LG56OnsiL2VuLW56L2NhbXBhaWduL3R0Lmh0bWwiOiJBVy02ODM5ODcwODIvY3FqV0NQTGdoYmdCRUlxaGs4WUMiLCIvZW4tbnovbmV3LWN1c3RvbWVyLmh0bWwiOiJBVy02ODM5ODcwODIvZVQ3dENQeUc5cmNCRUlxaGs4WUMifSxpbjp7Ii9lbi1pbi9vcGVuLWFjY291bnQvdGhhbmsteW91Lmh0bWwiOiJBVy0xMDY2NTAxMTA3L3pBanVDSVhhOGdFUTg0ZkdfQU0ifX19fX0sImxvZ2luOmZkeF9jYmlkIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1fc2F0ZWxsaXRlLmNvb2tpZS5nZXQoImZkeF9jYmlkIik/X3NhdGVsbGl0ZS5jb29raWUuZ2V0KCJmZHhfY2JpZCIpOiIifX19LCJleHRlcm5hbC1jYW1wYWlnbjpsaW5rIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMiLHNldHRpbmdzOntuYW1lOiJMSU5LIixjYXNlSW5zZW5zaXRpdmU6ITB9fSwiY29udGVudDpoaXN0b3JpY2FsUGFnZU5hbWUiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMiLHNldHRpbmdzOntwYXRoOiJGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8uaGlzdG9yaWNhbFBhZ2VOYW1lIn19LCJjb250ZW50OnBhZ2UgbmFtZSI6e2RlZmF1bHRWYWx1ZToibm8gcGFnZU5hbWUgZm91bmQiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpeyJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIik7dmFyIGU9X2ZkeC5wY2ZVdGlsKCksdD0iIjtlLm1hdGNoKC93d3coc2JveC5pZGV2fGJhc2UuaWRldnxkZXYuaWRldnxkcnQuaWRldnxzdHJlc3MuZG16LmlkZXZ8Yml0LmlkZXZ8dGVzdHwpLmZlZGV4LmNvbS9naSk/dD0iZmVkZXgvIjplLm1hdGNoKC8od2ViYXBwLmRldi58d3d3LnwpZnRuLmZlZGV4LmNvbS9naSkmJih0PSJmdG4vIik7dmFyIG49X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cGFnZVBhdGgiKTtyZXR1cm4gdCE9bi5zbGljZSgwLHQubGVuZ3RoKSYmKG49dCtuKSxufX19LCJnVGFnOkNvbmZpZ0xvZ2ljIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkNvbmZpZ0lETWFwcGluZyIpLHQ9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6Y291bnRyeUNvZGUiKSxuPSIiO2lmKHZvaWQgMCE9PWUmJiIiIT09ZSYmdm9pZCAwIT09dCYmIiIhPT10KWZvcih2YXIgciBpbiBlKXtpZigtMTx0LmluZGV4T2Yocikpe249ZVtyXTticmVha30iIj09PW4mJihuPWUudXMpfXJldHVybiBufX19LHNBY2NvdW50OntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cmVnaW9uIiksdD0iZmVkZXhnbGJsZGV2IjtyZXR1cm4gdm9pZCAwIT09ZSYmIiIhPWUmJigid3d3LmZlZGV4LmNvbSIhPXdpbmRvdy5sb2NhdGlvbi5ob3N0JiYiZGV2ZWxvcGVyLmZlZGV4LmNvbSIhPXdpbmRvdy5sb2NhdGlvbi5ob3N0fHwodD0iZmVkZXhnbGJsIiwiY2FuIj09ZT90Kz0iLGZlZGV4Y2EiOnQ9dCsiLGZlZGV4IitlKSksdH19fSwiZ1RhZzpidG5PcmFuZ2VBV1BhZ2VMaXN0TWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm57c2lnblVwQ29udGludWVCdXR0b246IkFXLTg2MzIzODc5My9TcEcxQ1BycTNOd0JFSW4xejVzRCIsc3VibWl0UGluQnV0dG9uOiJBVy04NjMyMzg3OTMvbnAyRENLNy0tTndCRUluMXo1c0QifX19fSwiYWFtOmNvdW50cnlGbGFnIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJhYW06Y291bnRyaWVzIiksdD1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpjb3VudHJ5Q29kZSIpLG49dm9pZCAwIT09dCYmIiIhPT10P3Q6IiI7cmV0dXJuIiIhPT1uJiYtMTxlLmluZGV4T2Yobil9fX0sZG90VGFnUGl4ZWxNYXBwaW5nOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJueyIvZW4tdXMvcG9zc2liaWxpdGllcy5odG1sIjoiMTAwMDY0NTgiLCIvZW4tdXMvaG9saWRheS9jb25zdW1lci1zaGlwcGluZy1kZWxpdmVyeS1ndWlkZS5odG1sIjoiMTAwMDY0NTgiLCIvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjoiMTAwOTI5MDciLCIvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjoiMTAwOTI5MDciLCIvZW4tdXMvaG9saWRheS5odG1sIjoiMTAwMDY0NTgiLCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6IjEwMTQyMjI3IiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCI6IjEwMTQyMjI3IiwiL2VuLXVzL2hlYWx0aGNhcmUvdmFjY2luZS1zaGlwcGluZy5odG1sIjoiMTAxNDIyMjciLCIvZW4tdXMvZWNvbW1lcmNlL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dC5odG1sIjoiMTAxNDIyMjciLCIvZW4tY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS1uby1hY2NvdW50Lmh0bWwiOiIxMDE0NTY3MCIsIi9lbi1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLmh0bWwiOiIxMDE0OTYwOSIsIi9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQuaHRtbCI6IjEwMTQ1NjczIiwiL2ZyLWNhL3NoaXBwaW5nLXRvb2xzL2ZyZWlnaHQtcXVvdGUtbm8tYWNjb3VudC5odG1sIjoiMTAxNDU2ODIiLCIvZnItY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS5odG1sIjoiMTAxNDk2MTAiLCIvZnItY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0Lmh0bWwiOiIxMDE0NTY4NCIsIi9lbi1jYS9zbWFsbC1idXNpbmVzcy9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwiOiIxMDE0NzYzMSIsIi9mci1jYS9zbWFsbC1idXNpbmVzcy9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwiOiIxMDE0NzYzMiIsIi9lbi1jYS9zbWFsbC1idXNpbmVzcy5odG1sIjoiMTAxNDc2MzMiLCIvZnItY2Evc21hbGwtYnVzaW5lc3MuaHRtbCI6IjEwMTQ3NjM0IiwiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2V4cHJlc3MtZnJlaWdodC9pbnRlcm5hdGlvbmFsLWFpci1mcmVpZ2h0LXF1b3RlLmh0bWwiOiIxMDE0OTUwNSIsIi9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQvaW50ZXJuYXRpb25hbC1haXItZnJlaWdodC1xdW90ZS5odG1sIjoiMTAxNDk1MDYifX19fSwibG9naW46dXNlci1pZCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCJmY2xfdXVpZCIpP19zYXRlbGxpdGUuY29va2llLmdldCgiZmNsX3V1aWQiKToiIn19fSwidHJhZGVkZXNrOnBhZ2VMaXN0TWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT0iLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svY29udi8/YWR2PXN1ZW50dmJhJiIsdD0iLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svcHhsLz9hZHY9c3VlbnR2YmEmIjtyZXR1cm57Ii9lbi11cy9zaGlwcGluZy9mcmVpZ2h0LXNlcnZpY2VzL2lubm92YXRpb24uaHRtbCI6ZSsiY3Q9MDpoOXZhaGhsJmZtdD0zIiwiL2VuLXVzL3ByaW50aW5nL2N1c3RvbS1wcm9mZXNzaW9uYWwtcHJpbnRpbmcuaHRtbCI6ZSsiY3Q9MDpnZjhiMmdhJmZtdD0zIiwiL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCI6ZSsiY3Q9MDozbXo4b2F1JmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL2ZyZWlnaHQtc2VydmljZXMvbHRsL3F1b3RlLmh0bWwiOmUrImN0PTA6M2lkM2ZqZyZmbXQ9MyIsIi9lbi11cy9wb3NzaWJpbGl0aWVzLmh0bWwiOmUrImN0PTA6bnp1eThlYiZmbXQ9MyIsIi9lbi11cy9wcmludGluZy9mbGFzaC1zYWxlLW9mZmVycy5odG1sIjplKyJjdD0wOnBucDJwNWMmZm10PTMiLCIvZW4tdXMvcHJpbnRpbmcvb25saW5lLXByaW50aW5nLmh0bWwiOmUrImN0PTA6ZG9oMmZ0ZyZmbXQ9MyIsIi9lbi11cy9zaGlwcGluZy9zdG9yZS9ncm91bmQuaHRtbCI6ZSsiY3Q9MDp3Ym5xN29yJmZtdD0zIiwiL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2VtMTU2OTIyMTMuaHRtbCI6ZSsiY3Q9MDp6bjM0b2M3JmZtdD0zIiwiL2VuLXVzL2NyZWF0ZS1hY2NvdW50Lmh0bWwiOmUrImN0PTA6OHFzbDhodyZmbXQ9MyIsIi9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9lbTE1NjkyMDEzLmh0bWwiOmUrImN0PTA6djE0d2VvMCZmbXQ9MyIsIi9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9lbTE1NjkyMTEzLmh0bWwiOmUrImN0PTA6amczcDVteiZmbXQ9MyIsIi9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwiOnQrImN0PTA6OGlpY28xaCZmbXQ9MyIsIi9lbi11cy9wcmludGluZy9idXNpbmVzcy1zb2x1dGlvbnMva25vd2xlZGdlLWNlbnRlci5odG1sIjp0KyJjdD0wOjJvdGxsMDgmZm10PTMiLCIvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvYWcxMzM5ODYwMi5odG1sIjp0KyJjdD0wOnpodHNsc3cmZm10PTMiLCIvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwiOnQrImN0PTA6ZDVmMThvcyZmbXQ9MyIsIi9lbi11cy9zaGlwcGluZy9vZmZpY2UtZGVwb3Qtb2ZmaWNlbWF4Lmh0bWwiOnQrImN0PTA6eml1YTMweiZmbXQ9MyIsIi9lbi11cy9wcmludGluZy9uYXRpb25hbC1iaWQtY2VudGVyLmh0bWwiOnQrImN0PTA6Zm16cms0ZiZmbXQ9MyIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvdGFyZ2V0LXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sIjp0KyJjdD0wOnpyZzY4ZWImZm10PTMiLCIvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sIjp0KyJjdD0wOjNtejhvYXUmZm10PTMiLCIvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwiOnQrImN0PTA6ZDVmMThvcyZmbXQ9MyIsIi9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwiOnQrImN0PTA6ZGs4d3FzbyZmbXQ9MyIsIi9lbi11cy9ob2xpZGF5Lmh0bWwiOnQrImN0PTA6cWsycnRsYiZmbXQ9MyIsIi9lbi11cy9wcmludGluZy9jb25zdW1lci1vZmZlcnMuaHRtbCI6dCsiY3Q9MDo2czg0dXh4JmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCI6dCsiY3Q9MDpqZXJvbXBwJmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UuaHRtbCI6dCsiY3Q9MDo3dzhicXprJmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL2hvbGQtYXQtbG9jYXRpb24uaHRtbCI6dCsiY3Q9MDpvNGNocHJuJmZtdD0zIiwiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCI6dCsiY3Q9MDozaHB3MXVxJmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvYnVzaW5lc3MuaHRtbCI6dCsiY3Q9MDp4bHdiOHhkJmZtdD0zIiwiL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvdGVjaG5vbG9neS5odG1sIjp0KyJjdD0wOjJiZWFtcGQmZm10PTMiLCIvZW4tdXMvc2hpcHBpbmcvcmV0dXJucy5odG1sIjp0KyJjdD0wOm1yMHJzZmYmZm10PTMiLCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6dCsiY3Q9MDo4MGxpemczJmZtdD0zIiwiL2VuLXVzL2hlYWx0aGNhcmUvdmFjY2luZS1zaGlwcGluZy5odG1sIjp0KyJjdD0wOjZudHRmNmImZm10PTMiLCIvZW4tdXMvZWNvbW1lcmNlL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dC5odG1sIjp0KyJjdD0wOnFzMmtmcWImZm10PTMiLCIvZW4tdXMvZGVsaXZlcnktbWFuYWdlci9tYW5hZ2UteW91ci1kZWxpdmVyaWVzLmh0bWwiOnQrImN0PTA6ZWV3YzdpMyZmbXQ9MyIsIi9lbi11cy9zbWFsbC1idXNpbmVzcy9ncmFudC1jb250ZXN0Lmh0bWwiOnQrImN0PTA6eDgyNXJ5aCZmbXQ9MyJ9fX19LCJQQ0Y6VXRpbCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiUENGOkFsbG93ZWRQcm9kRG9tYWlucyIpLHQ9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO3JldHVybiBudWxsIT10Lm1hdGNoKC93d3coYmFzZS5pZGV2fGRldi5pZGV2fGRydC5pZGV2fHN0cmVzcy5kbXouaWRldnxiaXQuaWRldnx0ZXN0fCkuZmVkZXguY29tL2dpKT90OjA8ZS5sZW5ndGgmJi0xPGUuaW5kZXhPZih0KT8id3d3LmZlZGV4LmNvbSI6Ind3d3Rlc3QuZmVkZXguY29tIn19fSwidmE6Y2Fhc0Rpc2FibGVkQ291bnRyeUxpc3QiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9WyJ2aV92biIsImVzX3VzIl0sdD1fZmR4LnBhZ2VGbGFnKGUsX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIikpLG49WyIvZmVkZXh0cmFjay8iLCIvZmVkZXh0cmFja2luZy8iXSxyPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxpPV9mZHgucGFnZUZsYWcobixyKTtyZXR1cm4hdHx8IWl9fX0sImNvbnRlbnQ6c2l0ZSBzZWN0aW9uIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzIixzZXR0aW5nczp7cGF0aDoiRkRYLkRBVEFMQVlFUi5wYWdlLmNhdGVnb3J5LnByaW1hcnlDYXRlZ29yeSJ9fSwiY29udGVudDpjb3VudHJ5Q29kZSI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcyIsc2V0dGluZ3M6e3BhdGg6IkZEWC5EQVRBTEFZRVIucGFnZS5wYWdlSW5mby5jb3VudHJ5In19LCJnVGFnOmN0YU9yYW5nZUFXUGFnZUxpc3RNYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIvYnVzaW5lc3MtdG9vbGtpdC5odG1sIjoiQVctODYzMjM4NzkzL2FSazRDSWZxMGJrQkVJbjF6NXNEIiwiL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvYnVzaW5lc3MuaHRtbCI6IkFXLTg2MzIzODc5My95NmtzQ05lUXdia0JFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9pbnRlcm5hdGlvbmFsL2hvdy10by1zaGlwLmh0bWwiOiJBVy04NjMyMzg3OTMvTkFQY0NPT1czYmtCRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvNy1kYXktZGVsaXZlcnkuaHRtbCI6IkFXLTg2MzIzODc5My85MTdHQ09ueTBia0JFSW4xejVzRCIsIi9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9hZzEzMzk4NjAyLmh0bWwiOiJBVy04NjMyMzg3OTMvbW9hTUNJZndwN29CRUluMXo1c0QiLCIvZW4tdXMvYmlnLWNvbW1lcmNlLmh0bWwiOiJBVy04NjMyMzg3OTMvZ2RGdkNNS0s2TTBCRUluMXo1c0QiLCIvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwiOiJBVy04NjMyMzg3OTMvU2JwdkNNaVVydEFCRUluMXo1c0QiLCIvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sIjoiQVctODYzMjM4NzkzL0tzMS1DTktYaE5FQkVJbjF6NXNEIiwiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCI6IkFXLTg2MzIzODc5My9vbWY5Q09MMDVkd0JFSW4xejVzRCIsIi9lbi11cy9wcmludGluZy9jb25zdW1lci1vZmZlcnMuaHRtbCI6IkFXLTg2MzIzODc5My9ERkhvQ0phemhlSUJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwiOiJBVy04NjMyMzg3OTMvaEdPdkNMZkxrT0lCRUluMXo1c0QiLCIvZW4tdXMvc2hpcHBpbmcvb25zaXRlL2RvbGxhci1nZW5lcmFsLXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sIjoiQVctODYzMjM4NzkzL2FLLU1DTHV0NC1FQkVJbjF6NXNEIn19fX0sImFhbTpjb250YWluZXJOU0lETWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm57Y2FuOiIxIix1czoiMiIsYXBhYzoiMyIsZXU6IjQiLGxhYzoiNSIsbWVpc2E6IjYifX19fSwic2VhcmNoOnNwRGF0YSAtIEpTT2JqZWN0Q2hhbmdlIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzIixzZXR0aW5nczp7cGF0aDoiRkRYLkRBVEFMQVlFUi5zZWFyY2gucmVzdWx0LnRvdGFsUmVzdWx0Q291bnQifX0sImFhbTpyZWdpb25GbGFnIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJhYW06cmVnaW9ucyIpLHQ9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cmVnaW9uIiksbj12b2lkIDAhPT10JiYiIiE9PXQ/dDoiIjtyZXR1cm4iIiE9biYmLTE8ZS5pbmRleE9mKG4pfX19LCJnVGFnOlRhcmdldEVuYWJsZWRNYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiVFB8WFR8VVNJU3xZVFB8SEVST3xDVEF8Q2hlY2tJbnRsU2VydmljZXMiOiJBVy04NjMyMzg3OTMvTld0M0NPMmo4TzBCRUluMXo1c0QiLCJUUHxYVHxVU0lTfFlUUHxIRVJPfENUQXxDQV9DaGVja0ludGxTZXJ2aWNlcyI6IkFXLTg2MzIzODc5My9OV3QzQ08yajhPMEJFSW4xejVzRCIsIlRQfFhUfFVTRVRTfFlUUHxIRVJPfENUQXxIb3dUb1NhdmUiOiJBVy04NjMyMzg3OTMvQXBMWENQUzloTzRCRUluMXo1c0QiLCJUUHxYVHxVU0hEfFlUUHxIRVJPfENUQXxDaGVja1RyYW5zaXRUaW1lcyI6IkFXLTg2MzIzODc5My96Znl0Q1A2RDR1MEJFSW4xejVzRCIsIlRQfEFCfFVTUzdEfExlbnNyZW50YWxBfEhFUk98Q1RBfENoZWNrVGhlU2VydmljZU1hcCI6IkFXLTg2MzIzODc5My92TnUxQ05EMmctNEJFSW4xejVzRCIsIlRQfEFCfFVTUzdEfExlbnNSZW50YWxCfEhFUk98Q1RBfEdldEFSYXRlTm93IjoiQVctODYzMjM4NzkzL1BpQlNDTDM0Zy00QkVJbjF6NXNEIiwiVFB8QUJ8VVNTN0R8UmVzaXxIRVJPfENUQXxTZXJ2aWNlTWFwIjoiQVctODYzMjM4NzkzL3pDaUdDUDdCN1BZQkVJbjF6NXNEIiwiVFB8QUJ8VVNTN0R8UmVzaXxIRVJPfENUQXxHZXRBUmF0ZU5vdyI6IkFXLTg2MzIzODc5My9WQUREQ09pWTl2WUJFSW4xejVzRCJ9fX19LCJjb250ZW50OkRlbGF5ZWQgUGFnZSBUeXBlIjp7ZGVmYXVsdFZhbHVlOiJub3JtYWwiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzIixzZXR0aW5nczp7cGF0aDoiRkRYLkRBVEFMQVlFUi5wYWdlLnBhZ2VJbmZvLmRlbGF5VHlwZSJ9fSwidmE6ZGlzYWJsZWRQYWdlTGlzdCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm5bIi9jdXN0b21lci1zdXBwb3J0Lmh0bWwiLCIvY29udGFjdC11cy5odG1sIiwiL2VzLXVzLyIsIi9mci1tcSIsIi9lbi11cy9zZXJ2aWNlYWxlcnQuaHRtbCIsIi9xdWljay1oZWxwIiwiL2RhLWRrLyIsIi9uby1uby8iLCIvc3Ytc2UvIiwiL2ZyLWdwLyIsIi9mci1odC8iLCIvdmktdm4vIiwiL2FyLWFlLyIsIi9vZmZpY2Uvc2Ftc3VuZy1yZXBhaXIuaHRtbCIsIi9zcGFjZS5odG1sIiwiL2VuLXVzL29mZmljZS9wc2ciLCIvZW4tdXMvdHJ1c3QtY2VudGVyIiwiL2VuLXVzL2NyZWF0ZS1hY2NvdW50Lmh0bWwiLCIvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMiLCIvZW4tdXMvZWNvbW1lcmNlIiwiL2VuLXVzL3NtYWxsLWJ1c2luZXNzIiwiL3NtYWxsLWJ1c2luZXNzLmh0bWwiLCIvZW4tZ2IvIiwiL2VuLWllLyIsIi9lbi1kay8iLCIvZW4tbm8vIiwiL2VuLXNlLyIsIi9lbi1ubC8iLCIvbmwtbmwvIiwiL2VuLWZyLyIsIi9mci1mci8iLCIvZW4taXQvIiwiL2l0LWl0LyIsIi9lbi1iZS8iLCIvZnItYmUvIiwiL25sLWJlLyIsIi9lbi1lcy8iLCIvZXMtZXMvIiwiL2VuLWF0LyIsIi9lbi1kZS8iLCIvZGUtZGUvIiwiL2VuLXBsLyIsIi9wbC1wbC8iXX19fSwiYWFtOmNvdW50cmllcyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4iIn19fSwiZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIikubWF0Y2goL2FyX2FlfGVuX2FlfGVuX2JofGVuX2JyfGVuX2NsfGVuX2NufGVuX2NvfGVuX2t3fGVuX214fGVuX3phfGVzX2NsfGVzX2NvfGVzX214fHB0X2JyfHpoX2NuL2dpKX19fSwibG9naW46c3RhdHVzIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1fc2F0ZWxsaXRlLmNvb2tpZS5nZXQoImZkeF9sb2dpbiIpJiZfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoImZkeF9sb2dpbiIpPyJMb2dnZWQgSW4iOiJMb2dnZWQgT3V0In19fSwic2l0ZS1kaWFnbm9zdGljczp2aWV3cG9ydCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEZEWC5CUkVBS1BPSU5UUyYmKGU9dm9pZCAwIT09RkRYLkJSRUFLUE9JTlRTLmdldFZpZXdQb3J0KCk/RkRYLkJSRUFLUE9JTlRTLmdldFZpZXdQb3J0KCk6IiIpLGV9fX0sInZhOmNhYXNFbmFibGVkQ291bnRyeUxpc3QiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuWyJmcl9jaCIsImRlX2NoIiwiaXRfY2giLCJlbl9iciIsInB0X2JyIiwiZW5fbXgiLCJlbl9hciIsImVuX2JvIiwiZW5fY2wiLCJlbl9jbyIsImVuX2NyIiwiZW5fZG8iLCJlbl9zdiIsImVuX2d0IiwiZW5faG4iLCJlbl9uaSIsImVuX3BhIiwiZW5fcHkiLCJlbl9wZSIsImVuX3ByIiwiZW5fdXkiLCJlbl92ZSIsImVuX2J6IiwiZW5fYWkiLCJlbl9hZyIsImVuX2dmIiwiZW5fZ3kiLCJlbl9zciIsImVuX2F3IiwiZW5fYnMiLCJlbl9iYiIsImVuX2JtIiwiZW5fYnEiLCJlbl92ZyIsImVuX2t5IiwiZW5fY3ciLCJlbl9kbSIsImVuX2ptIiwiZW5fbXMiLCJlbl9tZiIsImVuX3N4IiwiZW5fa24iLCJlbl9sYyIsImVuX3ZjIiwiZW5fdHQiLCJlbl90YyIsImVuX3ZpIiwiZW5fZ3AiLCJlbl9tcSIsImVuX2h0IiwiZW5fdXMiLCJmcl9jYSIsImVuX2NhIiwiZW5fY2giLCJlc19teCIsImVzX2FyIiwiZXNfYm8iLCJlc19jbCIsImVzX2NvIiwiZXNfY3IiLCJlc19kbyIsImVzX2VjIiwiZXNfc3YiLCJlc19ndCIsImVzX2huIiwiZXNfbmkiLCJlc19wYSIsImVzX3B5IiwiZXNfcGUiLCJlc19wciIsImVzX3V5IiwiZXNfdmUiLCJlbl9pbiIsImVuX2FlIiwiZW5femEiXX19fSwiYXBwOnNoaXBTZWdJZHMiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIjgwOTI2ODYifX19LCJGbGFzaFRhbGtpbmc6cGFnZUxpc3RNYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCI6Imh0dHBzOi8vc2VydmVkYnkuZmxhc2h0YWxraW5nLmNvbS9zcG90LzEvNTI4NDsxMTc5NjQ7MTI1MDkvP3Nwb3ROYW1lPUZlZEV4XzIwMjBfTGFuZGluZ19QYWdlJmNhY2hlYnVzdGVyPSJ9fX19LCJnVGFnOkNvbmZpZ0lETWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm57dXM6e0RDQ29uZmlnSUQ6IkRDLTQxOTEyNjMiLEFXQ29uZmlnSUQ6IkFXLTg2MzIzODc5MyJ9LGNhOntEQ0NvbmZpZ0lEOiJEQy00MTkxMjYzIixBV0NvbmZpZ0lEOiJBVy0xMDE1NzY3NDkwIn0semE6e0RDQ29uZmlnSUQ6IiIsQVdDb25maWdJRDoiNjk4NTIwODE3In0sYXU6e0RDQ29uZmlnSUQ6IiIsQVdDb25maWdJRDoiQVctNjgzOTg3MDgyIn0sbno6e0RDQ29uZmlnSUQ6IiIsQVdDb25maWdJRDoiQVctNjgzOTg3MDgyIn0sY286e0RDQ29uZmlnSUQ6IkRDLTI1MjYyODkiLEFXQ29uZmlnSUQ6IiJ9LGNsOntEQ0NvbmZpZ0lEOiJEQy0yNTI2Mjg5IixBV0NvbmZpZ0lEOiIifSxicjp7RENDb25maWdJRDoiREMtMjUyNjI4OSIsQVdDb25maWdJRDoiIn0sbXg6e0RDQ29uZmlnSUQ6IkRDLTI1MjYyODkiLEFXQ29uZmlnSUQ6IiJ9LGtyOntEQ0NvbmZpZ0lEOiJEQy05OTI5OTY5IixBV0NvbmZpZ0lEOiIifSx0dzp7RENDb25maWdJRDoiREMtOTkyOTk2OSIsQVdDb25maWdJRDoiIn0sc2c6e0RDQ29uZmlnSUQ6IkRDLTk5Mjk5NjkiLEFXQ29uZmlnSUQ6IiJ9LGhrOntEQ0NvbmZpZ0lEOiJEQy05OTI5OTY5IixBV0NvbmZpZ0lEOiIifSxqcDp7RENDb25maWdJRDoiREMtOTkyOTk2OSIsQVdDb25maWdJRDoiIn19fX19LGRvdFRhZ1BpeGVsSWQ6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT13aW5kb3cubG9jYXRpb24uaHJlZjtwaXhlbElkcz1fc2F0ZWxsaXRlLmdldFZhcigiZG90VGFnUGl4ZWxNYXBwaW5nIik7dmFyIHQ9IiI7aWYodm9pZCAwIT09ZSYmIiIhPWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgcGl4ZWxJZHMmJiIiIT1waXhlbElkcylmb3IodmFyIG4gaW4gcGl4ZWxJZHMpMDxlLmluZGV4T2YobikmJih0PXBpeGVsSWRzW25dKTtyZXR1cm4gdH19fSwiY2xpY2s6YmxvY2tMaXN0Ijp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVyblsiaG9sZCBhdCBsb2NhdGlvbixmYWxzZSIsImludGVybmF0aW9uYWwgdHJhZmZpYyBpbiBhcm1zIHJlZ3VsYXRpb25zLGZhbHNlIiwiZGVsaXZlcnkgb24gaW52b2ljZSBhY2NlcHRhbmNlLGZhbHNlIiwic2F2ZSBkaWEgcmV0dXJuIGFkZHJlc3MsZmFsc2UiLCJyZXR1cm5zIGNsZWFyYW5jZSxmYWxzZSIsInRyay1sYW5kaW5ncGFnZTF0cmFja2luZ251bWJlcnNwcmVzZW50IiwidHJrLXN1bW1hcnlwYWdlLXRyYWNrYnRuIiwibXRyay1kZXRhaWxwYWdlLWNkby1idXR0b24iLCJ0cmstbGFuZGluZ3BhZ2UtdHJhY2tidG4iLCJtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LWN1cnJlbnQiLCJ0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtY3VycmVudCIsInRyay10cmFja2J5cmVmZXJlbmNlLWFjY291bnRudW1iZXIiLCJ0cmstZGV0YWlscGFnZS1hc3Njc2hpcG1lbnRpY29uIiwibXRyay1ub3RpZmljYXRpb25wYWdlIiwibXRyay10cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcnlleGNlcHRpb24iLCJ0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcnlleGNlcHRpb24iLCJ0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcmVkIiwibXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljaGVja2JveC1kZWxpdmVyZWQiLCJtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LWV4Y2VwdGlvbiIsInRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljaGVja2JveC1leGNlcHRpb24iLCJ0cmstZGV0YWlscGFnZS1hY3Rpb25iYXItbW9yZWFjdGlvbnNfaGVhZGVyIiwidHJrLXRyYWNrbW9kdWxlLXBsYWNhcmQtcHJlc3NlZCIsIm10cmstZGV0YWlscGFnZS1zY2hlZHVsZWRkZWxpdmVyeWRhdGVpY29uIiwidHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNvbnRpbnVlYnRuIiwidHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWRlbGl2ZXJlZHN0YXR1c3NlbGVjdGVkIiwibXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljb250aW51ZWJ0biIsInRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnllc3RkZWx1cGRhdGVzdGF0dXNzZWxlY3RlZCIsIm10cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5ZGVsaXZlcmVkc3RhdHVzc2VsZWN0ZWQiLCJ0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y3VycmVucnN0YXR1c3NlbGVjdGVkIiwibXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljdXJyZW5yc3RhdHVzc2VsZWN0ZWQiLCJ0cmstdHJhY2ttb2R1bGUtd2F0Y2hsaXN0dGFiIiwibXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnllc3RkZWx1cGRhdGVzdGF0dXNzZWxlY3RlZCIsInRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnlleGNlcHRpb25zc3RhdHVzc2VsZWN0ZWQiLCJtdHJrLXRyYWNrbW9kdWxlLWFsbHNoaXBtZW50c3RhYiIsInRyay1kZXRhaWxwYWdlLXNoaXBtZW50c25hcHNob3QtZGVzdGluYXRpb24taGVscCIsInRyay1kZXRhaWxwYWdlLXRpbWV6b25lZHJvcGRvd24iLCJtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LXRlbmRlcmVkIiwidHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LXRlbmRlcmVkIiwibXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnlleGNlcHRpb25zc3RhdHVzc2VsZWN0ZWQiLCJ0cmstdHJhY2tieXJlZmVyZW5jZS1kZXN0aW5hdGlvbmNvdW50cnkiLCJtdHJrLWRldGFpbHBhZ2Utc2hpcGRhdGVpY29uIiwibXRyay10cmFja21vZHVsZS13YXRjaGxpc3R0YWIiLCJtdHJrLWRldGFpbHBhZ2Utc3RhbmRhcmR0cmFuc2l0aGVscGljb24iLCJ0cmstdHJhY2tieXJlZmVyZW5jZS10cmFja2J0biIsInRyay1kZXRhaWxwYWdlLXNoaXBtZW50ZmFjdHMtaGVscC1pY29uIiwidHJrLXRyYWNrbW9kdWxlLWFsbHNoaXBtZW50c3RhYiIsInRyay10cmFja2J5dGNuLXRjbi1pbnB1dGZpZWxkIiwibXRyay1kZXRhaWxwYWdlLW9wb2RwYWdldmlldyIsInRyay1kZXRhaWxwYWdlLXNhdmV0cmFja251bWJlcmNoa2JveC1jaGVja2VkIiwidHJrLXN1bW1hcnlwYWdlMXRyYWNraW5nbnVtYmVyc3ByZXNlbnQiLCJtdHJrLWRldGFpbHBhZ2UtdHJhdmVsaGlzdG9yeSIsIm10cmstdHJhY2ttb2R1bGUtZXhjZXB0aW9uc3RhYiIsIm10cmstdHJhY2ttb2R1bGUtcGxhY2FyZC1wcmVzc2VkIiwidHJrLWRldGFpbHBhZ2UtdHJhdmVsaGlzdG9yeSIsInRyay1kZXRhaWx2aWV3LXNjcm9sbGluZ2xpc3QtcGxhY2FyZC1wcmVzc2VkIiwidHJrLXRyYWNrbW9kdWxlLXdhdGNobGlzdHRhYiIsInRyay10cmFja21vZHVsZS1leGNlcHRpb25zdGFiIiwibGluayBjbGljazogYWRkcmVzc2NoZWNrLCB0cnVlIiwiZ2V0Y3VzdG9taXplZHZpZXdzZnJvbWFkbWMiLCJsaW5rIGNsaWNrOiBhZGRyZXNzcmVzdWx0LCB0cnVlIiwic2F2ZSBhcyBkZWZhdWx0IHJldHVybiBhZGRyZXNzLGZhbHNlIiwicmV0dXJuczpzYXR1cmRheSBkZWxpdmVyeSBhbGxvd2VkLGZhbHNlIiwiaGRyfHRhYnwxfFNoaXBwaW5nIiwiaGRyfHRhYnwyfFRyYWNraW5nIiwiaGRyfHRhYnwzfFByaW50aW5nIFNlcnZpY2VzIiwiaGRyfHRhYnw0fExvY2F0aW9ucyIsImhkcnx0YWJ8NXxTdXBwb3J0IiwiaGVyb3xjdWJlfFJBVEUmU0hJUCIsImhlcm98Y3ViZXxUUkFDSyIsImhlcm98Y3ViZXxMT0NBVElPTlMiLCJob21lfE9wZW4gQSBGZWRFeCBBY2NvdW50IiwidGFifGVudmVsb3BlfHBhY2thZ2VzIiwidGFifGZyZWlnaHR8c2hpcHBpbmciLCJ0YWJ8ZXhwZWRpdGVkfGV4dHJhIiwidGFifGFpcnxmcmVpZ2h0IiwidHJrLXRyYWNrQnlUQ04tVENOLUlucHV0RmllbGQiLCJ0cmstbGFuZGluZ1BhZ2UtcHJvbXB0VG9Mb2dpbmZvckJPTCIsInRyay1sYW5kaW5nUGFnZS1yYWRpb0J0bi1CaWxsT2ZMYWRpbmciLCJ0cmstbGFuZGluZ1BhZ2UtcmFkaW9CdG4tUHJvb2ZPZkRlbGl2ZXJ5IiwidHJrLWxhbmRpbmdQYWdlLXJhZGlvQnRuLUZheExldHRlciIsInRyay1sYW5kaW5nUGFnZS1yYWRpb0J0bi1WaWV3UHJpbnRMZXR0ZXIiLCJ0cmstdHJhY2tCeVRDTi1UcmFja0J0biIsInRyay1sYW5kaW5nUGFnZS1tdWxpdGlwbGVUcmFja2luZ051bWJlckxpbmsiLCJ0cmstbGFuZGluZ1BhZ2Utc2luZ2xlVHJhY2tpbmdOdW1iZXJMaW5rIiwidHJrLWxhbmRpbmdQYWdlLXRyYWNrLWhlbHBMaW5rIiwiaGRyfExvZ2luIl19fX0sX2ZkeFV0aWw6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZTt3aW5kb3cuX2ZkeD17fSx3aW5kb3csZT1fZmR4fHx7fSxmPWV8fHt9LGYuaXNPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT11bmRlZmluZWQmJm51bGwhPT1lJiZlLmNvbnN0cnVjdG9yPT1PYmplY3R9LGYuaXNMaXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITAscj0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gbnVsbCE9PWUmJiIiIT09ZSYmcjxlJiYobj0hMSksbnVsbCE9PXQmJiIiIT09dCYmdDxyJiYobj0hMSksbn0sZi5wYWdlRmxhZz1mdW5jdGlvbihlLHQsbil7aWYodm9pZCAwIT09ZSYmIiIhPT1lJiZ2b2lkIDAhPT10JiYiIiE9PXQpZm9yKHZhciByIGluIGUpaWYoaXNOYU4ocikpe2lmKC0xPHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHIudG9Mb3dlckNhc2UoKSkpcmV0dXJuIF9mZHguaXNPYmplY3QoZVtyXSk/ImNvdW50cnkiPT1uP2Vbcl06KGVuYWJsZWRUaW1lPV9mZHguaXNMaXZlKGVbcl0uc3RhcnRUaW1lLGVbcl0uZW5kVGltZSksISFlbmFibGVkVGltZSYmKHNyY1ZhbHVlPWVbcl0ucGl4ZWwsInVuZGVmaW5lZCI9PXNyY1ZhbHVlfHxzcmNWYWx1ZSkpOmVbcl19ZWxzZXtpZigtMTx0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlW3JdLnRvTG93ZXJDYXNlKCkpKXJldHVybiEwO2lmKHQ9PXIpcmV0dXJuIGVbcl19cmV0dXJuITF9LGYucGNmVXRpbD1mdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJQQ0Y6QWxsb3dlZFByb2REb21haW5zIiksdD13aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIG51bGwhPXQubWF0Y2goL3d3dyhiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpP3Q6MDxlLmxlbmd0aCYmLTE8ZS5pbmRleE9mKHQpPyJ3d3cuZmVkZXguY29tIjoid3d3dGVzdC5mZWRleC5jb20ifSxmLmdldFRlc3RMZXZlbD1mdW5jdGlvbigpe3ZhciBlPSIiLHQ9e3d3d3Nib3g6IkwxUyIsd3d3YmFzZToiTDEiLHd3d2RldjoiTDIiLHd3d2RydDoiTDMiLHd3d3N0cmVzczoiTDQiLHd3d2JpdDoiTDUiLHd3d3Rlc3Q6Ikw2In0sbj13d3dIb3N0LnNwbGl0KCIuIilbMF07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0W25dJiYiIiE9PXRbbl0mJihlPXRbbl0pLGV9LGYuZ2V0R3RhZ0xhYmVsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gdClpZih0W3JdPT09bilyZXR1cm4gZVtyXX19fX0sInZlcml6b246cGFnZUxpc3QiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9Imh0dHBzOi8vc3AuYW5hbHl0aWNzLnlhaG9vLmNvbS9zcHAucGw/YT0xMDAwMCYueXA9MTAwOTI5MDcmZWM9IjtyZXR1cm57Ii9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nL3JlZ3VsYXRvcnktZm9ybS90aGFuay15b3UuaHRtbCI6ZSsiRmVkRXhfUmVndWxhdG9yeV9Gb3JtX1RoYW5rX1lvdV9FbmdsaXNoIiwiL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcvcmVndWxhdG9yeS1mb3JtL3RoYW5rLXlvdS5odG1sIjplKyJGZWRFeF9SZWd1bGF0b3J5X0Zvcm1fVGhhbmtfWW91X0ZyZW5jaCIsIi9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nLmh0bWwiOmUrIkZlZEV4X0ludGVybmF0aW9uYWxfU2hpcHBpbmdfRU4iLCIvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjplKyJGZWRFeF9JbnRlcm5hdGlvbmFsX1NoaXBwaW5nX0ZSIiwiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcvb2ZmZXIvdGhhbmsteW91Lmh0bWwiOmUrIkZlZEV4X0FkZGl0aW9uYWxfVGhhbmtfWW91X1BhZ2VfRW5nbGlzaCIsIi9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nL29mZmVyL3RoYW5rLXlvdS5odG1sIjplKyJGZWRFeF9BZGRpdGlvbmFsX1RoYW5rX1lvdV9QYWdlX0ZyZW5jaCIsImZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2V4cHJlc3MtZnJlaWdodC5odG1sIjplKyJGZWRFeF9BZGRpdGlvbmFsX1RoYW5rX1lvdV9QYWdlX0ZyZW5jaDEyMyJ9fX19LCJhYW06UmVnaW9uQ29udGFpbmVyTlNJRCI6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIiE9PV9zYXRlbGxpdGUuZ2V0VmFyKCJhYW06Y29udGFpbmVyTlNJRE1hcHBpbmciKT9fc2F0ZWxsaXRlLmdldFZhcigiYWFtOmNvbnRhaW5lck5TSURNYXBwaW5nIik6IiIsdD0wLG49X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cmVnaW9uIikscj1GRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ubG9jYWxlO2lmKG51bGwhPS9bYS16XXsyfV9bYS16XXsyfS9nLmV4ZWMocikmJjU9PXIubGVuZ3RoKXtpZih2b2lkIDAhPT1lJiYiIiE9PWUpZm9yKHZhciBpIGluIGUpaWYoLTE8bi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaSkpe3Q9ZVtpXTticmVha319ZWxzZSB0PTA7cmV0dXJuIHBhcnNlSW50KHQpfX19LCJnVGFnOlRhcmdldFZpZGVvTWFwcGluZyI6e21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybns2MjI3NTQ0MTg1MDAxOiJBVy04NjMyMzg3OTMvZ2VtMENQSG5nLTRCRUluMXo1c0QiLDYyMjc1NDU2NTgwMDE6IkFXLTg2MzIzODc5My9wVkEtQ0tPUTR1OEJFSW4xejVzRCIsNjIzNDM5OTU1OTAwMToiQVctODYzMjM4NzkzLzdWdUJDTnJNbE80QkVJbjF6NXNEIiw2MjMzODI3MTQxMDAxOiJBVy04NjMyMzg3OTMvVXVQbkNQQzQxZmNCRUluMXo1c0QifX19fSwiZ1RhZzpERkFFdmVudE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJue3VzOnsiL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMDUvZmVkZXgwMmkrc3RhbmRhcmQiLCIvZW4tdXMvY291cG9uLW9mZmVycy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyMStzdGFuZGFyZCIsIi9lbi11cy9zaGlwcGluZy9kcm9wYm94Lmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDIwK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL2ZyZWlnaHQtc2VydmljZXMvbHRsL3ZvbHVtZS1zZXJ2aWNlcy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAxdStzdGFuZGFyZCIsIi9lbi11cy9jdXN0b21lci1zdXBwb3J0Lmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDB5K3N0YW5kYXJkIiwiL2VuLXVzL2hvbWUuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMHgrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMHcrc3RhbmRhcmQiLCIvZW4tdXMvc2hpcHBpbmcuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMHYrc3RhbmRhcmQiLCIvZW4tdXMvdHJhY2tpbmcuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMHUrc3RhbmRhcmQiLCIvZW4tdXMvb2ZmaWNlLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDBzK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwtZ3JvdW5kLWNhbmFkYS5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwbCtzdGFuZGFyZCIsIi9lbi11cy9wcmludGluZy9vbmxpbmUtcHJpbnRpbmcuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGgrc3RhbmRhcmQiLCIvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDBiK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL2dyb3VuZC5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwYStzdGFuZGFyZCIsIi9lbi11cy9zaGlwcGluZy9wYWNraW5nLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDAtK3N0YW5kYXJkIiwiL2VuLXVzL3ByaW50aW5nL3Bvc3RlcnMvY2FudmFzLXByaW50cy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDArc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczEuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGYrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczIuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGUrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczMuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGcrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczQuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGQrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczUuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGMrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvZmxhc2gtc2FsZS1vZmZlcnMuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMmUrc3RhbmRhcmQiLCIvZW4tdXMvc2hpcHBpbmcvaG9sZC1hdC1sb2NhdGlvbi5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyaCtzdGFuZGFyZCIsIi9lbi11cy9wcmludGluZy9zbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJnK3N0YW5kYXJkIiwiL2VuLXVzL29mZmljZS93YWxtYXJ0Lmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJpK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCI6IkRDLTQxOTEyNjMvd2FsZ3IwL2ZlZGV4MCtzdGFuZGFyZCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMm4rc3RhbmRhcmQiLCIvZW4tdXMvc2hpcHBpbmcvcGFja2luZy1zdXBwbGllcy9jdXN0b20tYnJhbmRlZC1ib3hlcy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyaytzdGFuZGFyZCIsIi9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL2hvdy10by1wcmV2ZW50LXN0b2xlbi1taXNzaW5nLXBhY2thZ2VzLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJsK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL2ZyZWlnaHQtc2VydmljZXMvbHRsL3F1b3RlLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJyK3N0YW5kYXJkIiwiL2VuLXVzL3ByaW50aW5nL2N1c3RvbS1wcm9mZXNzaW9uYWwtcHJpbnRpbmcuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZnkxOV8wK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL2ZyZWlnaHQtc2VydmljZXMvaW5ub3ZhdGlvbi5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAydStzdGFuZGFyZCIsIi9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJ5K3N0YW5kYXJkIiwiL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2VtMTU2OTIwMTMuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZnkyMF8wMDErc3RhbmRhcmQiLCIvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvZW0xNTY5MjIxMy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9meTIwXzAwMCtzdGFuZGFyZCIsIi9lbi11cy9jcmVhdGUtYWNjb3VudC5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9meTIwXzArc3RhbmRhcmQiLCIvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvZW0xNTY5MjExMy5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9meTIwXzAwK3N0YW5kYXJkIiwiL2VuLXVzL3ByaW50aW5nL2J1c2luZXNzLXNvbHV0aW9ucy9rbm93bGVkZ2UtY2VudGVyLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDMxK3N0YW5kYXJkIiwiL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2FnMTMzOTg2MDIuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMzgrc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDNoK3N0YW5kYXJkIiwiL2VuLXVzL3NoaXBwaW5nL29mZmljZS1kZXBvdC1vZmZpY2VtYXguaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM2Erc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvbmF0aW9uYWwtYmlkLWNlbnRlci5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAzLStzdGFuZGFyZCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvdGFyZ2V0LXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAzYitzdGFuZGFyZCIsIi9lbi11cy9zbWFsbC1idXNpbmVzcy9tYWtpbmctaXQtd29yay1wb2RjYXN0Lmh0bWwiOiJEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDNqK3N0YW5kYXJkIiwiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCI6IkRDLTQxOTEyNjMvZmRtZW4wL2ZkbWxhMCtzdGFuZGFyZCIsIi9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL21hbmFnZS15b3VyLWRlbGl2ZXJpZXMuaHRtbCI6IkRDLTQxOTEyNjMvZmRtZW4wL2ZkbWxhMDArc3RhbmRhcmQiLCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6IkRDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM20rc3RhbmRhcmQiLCIvZW4tdXMvcHJpbnRpbmcvY29uc3VtZXItb2ZmZXJzLmh0bWwiOiJEQy00MTkxMjYzL2NvbnN1MC9mZWRleDArc3RhbmRhcmQiLCIvZW4tdXMvc2hpcHBpbmcvb25zaXRlL2RvbGxhci1nZW5lcmFsLXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sIjoiREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAzbCtzdGFuZGFyZCJ9LGNhOnsiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCI6IkRDLTk3NDcxNC9mZWRleDE3L2ZlZGV4MCtzdGFuZGFyZCIsIi9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nLmh0bWwiOiJEQy05NzQ3MTQvZmVkZXgxNy9mZWRleDAwK3N0YW5kYXJkIiwiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcvcmVndWxhdG9yeS1mb3JtL3RoYW5rLXlvdS5odG1sIjoiREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwOCt1bmlxdWUiLCIvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy9yZWd1bGF0b3J5LWZvcm0vdGhhbmsteW91Lmh0bWwiOiJEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDA5K3VuaXF1ZSJ9LGJoOnsiL2VuLWJoL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkRDLTE5ODI1NzQvZW54MngwL2ZlZGV4MDArc3RhbmRhcmQifSxrdzp7Ii9lbi1rdy9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWwiOiJEQy0xOTgyNTc0L2VueDJ4MC9mZWRleDAwMCtzdGFuZGFyZCJ9LGFlOnsiL2FyLWFlL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkRDLTE5ODI1NzQvYXI0NHgwL2ZlZGV4MCtzdGFuZGFyZCIsIi9lbi1hZS9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWwiOiJEQy0xOTgyNTc0L2VueDJ4MC9mZWRleDArc3RhbmRhcmQifSxrcjp7Ii9rby1rci9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCI6IkRDLTk5Mjk5Njkva29yZWEwL2ZlZGV4MDAwK3N0YW5kYXJkIiwiL2tvLWtyL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCI6IkRDLTk5Mjk5Njkva29yZWEwL2ZlZGV4MDAxK3N0YW5kYXJkIiwiL2tvLWtyL3NtYWxsLWJ1c2luZXNzLmh0bWwiOiJEQy05OTI5OTY5L2tvcmVhMC9mZWRleDArc3RhbmRhcmQiLCIva28ta3Ivb3Blbi1hY2NvdW50Lmh0bWwiOiJEQy05OTI5OTY5L2tvcmVhMC9mZWRleDAwK3N0YW5kYXJkIn0sdHc6eyIvemgtdHcvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sIjoiREMtNTY1MzAyMC9meTIwYTAvZnkyMF8wMDArc3RhbmRhcmQiLCIvZW4tdHcvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sIjoiREMtNTY1MzAyMC9meTIwYTAvZnkyMF8wMDArc3RhbmRhcmQiLCIvemgtdHcvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sIjoiREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwMDArc3RhbmRhcmQiLCIvemgtdHcvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwiOiJEQy05OTI5OTY5L3RhaXdhMC9mZWRleDAwMStzdGFuZGFyZCIsIi96aC10dy9zaGlwcGluZy9mZWRleC1yZXdhcmRzLmh0bWwiOiJEQy05OTI5OTY5L3RhaXdhMC9mZWRleDAwMitzdGFuZGFyZCIsIi96aC10dy9zbWFsbC1idXNpbmVzcy5odG1sIjoiREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwK3N0YW5kYXJkIiwiL3poLXR3L29wZW4tYWNjb3VudC5odG1sIjoiREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwMCtzdGFuZGFyZCJ9LHNnOnsiL2VuLXNnL29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCI6IkRDLTk5Mjk5Njkvc2luZ2EwL2ZlZGV4MDAwK3N0YW5kYXJkIiwiL2VuLXNnL29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sIjoiREMtOTkyOTk2OS9zaW5nYTAvZmVkZXgwMDErc3RhbmRhcmQiLCIvZW4tc2cvc2hpcHBpbmcvZmVkZXgtcmV3YXJkcy5odG1sIjoiREMtOTkyOTk2OS9zaW5nYTAvZmVkZXgwMDIrc3RhbmRhcmQiLCIvZW4tc2cvc21hbGwtYnVzaW5lc3MuaHRtbCI6IkRDLTk5Mjk5Njkvc2luZ2EwL2ZlZGV4MCtzdGFuZGFyZCIsIi9lbi1zZy9vcGVuLWFjY291bnQuaHRtbCI6IkRDLTk5Mjk5Njkvc2luZ2EwL2ZlZGV4MDArc3RhbmRhcmQifSxqcDp7Ii9qYS1qcC9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwiOiJEQy05OTI5OTY5L2phcGFuMC9mZWRleDAwMCtzdGFuZGFyZCIsIi9qYS1qcC9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCI6IkRDLTk5Mjk5NjkvamFwYW4wL2ZlZGV4MDAxK3N0YW5kYXJkIiwiL2phLWpwL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCI6IkRDLTk5Mjk5NjkvamFwYW4wL2ZlZGV4MDAyK3N0YW5kYXJkIiwiL2phLWpwL3NtYWxsLWJ1c2luZXNzLmh0bWwiOiJEQy05OTI5OTY5L2phcGFuMC9mZWRleDArc3RhbmRhcmQiLCIvamEtanAvb3Blbi1hY2NvdW50Lmh0bWwiOiJEQy05OTI5OTY5L2phcGFuMC9mZWRleDAwK3N0YW5kYXJkIn0saGs6eyIvemgtaGsvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwiOiJEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwNCtzdGFuZGFyZCIsIi9lbi1oay9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDA1K3N0YW5kYXJkIiwiL3poLWhrL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDA2K3N0YW5kYXJkIiwiL2VuLWhrL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDA3K3N0YW5kYXJkIiwiL3poLWhrL3NtYWxsLWJ1c2luZXNzLmh0bWwiOiJEQy05OTI5OTY5L2hvbmdrMC9mZWRleDArc3RhbmRhcmQiLCIvZW4taGsvc21hbGwtYnVzaW5lc3MuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDArc3RhbmRhcmQiLCIvemgtaGsvb3Blbi1hY2NvdW50Lmh0bWwiOiJEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwMCtzdGFuZGFyZCIsIi9lbi1oay9vcGVuLWFjY291bnQuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDAxK3N0YW5kYXJkIiwiL3poLWhrL29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDAyK3N0YW5kYXJkIiwiL2VuLWhrL29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCI6IkRDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDAzK3N0YW5kYXJkIn0sYXU6eyIvZW4tYXUvc2hpcHBpbmcvZmVkZXgtcmV3YXJkcy5odG1sIjoiREMtOTkyOTk2OS9hdXN0cjAvZmVkZXgwMDIrc3RhbmRhcmQiLCIvZW4tYXUvc21hbGwtYnVzaW5lc3MuaHRtbCI6IkRDLTk5Mjk5NjkvYXVzdHIwL2ZlZGV4MCtzdGFuZGFyZCIsIi9lbi1hdS9vcGVuLWFjY291bnQuaHRtbCI6IkRDLTk5Mjk5NjkvYXVzdHIwL2ZlZGV4MDArc3RhbmRhcmQiLCIvZW4tYXUvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sIjoiREMtOTkyOTk2OS9hdXN0cjAvZmVkZXgwMDArc3RhbmRhcmQiLCIvZW4tYXUvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwiOiJEQy05OTI5OTY5L2F1c3RyMC9mZWRleDAwMStzdGFuZGFyZCJ9LGNvOnsiL2VzLWNvL29wZW4tYWNjb3VudC5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMG8rc3RhbmRhcmQiLCIvZXMtY28vY3VzdG9tZXItc3VwcG9ydC5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMGorc3RhbmRhcmQiLCIvZXMtY28vYWJvdXQvcG9zc2liaWxpdGllcy5odG1sP0NNUD1QQUMtUG9zc2liaWxpdGllcy0wLTAtMTA1Mi0xMDAwMDAtTEFDLWNvLWVzLVZhbml0eVVSTCNmb29kLWJldmVyYWdlIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMCtzdGFuZGFyZCIsIi9lcy1jby9zaGlwcGluZy5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMDIrc3RhbmRhcmQiLCIvZXMtY28vYWJvdXQvcG9zc2liaWxpdGllcy5odG1sP0NNUD1QQUMtUG9zc2liaWxpdGllcy0wLTAtMTA1Mi0xMDAwMDAtTEFDLWNvLWVzLVZhbml0eVVSTCN0ZWNobm9sb2d5IjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMDArc3RhbmRhcmQiLCIvZXMtY28vYWJvdXQvcG9zc2liaWxpdGllcy5odG1sP0NNUD1QQUMtUG9zc2liaWxpdGllcy0wLTAtMTA1Mi0xMDAwMDAtTEFDLWNvLWVzLVZhbml0eVVSTCI6IkRDLTI1MjYyODkvYmJjam0wL2FsbF9mMCtzdGFuZGFyZCIsIi9lcy1jby9zaGlwcGluZy9yYXRlcy5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMDcrc3RhbmRhcmQiLCIvZXMtY28vaG9tZS5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMHArc3RhbmRhcmQiLCIvZXMtY28vb25saW5lL3JhdGluZy5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMDUrc3RhbmRhcmQiLCIvZXMtY28vdHJhY2tpbmcuaHRtbCI6IkRDLTI1MjYyODkvYmJjam0wL2FsbF9mMDBiK3N0YW5kYXJkIiwiL2VzLWNvL2N1c3RvbXMtdG9vbHMuaHRtbCI6IkRDLTI1MjYyODkvYmJjam0wL2FsbF9mMDBjK3N0YW5kYXJkIiwiL2VzLWNvL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkRDLTI1MjYyODkvYmJjam0wL2FsbF9mMDArc3RhbmRhcmQifSxjbDp7Ii9lcy1jbC9iaWxsaW5nLmh0bWwiOiJEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwcytzdGFuZGFyZCIsIi9lcy1jbC9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWwiOiJEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwK3N0YW5kYXJkIn0sYnI6eyIvcHQtYnIvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sIjoiREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMCtzdGFuZGFyZCJ9LG14OnsiL2VzLW14L2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCI6IkRDLTI1MjYyODkvYmJjam0wL2FsbF9mMDArc3RhbmRhcmQifX19fX0sImV2ZW50OnZhQ2xpY2siOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMiLHNldHRpbmdzOntwYXRoOiJGRFguREFUQUxBWUVSLlZBLnN0YXR1cyJ9fSwicXVhbHRyaWNzOnBhZ2VMaXN0TWFwcGluZyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm5bIi9lbi11cy9nZXQtc3RhcnRlZC5odG1sIiwiL2VuLXVzL2NvdXBvbi1vZmZlcnMuaHRtbCIsIi9lbi11cy9jb3Vwb24tb2ZmZXJzL2dyb3VuZC5odG1sIiwiL2VuLXVzL29mZmljZS93YWxtYXJ0Lmh0bWwiLCIvZW4tdXMvcHJpbnRpbmcuaHRtbCIsIi9lbi11cy9zaGlwcGluZy9kcm9wYm94Lmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvaG9sZC1hdC1sb2NhdGlvbi5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL3BhY2tpbmctYm94ZXMvc2VydmljZXMuaHRtbCIsIi9lbi11cy9zaGlwcGluZy9wYWNraW5nLXN1cHBsaWVzLmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwiLCIvZW4tdXMvdHJhY2tpbmcuaHRtbCIsIi9lbi11cy9iaWxsaW5nLW9ubGluZS5odG1sIiwiL2VuLXVzL2NyZWF0ZS1hY2NvdW50Lmh0bWwiLCIvZW4tdXMvY3JlYXRlLWFjY291bnQvYWNjb3VudC1tYW5hZ2VtZW50Lmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcuaHRtbCIsIi9lbi11cy9zaGlwcGluZy8yLTMtZGF5Lmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvZmVkZXgtc21hcnRwb3N0Lmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvZ3JvdW5kLmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvaG9tZS1kZWxpdmVyeS5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwtZ3JvdW5kLWNhbmFkYS5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL292ZXJuaWdodC5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL3NhbWUtZGF5Lmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvc2NoZWR1bGUtbWFuYWdlLXBpY2t1cHMuaHRtbCIsIi9lbi11cy9zaGlwcGluZy9zZXJ2aWNlcy5odG1sIiwiL2VuLXVzL2N1c3RvbWVyLXN1cHBvcnQuaHRtbCIsIi9lbi11cy9jdXN0b21lci1zdXBwb3J0L2NsYWltcy5odG1sIiwiL2VuLXVzL3NlcnZpY2UtZ3VpZGUuaHRtbCIsIi9lbi11cy9zZXJ2aWNlLWd1aWRlL3BpY2t1cC1kZWxpdmVyeS5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL21vYmlsZS5odG1sIiwiL2VuLXVzL2ZhcS9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvc3RvcmUvc2hpcHBpbmctc2VydmljZXMuaHRtbCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwiLCIvZW4tdXMvcHJpbnRpbmcvb25saW5lLXByaW50aW5nLmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvc3RvcmUvYWxsLWxvY2F0aW9uLXR5cGVzLmh0bWwiLCIvZW4tdHcvY2FtcGFpZ24vZ2V0c3RhcnRlZC5odG1sIiwiL3poLXR3L2NhbXBhaWduL2dldHN0YXJ0ZWQuaHRtbCIsIi9lbi1qcC9vbmxpbmUvc2hpcHBpbmcuaHRtbCIsIi9lbi1qcC9vbmxpbmUvc2hpcHBpbmcuaHRtbCMvc2hpcG1lbnQiLCIvamEtanAvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tdXMvY3VzdG9tZXItc3VwcG9ydC9ob3ctdG8vZG9vci10YWcuaHRtbCIsIi9lbi11cy9jdXN0b21lci1zdXBwb3J0L2hvdy10by9zY2hlZHVsZS1hLXBpY2t1cC5odG1sIiwiL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwuaHRtbCIsIi9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsL2V4cG9ydC5odG1sIiwiL2VuLWF1L29ubGluZS9zaGlwcGluZy5odG1sIiwiL2VuLW56L29ubGluZS9zaGlwcGluZy5odG1sIiwiL2VuLWF1L2NhbXBhaWduL3NtYWxsLWJ1c2luZXNzLmh0bWwiLCIvZW4tbnovY2FtcGFpZ24vc21hbGwtYnVzaW5lc3MuaHRtbCIsIi9lbi11cy9vbmxpbmUvcmF0aW5nLmh0bWwiLCIvemgtaGsvb3Blbi1hY2NvdW50Lmh0bWwiLCIvZW4taGsvb3Blbi1hY2NvdW50Lmh0bWwiLCIvemgtY24vY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwiLCIvemgtdHcvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwiLCIvamEtanAvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwiLCIva28ta3IvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwiLCIvZW4tY2Evc21hbGwtYnVzaW5lc3MuaHRtbCIsIi9mci1jYS9zbWFsbC1idXNpbmVzcy5odG1sIiwiL2VuLWF1L2JpbGxpbmcuaHRtbCIsIi9lbi1ndS9iaWxsaW5nLmh0bWwiLCIvZW4taGsvYmlsbGluZy5odG1sIiwiL3poLWhrL2JpbGxpbmcuaHRtbCIsIi9lbi1qcC9iaWxsaW5nLmh0bWwiLCIvamEtanAvYmlsbGluZy5odG1sIiwiL2VuLWtyL2JpbGxpbmcuaHRtbCIsIi9rby1rci9iaWxsaW5nLmh0bWwiLCIvZW4tbW8vYmlsbGluZy5odG1sIiwiL2VuLW15L2JpbGxpbmcuaHRtbCIsIi9lbi1uei9iaWxsaW5nLmh0bWwiLCIvZW4tcGgvYmlsbGluZy5odG1sIiwiL2VuLXNnL2JpbGxpbmcuaHRtbCIsIi9lbi10dy9iaWxsaW5nLmh0bWwiLCIvemgtdHcvYmlsbGluZy5odG1sIiwiL2VuLXRoL2JpbGxpbmcuaHRtbCIsIi90aC10aC9iaWxsaW5nLmh0bWwiLCIvZW4tdXMvZGV2ZWxvcGVyLmh0bWwiLCIvZW4tdXMvZGV2ZWxvcGVyL3dlYi1zZXJ2aWNlcy5odG1sIiwiL2VuLXVzL2RldmVsb3Blci93ZWItc2VydmljZXMvcHJvY2Vzcy5odG1sIiwiL2VuLWNhL2NvbnRhY3QtdXMuaHRtbCIsIi9mci1jYS9jb250YWN0LXVzLmh0bWwiLCIvZW4taW4vb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tY24vb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvdGgtdGgvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tdGgvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvemgtaGsvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4taGsvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvemgtY24vb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tYWYvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tYWwvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tZHovb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tYW8vb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tYW0vb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tbXkvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tc2cvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tcGgvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvZW4tYWUvb25saW5lL3NoaXBwaW5nLmh0bWwiLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi10aC8iLCIvc2hpcG1lbnQtaGlzdG9yeS96aC1jbi8iLCIvc2hpcG1lbnQtaGlzdG9yeS96aC1oay8iLCIvc2hpcG1lbnQtaGlzdG9yeS9qYS1qcC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1nYi8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1oay8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1wbC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1pbi8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1ubC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9ubC1ubC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1jbi8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1qcC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9wbC1wbC8iLCIvc2hpcG1lbnQtaGlzdG9yeS90aC10aC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1hdS8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1pZC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9pZC1pZC8iLCIvc2hpcG1lbnQtaGlzdG9yeS9rby1rci8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1rci8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1teS8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1uei8iLCIvc2hpcG1lbnQtaGlzdG9yeS9lbi1zZy8iLCIvZW4tdXMvc2hpcHBpbmcvaW50ZXJuYXRpb25hbC5odG1sIiwiL2VuLXVzL29mZmljZS5odG1sIiwiL2VuLXVzL3NoaXBwaW5nL29uZS1yYXRlLmh0bWwiLCIvZW4tdXMvc2hpcHBpbmcvZnJlaWdodC5odG1sIiwiL2VuLXVzL2hvbWUuaHRtbCJdfX19LCJnVGFnOmJ0bkFXUGFnZUxpc3RNYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsiL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvYnVzaW5lc3MuaHRtbCI6IkFXLTg2MzIzODc5My9hZjVVQ05TVDNia0JFSW4xejVzRCIsIi9lbi11cy9wcmludGluZy9kZXNpZ24tc2VydmljZXMuaHRtbCI6IkFXLTg2MzIzODc5My9FNjhMQ0x5RnZOQUJFSW4xejVzRCIsIi9lbi11cy9wcmludGluZy9zbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzLmh0bWwiOiJBVy04NjMyMzg3OTMvM3oxRENMM2w4OUFCRUluMXo1c0QiLCIvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCI6IkFXLTg2MzIzODc5My9vTmppQ1AyTGhlSUJFSW4xejVzRCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvZG9sbGFyLWdlbmVyYWwtcGljay11cC1kcm9wLW9mZi1wYWNrYWdlLmh0bWwiOiJBVy04NjMyMzg3OTMvNkdlN0NKLUE3LUVCRUluMXo1c0QiLCIvZW4taW4vc2hpcHBpbmcvaW5kdXN0cnktc29sdXRpb25zL2hlYWx0aGNhcmUvY29udGFjdC11cy5odG1sIjoiQVctNjczNjgxODI5LzJZVDNDTV9CNXM0QkVLV2puc0VDIn19fX0sInVzZXI6ZW1haWxJRCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzIixzZXR0aW5nczp7bmFtZToiZXRfcmlkIixjYXNlSW5zZW5zaXRpdmU6ITB9fSx0YXJnZXRlbmFibGVkVXJsTGlzdDp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVyblsiL29ubGluZS9yYXRpbmcuaHRtbCJdfX19LCJhYW06cmVnaW9ucyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4idXMsY2FuLGFwYWMifX19LCJjbGljazpibG9ja0ZsYWciOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pc0Jsb2NrZWQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1fc2F0ZWxsaXRlLmdldFZhcih0KTtpZigwPG4ubGVuZ3RoKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWlmKG5bcl0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpPT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuITA7cmV0dXJuITF9LGlzQmxvY2tlZH19fSwic2VhcmNoOnNwRGF0YSI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcyIsc2V0dGluZ3M6e3BhdGg6IkZEWC5EQVRBTEFZRVIuc2VhcmNoLnJlc3VsdCJ9fSwiUENGOkFsbG93ZWRQcm9kRG9tYWlucyI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm5bInNwYWluLmZlZGV4LmNvbSIsImludGVybmF0aW9uYWxzaGlwcGluZ2Fzc2lzdC52YW4uZmVkZXguY29tIiwid2VibGV0cy5kbXouYXBhYy5mZWRleC5jb20iXX19fSwidmE6Y2Fhc01vYkVuYWJsZWRVcmwiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuWyIvZmVkZXh0cmFjay8iXX19fSwidmVyaXpvbjp0aW1lRnJhbWUiOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9IjE1NzgyNjg3OTkwMDAiLHQ9IiIsbj0hMTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpLF9mZHguaXNMaXZlKGUsdCkmJihuPSEwKSxufX19LCJ0cmFjazpidG5NYXBwaW5nIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsidHJrLWxhbmRpbmdQYWdlMVRyYWNraW5nTnVtYmVyc1ByZXNlbnQiOiJUcmFja2luZyBOdW1iZXJ8VFJBQ0siLCJ0cmstdHJhY2tCeVRDTi1UcmFja0J0biI6IlRyYWNrIGJ5IFRDTnxUUkFDSyIsInRyay1sYW5kaW5ncGFnZS12aWV3UG9kU3VibWl0QnV0dG9uIjoiT2J0YWluIFBPRHxWaWV3IFBPRHxTVUJNSVQiLCJ0cmstdHJhY2tCeVJlZmVyZW5jZS1UcmFja0J0biI6IlRyYWNrIEJ5IFJlZmVyZW5jZXxUUkFDSyIsInRyay1sYW5kaW5nUGFnZS10cmFjay1oZWxwTGluayI6IlRyYWNrfE5FRUQgSEVMUCJ9fX19LCJUYXJnZXQ6YXRfcHJvcGVydHkiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9IiIsdD1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpyZWdpb24iKTtyZXR1cm4idW5kZWZpbmVkIiE9dCYmIiIhPT10JiYoInVzIj09dD9lPSI0YmEwNjVjMC02YjkyLTEzYTUtY2NjOC0yYjhjZmIyMWFiZGEiOiJjYW4iPT10P2U9ImMyNDIxMGZmLThjNjQtOTE2MC0zYTdiLWZkYzQ5ODRhNzQ2MCI6ImFwYWMiPT10P2U9ImViNjQxNmQ3LTBhNjQtOTJkOS0zN2QwLWM2MmQ1YjZlMTZlZCI6ImxhYyI9PXQ/ZT0iYjE3ZTMzMjItYWY1MC1iZjdmLWNiOGItOTBjYTdkYWVjZjQ5IjoibWVpc2EiPT10P2U9IjFlYWVjYWY1LWEzMjQtYzgyZS03ZTBlLTMzZDYyNTFjZmRiOCI6ImV1Ij09dCYmKGU9IjE5MjQyM2VlLWMxYzktNjZkZi04MDRkLTVmYjczNDc1MzViYyIpKSxlfX19LCJ2YTplbmFibGVkQ291bnRyeUxpc3QiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuWyJ1cyIsImpwIiwiY24iLCJjYSIsInNnIiwiYXUiLCJwaCIsIm56IiwiaWQiLCJ2biIsIm15IiwiYnoiLCJhaSIsImFnIiwiZ2YiLCJneSIsInNyIiwiaHQiLCJ6YSIsImluIiwiaGsiLCJ0dyIsImtyIiwidGgiLCJkbSIsIm1zIiwiZ3AiLCJndCIsImJvIiwiZWMiLCJzdiIsImhuIiwibmkiLCJweSIsInBlIiwiYXciLCJicyIsImJiIiwiYm0iLCJicSIsInZnIiwia3kiLCJjdyIsImdkIiwiam0iLCJtZiIsInN4Iiwia24iLCJsYyIsInZjIiwidHQiLCJ0YyIsInZpIiwiYXIiLCJjbCIsImNvIiwiY3IiLCJwYSIsInV5IiwidmUiLCJteCIsInByIiwiZG8iLCJtcSIsImJyIiwiY2giLCJhZSIsInphIl19fX0sImdUYWc6YnRuRENQYWdlTGlzdE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJueyIvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjpbIkRDLTk3NDcxNC9mZWRleDAvZmVkZXgwMDArc3RhbmRhcmQiLCJEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDAyK3N0YW5kYXJkIiwiREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwNCtzdGFuZGFyZCIsIkRDLTk3NDcxNC9mZWRleDAvZmVkZXgwMDYrc3RhbmRhcmQiXSwiL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCI6WyJEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDAxK3N0YW5kYXJkIiwiREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwMytzdGFuZGFyZCIsIkRDLTk3NDcxNC9mZWRleDAvZmVkZXgwMDUrc3RhbmRhcmQiLCJEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDA3K3N0YW5kYXJkIl0sIi9lbi1oay9jYW1wYWlnbi9yZXRhaWxmcmVpZ2h0Lmh0bWwiOiJEQy01NjY3MzAwL2Z5MjBfMC9mZWRleDAwMytzdGFuZGFyZCIsIi96aC1oay9jYW1wYWlnbi9yZXRhaWxmcmVpZ2h0Lmh0bWwiOiJEQy01NjY3MzAwL2Z5MjBfMC9mZWRleDAwMStzdGFuZGFyZCIsIi9lbi1teS9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCI6IkRDLTk4MTEzMTMvaW52bWVkaWEvbXlfcGUwK3N0YW5kYXJkIiwiL2VuLW15L29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCI6IkRDLTk4MTEzMTMvaW52bWVkaWEvbXlfY28wK3N0YW5kYXJkIiwiL2VuLWF1L29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sIjoiREMtOTgxMTMxMy9pbnZtZWRpYS9hdV9wZTArc3RhbmRhcmQiLCIvZW4tYXUvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sIjoiREMtOTgxMTMxMy9pbnZtZWRpYS9hdV9jbzArc3RhbmRhcmQiLCIvZW4tbnovb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL256X3BlMCtzdGFuZGFyZCIsIi9lbi1uei9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL256X2NvMCtzdGFuZGFyZCIsIi9lbi10dy9vcGVuLWFjY291bnQvcGVyc29uYWwvZWd1aS1mb3JtLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL3R3X3BlMCtzdGFuZGFyZCIsIi96aC10dy9vcGVuLWFjY291bnQvcGVyc29uYWwvZWd1aS1mb3JtLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL3R3X3BlMCtzdGFuZGFyZCIsIi9lbi10dy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL3R3X2NvMCtzdGFuZGFyZCIsIi96aC10dy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwiOiJEQy05ODExMzEzL2ludm1lZGlhL3R3X2NvMCtzdGFuZGFyZCIsIi9lbi1waC9vcGVuLWFjY291bnQuaHRtbCI6WyIiLCJEQy05ODExMzEzL2ludm1lZGlhL3BoX2NvMCtzdGFuZGFyZCIsIkRDLTk4MTEzMTMvaW52bWVkaWEvcGhfcGUwK3N0YW5kYXJkIl19fX19LGdUYWdEaXNhYmxlTG9jYWxlOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIF9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OmxvY2FsZSIpLm1hdGNoKC9lbl9hdHxkZV9hdHxubF9iZXxmcl9iZXxlbl9iZXxiZ19iZ3xlbl9iZ3xlbl9jeXxjc19jenxlbl9jenxkYV9ka3xlbl9ka3xldF9lZXxlbl9lZXxmaV9maXxlbl9maXxmcl9mcnxlbl9mcnxlbl9kZXxkZV9kZXxlbl9ncnxlbF9ncnxlbl9odXxodV9odXxlbl9pc3xlbl9pZXxlbl9pdHxpdF9pdHxlbl9sdnxsdl9sdnxlbl9saXxlbl9sdHxsdF9sdHxmcl9sdXxlbl9sdXxlbl9tdHxlbl9ub3xub19ub3xlbl9wbHxwbF9wbHxlbl9wdHxwdF9wdHxlbl9yb3xyb19yb3xlbl9za3xza19za3xlbl9zaXxzbF9zaXxlbl9lc3xlc19lc3xlbl9zZXxzdl9zZXxubF9ubHxlbl9ubHxlbl9nYnxlbl90aHx0aF90aHxlbl9waHxlbl9teS9naSl9fX0sImdUYWc6Y3RhT3JhbmdlRkJQYWdlTGlzdE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJueyIvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvYWcxMzM5ODYwMi5odG1sIjoiSW5pdGlhdGVDaGVja291dCIsIi9lbi11cy9wcmludGluZy9kZXNpZ24tc2VydmljZXMuaHRtbCI6IkN1c3RvbWl6ZVByb2R1Y3QiLCIvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sIjoiQWRkVG9DYXJ0In19fX0sImNvbnRlbnQ6cGFnZVBhdGgiOntkZWZhdWx0VmFsdWU6IiIsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMiLHNldHRpbmdzOntwYXRoOiJGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ucGFnZVBhdGgifX0sbWNvcmdJRDp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiIxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcifX19LFRhcmdldFJlZ2lvbnM6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4idXMsIGNhbiwgYXBhYywgbGFjLCBtZWlzYSwgZXUifX19LCJzZWFyY2g6dGVybSI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzIixzZXR0aW5nczp7bmFtZToicSIsY2FzZUluc2Vuc2l0aXZlOiEwfX0sImdUYWc6VmlkZW9QbGF5SWRMaXN0Ijp7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJue3NnOnsiMTY0ODAwODU0NjE2ODQ5OTMzMSI6IkRDLTIyOTA3OTQvY2FtcGEwL2ZlZGV4MDAwK3N0YW5kYXJkIiwiMTY0ODAwODU0NzEyODAzODQzNiI6IkRDLTIyOTA3OTQvY2FtcGEwL2ZlZGV4MDAxK3N0YW5kYXJkIiwiMTY0ODI4MjIyOTUzODY2MjE0NyI6IkRDLTIyOTA3OTQvY2FtcGEwL2ZlZGV4MDAyK3N0YW5kYXJkIn0sa3I6eyIxNjQ4MDA4NTQ1NjA4NTkxNzE4IjoiREMtODM1ODAwNi9pbnZtZWRpYS9mZWRleDAwcitzdGFuZGFyZCIsIjE2NDgwMDg1MDUyOTI5OTEyNjYiOiJEQy04MzU4MDA2L2ludm1lZGlhL2ZlZGV4MDBzK3N0YW5kYXJkIiwiMTY1MDE4NTcwODQwNjQ0NTU4NSI6IkRDLTgzNTgwMDYvaW52bWVkaWEvZmVkZXgwMHQrc3RhbmRhcmQifSx0dzp7IjE2NDgwMDg0NzA5MDM3NjA2NDAiOiJEQy01NjUzMDIwL2Z5MjBhMC9meTIwXzAwMStzdGFuZGFyZCIsIjE2NDgwMDg0OTQ0MzI4OTEyNTAiOiJEQy01NjUzMDIwL2Z5MjBhMC9meTIwXzAwMitzdGFuZGFyZCIsIjE2NTAxODU3MDg0MDY0NDU1ODUiOiJEQy01NjUzMDIwL2Z5MjBhMC9meTIwXzAwMytzdGFuZGFyZCJ9fX19fSwiZ1RhZzpWaWRlb1BsYXlCdG5JZExpc3QiOnttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm57IjE2NTAxOTAwNTk0MzQ3ODA2MDQiOiJEQy0yMjkwNzk0L2NhbXBhMC9mZWRleDAwK3N0YW5kYXJkIiwiMTY1MDY1NDI5NjQyMzYwNDk3NSI6IkRDLTgzNTgwMDYvaW52bWVkaWEvZmVkZXgwMHUrc3RhbmRhcmQiLCIxNjUwNjU1MDk5NzkyMjY2NzY5IjoiREMtNTY1MzAyMC9meTIwYTAvZnkyMF8wMDQrc3RhbmRhcmQifX19fSwicXVhbHRyaWNzOnBhZ2VOYW1lIjp7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuWyJmY3IvY3JlYXRlLW5ldy1yZXBvcnQiLCJmY3Ivdmlldy1yZXBvcnQtc3RhdHVzIiwiZmNyL3ZpZXctcmVjdXJyaW5nLXJlcG9ydCJdfX19LCJ0YWdJRDpjb250ZW50U3F1YXJlIjp7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKSwid3d3LmZlZGV4LmNvbSI9PT1fZmR4LnBjZlV0aWwoKT8iOWMwNzJlYmQtMGQ5YS00YjM3LTllNTQtYmEwYzNiYjA1ODhkIjoiMjNhOWMyZjgtYWViNC00NTRjLWJlMzctODg2MTI4NWU5ZDBjIn19fSwiY29udGVudDpsYW5ndWFnZSI6e2RlZmF1bHRWYWx1ZToiIixmb3JjZUxvd2VyQ2FzZTohMCxjbGVhblRleHQ6ITAsc3RvcmFnZUR1cmF0aW9uOiJwYWdldmlldyIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMiLHNldHRpbmdzOntwYXRoOiJGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ubGFuZ3VhZ2UifX0sInVzZXI6dXNlci1hZ2VudCI6e2RlZmF1bHRWYWx1ZToiIixzdG9yYWdlRHVyYXRpb246InBhZ2V2aWV3Iixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcyIsc2V0dGluZ3M6e3BhdGg6Im5hdmlnYXRvci51c2VyQWdlbnQifX0sImdUYWc6YnRuT3JhbmdlRENQYWdlTGlzdE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJue3NpZ25VcENvbnRpbnVlQnV0dG9uOiJEQy00MTkxMjYzL2ZkbWVuMC9mZG0taTArc3RhbmRhcmQiLHN1Ym1pdFBpbkJ1dHRvbjoiREMtNDE5MTI2My9mZG1lbjAvZmRtLWMwK3N0YW5kYXJkIn19fX0sdmVyaXpvbkJ0bkNsaWNrTWFwcGluZzp7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJueyJGb3JtfEVOLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCI6WzEwMTQ1NjcyLCJGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9FTiJdLCJGb3JtfEZSLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCI6WzEwMTQ1NjgzLCJGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9GUiJdLCJGb3JtfEZSLUZyZWlnaHQgUXVvdGUiOlsxMDE0NTY4MywiRmVkRXhfSGVhdnl3ZWlnaHRfRnJlaWdodF9RdW90ZV9CdXR0b25fRlIiXSwiRm9ybXxGcmVpZ2h0IFF1b3RlIHdpdGggQWNjb3VudCI6WzEwMTQ1NjcyLCJGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9FTiJdLCJGb3JtfEJleW9uZCB0aGUgQnV5IEJ1dHRvbi1GUiI6WzEwMTQ3NjMwLCJGZWRFeF9lQ29tbWVyY2VfR0VUIE5PVyBCdXR0b25fRlIiXSwiRm9ybXxCZXlvbmQgdGhlIEJ1eSBCdXR0b24iOlsxMDE0NzYyOSwiRmVkRXhfZUNvbW1lcmNlX0dFVCBOT1cgQnV0dG9uX0VOIl0sImxpbmt8U3RhcnQgeW91ciBxdW90ZSI6WzEwMTQ5NjI5LCJGZWRFeF9IZWF2eXdlaWdodF9CdXR0b25fTm9BY2NfRU4iXSwibGlua3xDb21tZW5jZXogdm90cmUgZXN0aW1hdGlvbiI6WzEwMTQ5NjMwLCJGZWRFeF9IZWF2eXdlaWdodF9CdXR0b25fTm9BY2NfRlIiXX19fX0sInRyYWRlZGVzazpidG5DbGlja1BhZ2VMaXN0TWFwcGluZyI6e3N0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybnsibGlua3xzaWduIHVwIGZvciBmcmVlIjoiLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svcHhsLz9hZHY9c3VlbnR2YmEmY3Q9MDpsYW50aTZkJmZtdD0zIiwibGlua3xmaW5kIGEgZG9sbGFyIGdlbmVyYWwiOiIvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOnllOW4xOG4mZm10PTMiLCJoZXJvfGZpbmQgYSB3YWxncmVlbnMgbmVhciB5b3UiOiIvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOnowYTZvbjYmZm10PTMiLCJoZXJvfHNlZSBjdXJyZW50IG9mZmVycyI6Ii8vaW5zaWdodC5hZHNydnIub3JnL3RyYWNrL3B4bC8/YWR2PXN1ZW50dmJhJmN0PTA6OHo0ZmJoNCZmbXQ9MyIsImxpbmt8c2lnbiB1cCBub3ciOiIvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOmtmMDZ2NjEmZm10PTMiLCJsaW5rfG5leHQgdGltZSB1c2UgZmVkZXggZGVsaXZlcnkgbWFuYWdlcnxzaWduIHVwIGZvciBmcmVlIjoiLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svcHhsLz9hZHY9c3VlbnR2YmEmY3Q9MDo5cHluaTZyJmZtdD0zIn19fX0sInZhOm1vYkVuYWJsZWRVcmwiOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9Ii90cmFja2luZy9hZHZhbmNlZC5odG1sIjtyZXR1cm5bIi9lbi11cyIrZSwiL2VuLWNhIitlLCIvZnItY2EiK2UsIi9lbi1jYS9kZWxpdmVyeS1tYW5hZ2VyL3BlcnNvbmFsLmh0bWwiLCIvZnItY2EvZGVsaXZlcnktbWFuYWdlci9wZXJzb25hbC5odG1sIl19fX0sImFhbTpJZFN5bmNEaXNhYmxlIjp7ZGVmYXVsdFZhbHVlOiIiLHN0b3JhZ2VEdXJhdGlvbjoicGFnZXZpZXciLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiJmYWxzZSJ9fX0sImdUYWc6Y3RhT3JhbmdlRENQYWdlTGlzdE1hcHBpbmciOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJueyIvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjoiREMtOTc0NzE0L2ZlZGV4MC9mZWRleDArc3RhbmRhcmQiLCIvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sIjoiREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwK3N0YW5kYXJkIiwiL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCI6IkRDLTQxOTEyNjMvZmRtZW4wL2ZkbWxhMDAwK3N0YW5kYXJkIiwiL2VuLXVzL3ByaW50aW5nL2NvbnN1bWVyLW9mZmVycy5odG1sIjoiREMtNDE5MTI2My9jb25zdTAvZmVkZXgwMCtzdGFuZGFyZCIsIi9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwiOiJEQy00MTkxMjYzL3dhbGdyMC9mZWRleDAwK3N0YW5kYXJkIn19fX19LGV4dGVuc2lvbnM6eyJhZG9iZS1tY2lkIjp7ZGlzcGxheU5hbWU6IkV4cGVyaWVuY2UgQ2xvdWQgSUQgU2VydmljZSIsbW9kdWxlczp7ImFkb2JlLW1jaWQvc3JjL2xpYi9zaGFyZWRNb2R1bGVzL21jaWRJbnN0YW5jZS5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbixnKXsidXNlIHN0cmljdCI7dmFyIHI9bigiQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQiKSxpPW4oIi4uL2NvZGVMaWJyYXJ5L1Zpc2l0b3JBUEkiKSxtPW4oIi4uLy4uL3ZpZXcvdXRpbHMvdGltZVVuaXRzIiksaD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj0vXih0cnVlfGZhbHNlKSQvaS50ZXN0KHQudmFsdWUpP0pTT04ucGFyc2UodC52YWx1ZSk6dC52YWx1ZTtyZXR1cm4gZVt0Lm5hbWVdPW4sZX0se30pfSxhPWZ1bmN0aW9uKGUpe3ZhciB0PWcuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKTtpZigic3RyaW5nIiE9dHlwZW9mIHQub3JnSWQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT3JnIElEIGlzIG5vdCBhIHN0cmluZy4iKTt2YXIgbj1oKHQudmFyaWFibGVzfHxbXSkscj10LmRvZXNPcHRJbkFwcGx5O3ImJigiYm9vbGVhbiI9PXR5cGVvZiByP24uZG9lc09wdEluQXBwbHk9cjp0Lm9wdEluQ2FsbGJhY2smJihuLmRvZXNPcHRJbkFwcGx5PXQub3B0SW5DYWxsYmFjaykpO3ZhciBpPXQuaXNPcHRJblN0b3JhZ2VFbmFibGVkO2kmJihuLmlzT3B0SW5TdG9yYWdlRW5hYmxlZD1pKTt2YXIgYT10Lm9wdEluQ29va2llRG9tYWluO2EmJihuLm9wdEluQ29va2llRG9tYWluPWEpO3ZhciBvPXQub3B0SW5TdG9yYWdlRXhwaXJ5O2lmKG8pe3ZhciBzPXQudGltZVVuaXQ7aWYocyYmbVtzXSl7dmFyIGM9byptW3NdO24ub3B0SW5TdG9yYWdlRXhwaXJ5PWN9fWVsc2UhMD09PWkmJihuLm9wdEluU3RvcmFnZUV4cGlyeT0zMzY5NmUzKTt2YXIgdT10LnByZXZpb3VzUGVybWlzc2lvbnM7dSYmKG4ucHJldmlvdXNQZXJtaXNzaW9ucz11KTt2YXIgbD10LnByZU9wdEluQXBwcm92YWxzO2lmKGwpbi5wcmVPcHRJbkFwcHJvdmFscz1sO2Vsc2V7dmFyIGQ9dC5wcmVPcHRJbkFwcHJvdmFsSW5wdXQ7ZCYmKG4ucHJlT3B0SW5BcHByb3ZhbHM9ZCl9dmFyIGY9dC5pc0lhYkNvbnRleHQ7ZiYmKG4uaXNJYWJDb250ZXh0PWYpO3ZhciBwPWUuZ2V0SW5zdGFuY2UodC5vcmdJZCxuKTtyZXR1cm4gZy5sb2dnZXIuaW5mbygnQ3JlYXRlZCBpbnN0YW5jZSB1c2luZyBvcmdJZDogIicrdC5vcmdJZCsnIicpLGcubG9nZ2VyLmluZm8oIlNldCB2YXJpYWJsZXM6ICIrSlNPTi5zdHJpbmdpZnkobikpLHAuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24oZSl7Zy5sb2dnZXIuaW5mbygiT2J0YWluZWQgTWFya2V0aW5nIENsb3VkIFZpc2l0b3IgSWQ6ICIrZSl9LCEwKSxwfSxvPWZ1bmN0aW9uKHQpe3JldHVybihnLmdldEV4dGVuc2lvblNldHRpbmdzKCkucGF0aEV4Y2x1c2lvbnN8fFtdKS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlSXNSZWdleD9uZXcgUmVnRXhwKGUudmFsdWUsImkiKS50ZXN0KHQpOmUudmFsdWU9PT10fSl9LHM9bnVsbDtfc2F0ZWxsaXRlLmdldFZpc2l0b3JJZD1mdW5jdGlvbigpe3JldHVybiBzfSxvKHIubG9jYXRpb24ucGF0aG5hbWUpP2cubG9nZ2VyLndhcm4oIk1DSUQgbGlicmFyeSBub3QgbG9hZGVkLiBPbmUgb2YgdGhlIHBhdGggZXhjbHVzaW9ucyBtYXRjaGVzIHRoZSBjdXJyZW50IHBhdGguIik6cz1hKGkpLGUuZXhwb3J0cz1zfSxuYW1lOiJtY2lkLWluc3RhbmNlIixzaGFyZWQ6ITB9LCJhZG9iZS1tY2lkL3NyYy9saWIvY29kZUxpYnJhcnkvVmlzaXRvckFQSS5qcyI6e3NjcmlwdDpmdW5jdGlvbihlKXtlLmV4cG9ydHM9KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHEoZSl7cmV0dXJuKHE9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBlKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiB0KCl7cmV0dXJue2NhbGxiYWNrczp7fSxhZGQ6ZnVuY3Rpb24oZSx0KXt0aGlzLmNhbGxiYWNrc1tlXT10aGlzLmNhbGxiYWNrc1tlXXx8W107dmFyIG49dGhpcy5jYWxsYmFja3NbZV0ucHVzaCh0KS0xLHI9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyLmNhbGxiYWNrc1tlXS5zcGxpY2UobiwxKX19LGV4ZWN1dGU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmNhbGxiYWNrc1tlXSl7dD0odD12b2lkIDA9PT10P1tdOnQpaW5zdGFuY2VvZiBBcnJheT90Olt0XTt0cnl7Zm9yKDt0aGlzLmNhbGxiYWNrc1tlXS5sZW5ndGg7KXt2YXIgbj10aGlzLmNhbGxiYWNrc1tlXS5zaGlmdCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkobnVsbCx0KTpuIGluc3RhbmNlb2YgQXJyYXkmJm5bMV0uYXBwbHkoblswXSx0KX1kZWxldGUgdGhpcy5jYWxsYmFja3NbZV19Y2F0Y2goZSl7fX19LGV4ZWN1dGVBbGw6ZnVuY3Rpb24obixlKXsoZXx8biYmIVcuaXNPYmplY3RFbXB0eShuKSkmJk9iamVjdC5rZXlzKHRoaXMuY2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCE9PW5bZV0/bltlXToiIjt0aGlzLmV4ZWN1dGUoZSx0KX0sdGhpcyl9LGhhc0NhbGxiYWNrczpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKE9iamVjdC5rZXlzKHRoaXMuY2FsbGJhY2tzKS5sZW5ndGgpfX19ZnVuY3Rpb24gdShlLHQsbil7dmFyIHI9bnVsbD09ZT92b2lkIDA6ZVt0XTtyZXR1cm4gdm9pZCAwPT09cj9uOnJ9ZnVuY3Rpb24gaShlKXtmb3IodmFyIHQ9L15cZCskLyxuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKCF0LnRlc3QoZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYShlLHQpe2Zvcig7ZS5sZW5ndGg8dC5sZW5ndGg7KWUucHVzaCgiMCIpO2Zvcig7dC5sZW5ndGg8ZS5sZW5ndGg7KXQucHVzaCgiMCIpfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9cGFyc2VJbnQoZVtuXSwxMCksaT1wYXJzZUludCh0W25dLDEwKTtpZihpPHIpcmV0dXJuIDE7aWYocjxpKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIG4oZSx0KXtpZihlPT09dClyZXR1cm4gMDt2YXIgbj1lLnRvU3RyaW5nKCkuc3BsaXQoIi4iKSxyPXQudG9TdHJpbmcoKS5zcGxpdCgiLiIpO3JldHVybiBpKG4uY29uY2F0KHIpKT8oYShuLHIpLG8obixyKSk6TmFOfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGU9PT1PYmplY3QoZSkmJjA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh9ZnVuY3Rpb24gYyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIEFycmF5JiZlLmxlbmd0aH1mdW5jdGlvbiByKGUsdCl7dmFyIG49MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1lP2FyZ3VtZW50c1swXToiIixyPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD9hcmd1bWVudHNbMV06ZnVuY3Rpb24oKXtyZXR1cm4hMH07dGhpcy5sb2c9ZmUoImxvZyIsbixyKSx0aGlzLndhcm49ZmUoIndhcm4iLG4sciksdGhpcy5lcnJvcj1mZSgiZXJyb3IiLG4scil9ZnVuY3Rpb24gaihlLHQpe3ZhciBpPSgwPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWU/YXJndW1lbnRzWzBdOnt9KS5jb29raWVOYW1lLGE9KDE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD9hcmd1bWVudHNbMV06e30pLmNvb2tpZXM7aWYoIWl8fCFhKXJldHVybntnZXQ6RGUsc2V0OkRlLHJlbW92ZTpEZX07dmFyIG89e3JlbW92ZTpmdW5jdGlvbigpe2EucmVtb3ZlKGkpfSxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1hLmdldChpKSx0PXt9O3RyeXt0PUpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7dD17fX1yZXR1cm4gdH0sc2V0OmZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj1vLmdldCgpLHI9T2JqZWN0LmFzc2lnbihuLGUpO2Euc2V0KGksSlNPTi5zdHJpbmdpZnkocikse2RvbWFpbjp0Lm9wdEluQ29va2llRG9tYWlufHwiIixjb29raWVMaWZldGltZTp0Lm9wdEluU3RvcmFnZUV4cGlyeXx8MzQxOWU0LGV4cGlyZXM6ITB9KX19O3JldHVybiBvfWZ1bmN0aW9uIGwoZSl7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLm1lc3NhZ2U9ZSwiZnVuY3Rpb24iPT10eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPW5ldyBFcnJvcihlKS5zdGFja31mdW5jdGlvbiBkKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPXZlKGUpO3JldHVybiBuLmxlbmd0aD9uLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiEhdFtlXX0pOmJlKHQpfWZ1bmN0aW9uIHIoKXtPKFQpLFAocmUuQ09NUExFVEUpLHgoQy5zdGF0dXMsQy5wZXJtaXNzaW9ucyksdSYmXy5zZXQoQy5wZXJtaXNzaW9ucyx7b3B0SW5Db29raWVEb21haW46bCxvcHRJblN0b3JhZ2VFeHBpcnk6ZH0pLGsuZXhlY3V0ZShqZSl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigheWUoZSkpdGhyb3cgbmV3IEVycm9yKCJbT3B0SW5dIEludmFsaWQgY2F0ZWdvcnkoLWllcykuIFBsZWFzZSB1c2UgdGhlIGBPcHRJbi5DYXRlZ29yaWVzYCBlbnVtLiIpO3JldHVybiBQKHJlLkNIQU5HRUQpLE9iamVjdC5hc3NpZ24oVCxfZSh2ZShlKSxuKSksdHx8cigpLEN9fXZhciBhPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09ZT9hcmd1bWVudHNbMF06e30sbz1hLmRvZXNPcHRJbkFwcGx5LHM9YS5wcmV2aW91c1Blcm1pc3Npb25zLGM9YS5wcmVPcHRJbkFwcHJvdmFscyx1PWEuaXNPcHRJblN0b3JhZ2VFbmFibGVkLGw9YS5vcHRJbkNvb2tpZURvbWFpbixkPWEub3B0SW5TdG9yYWdlRXhwaXJ5LGY9YS5pc0lhYkNvbnRleHQscD0oMTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10P2FyZ3VtZW50c1sxXTp7fSkuY29va2llcyxnPUFlKHMpO1NlKGcsIkludmFsaWQgYHByZXZpb3VzUGVybWlzc2lvbnNgISIpLFNlKGMsIkludmFsaWQgYHByZU9wdEluQXBwcm92YWxzYCEiKTt2YXIgbSxoLHYsYix5LF89aih7Y29va2llTmFtZToiYWRvYmV1anMtb3B0aW4ifSx7Y29va2llczpwfSksQz10aGlzLHg9VShDKSxrPXVlKCksRT1rZShnKSxJPWtlKGMpLHc9dT9fLmdldCgpOnt9LEQ9e30sQT0oeT13LEVlKEUpfHx5JiZFZSh5KT9yZS5DT01QTEVURTpyZS5QRU5ESU5HKSxTPShtPUksaD1FLHY9dyxiPV9lKGNlLCFvKSxvP09iamVjdC5hc3NpZ24oe30sYixtLGgsdik6YiksVD1DZShTKSxQPWZ1bmN0aW9uKGUpe3JldHVybiBBPWV9LE89ZnVuY3Rpb24oZSl7cmV0dXJuIFM9ZX07Qy5kZW55PWkoITEpLEMuYXBwcm92ZT1pKCEwKSxDLmRlbnlBbGw9Qy5kZW55LmJpbmQoQyxjZSksQy5hcHByb3ZlQWxsPUMuYXBwcm92ZS5iaW5kKEMsY2UpLEMuaXNBcHByb3ZlZD1mdW5jdGlvbihlKXtyZXR1cm4gbihlLEMucGVybWlzc2lvbnMpfSxDLmlzUHJlQXBwcm92ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSxJKX0sQy5mZXRjaFBlcm1pc3Npb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG49MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10JiZhcmd1bWVudHNbMV0scj1uP0Mub24ocmUuQ09NUExFVEUsZSk6RGU7cmV0dXJuIW98fG8mJkMuaXNDb21wbGV0ZXx8Yz9lKEMucGVybWlzc2lvbnMpOm58fGsuYWRkKGplLGZ1bmN0aW9uKCl7cmV0dXJuIGUoQy5wZXJtaXNzaW9ucyl9KSxyfSxDLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Qy5zdGF0dXM9PT1yZS5DSEFOR0VEJiZyKCl9LEMucmVnaXN0ZXJQbHVnaW49ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLm5hbWV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLm9uUmVnaXN0ZXIpdGhyb3cgbmV3IEVycm9yKExlKTtEW2UubmFtZV18fChEW2UubmFtZV09ZSkub25SZWdpc3Rlci5jYWxsKGUsQyl9LEMuZXhlY3V0ZT1PZShEKSxDLm1lbW9pemVDb250ZW50PWZ1bmN0aW9uKGUpe3dlKGUpJiZfLnNldChlLHtvcHRJbkNvb2tpZURvbWFpbjpsLG9wdEluU3RvcmFnZUV4cGlyeTpkfSl9LEMuZ2V0TWVtb2l6ZWRDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciB0PV8uZ2V0KCk7aWYodClyZXR1cm4gdFtlXX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQyx7cGVybWlzc2lvbnM6e2dldDpmdW5jdGlvbigpe3JldHVybiBTfX0sc3RhdHVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQX19LENhdGVnb3JpZXM6e2dldDpmdW5jdGlvbigpe3JldHVybiBpZX19LGRvZXNPcHRJbkFwcGx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fSxpc1BlbmRpbmc6e2dldDpmdW5jdGlvbigpe3JldHVybiBDLnN0YXR1cz09PXJlLlBFTkRJTkd9fSxpc0NvbXBsZXRlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy5zdGF0dXM9PT1yZS5DT01QTEVURX19LF9fcGx1Z2luczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKEQpfX0saXNJYWJDb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZn19fSl9ZnVuY3Rpb24gZihlLHQpe2Z1bmN0aW9uIG4oKXtpPW51bGwsZS5jYWxsKGUsbmV3IGwoIlRoZSBjYWxsIHRvb2sgbG9uZ2VyIHRoYW4geW91IHdhbnRlZCEiKSl9ZnVuY3Rpb24gcigpe2kmJihjbGVhclRpbWVvdXQoaSksZS5hcHBseShlLGFyZ3VtZW50cykpfWlmKHZvaWQgMD09PXQpcmV0dXJuIGU7dmFyIGk9c2V0VGltZW91dChuLHQpO3JldHVybiByfWZ1bmN0aW9uIHAoKXtpZih3aW5kb3cuX190Y2ZhcGkpcmV0dXJuIHdpbmRvdy5fX3RjZmFwaTt2YXIgZT13aW5kb3c7aWYoZSE9PXdpbmRvdy50b3Ape2Zvcih2YXIgbzshbzspe2U9ZS5wYXJlbnQ7dHJ5e2UuZnJhbWVzLl9fdGNmYXBpTG9jYXRvciYmKG89ZSl9Y2F0Y2goZSl7fWlmKGU9PT13aW5kb3cudG9wKWJyZWFrfWlmKG8pe3ZhciBzPXt9O3JldHVybiB3aW5kb3cuX190Y2ZhcGk9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9TWF0aC5yYW5kb20oKSsiIixhPXtfX3RjZmFwaUNhbGw6e2NvbW1hbmQ6ZSxwYXJhbWV0ZXI6cix2ZXJzaW9uOnQsY2FsbElkOml9fTtzW2ldPW4sby5wb3N0TWVzc2FnZShhLCIqIil9LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRyeXt0PUpTT04ucGFyc2UoZS5kYXRhKX1jYXRjaChlKXt9aWYodC5fX3RjZmFwaVJldHVybil7dmFyIG49dC5fX3RjZmFwaVJldHVybjsiZnVuY3Rpb24iPT10eXBlb2Ygc1tuLmNhbGxJZF0mJihzW24uY2FsbElkXShuLnJldHVyblZhbHVlLG4uc3VjY2VzcyksZGVsZXRlIHNbbi5jYWxsSWRdKX19LCExKSx3aW5kb3cuX190Y2ZhcGl9bWUuZXJyb3IoIl9fdGNmYXBpIG5vdCBmb3VuZCIpfWVsc2UgbWUuZXJyb3IoIl9fdGNmYXBpIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIGcodCxlLG4pe3ZhciByPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09bj9hcmd1bWVudHNbMl06W10saT0hMD09PXQudmVuZG9yLmNvbnNlbnRzW2VdLGE9ci5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4hMD09PXQucHVycG9zZS5jb25zZW50c1tlXX0pO3JldHVybiBpJiZhfWZ1bmN0aW9uIG0oKXt2YXIgbj10aGlzO24ubmFtZT0iaWFiUGx1Z2luIixuLnZlcnNpb249IjAuMC4yIjt2YXIgYSxvPXVlKCkscz17dHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGE6bnVsbH0sYz1mdW5jdGlvbihlLHQpe3ZhciBuPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD9hcmd1bWVudHNbMV06e307cmV0dXJuIHNbZV09bn07bi5mZXRjaENvbnNlbnREYXRhPWZ1bmN0aW9uKGUpe3ZhciB0PWYoZS5jYWxsYmFjayxlLnRpbWVvdXQpO3Uoe2NhbGxiYWNrOnR9KX0sbi5pc0FwcHJvdmVkPWZ1bmN0aW9uKGUpe3ZhciBuPWUuY2FsbGJhY2sscj1lLmNhdGVnb3J5LHQ9ZS50aW1lb3V0O2lmKHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEpcmV0dXJuIG4obnVsbCxnKHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEsYWVbcl0sb2Vbcl0pKTt2YXIgaT1mKGZ1bmN0aW9uKGUsdCl7bihlLGcodCxhZVtyXSxvZVtyXSkpfSx0KTt1KHtjYXRlZ29yeTpyLGNhbGxiYWNrOml9KX0sbi5vblJlZ2lzdGVyPWZ1bmN0aW9uKHIpe2E9cjt2YXIgdD1PYmplY3Qua2V5cyhhZSksZT1mdW5jdGlvbihlLG4peyFlJiZuJiYodC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWcobixhZVtlXSxvZVtlXSk7clt0PyJhcHByb3ZlIjoiZGVueSJdKGUsITApfSksci5jb21wbGV0ZSgpKX07bi5mZXRjaENvbnNlbnREYXRhKHtjYWxsYmFjazplfSl9O3ZhciB1PWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2s7aWYocy50cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YSlyZXR1cm4gdChudWxsLHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEpO28uYWRkKCJGRVRDSF9DT05TRU5UX0RBVEEiLHQpLHIoZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1DZShlKSxyPWEuZ2V0TWVtb2l6ZWRDb250ZW50KCJpYWJDb25zZW50SGFzaCIpLGk9Z2Uobi50Y1N0cmluZykudG9TdHJpbmcoMzIpO24uY29uc2VudFN0cmluZz1lLnRjU3RyaW5nLG4uaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsPXIhPT1pLGMoInRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhIixuKSxhLm1lbW9pemVDb250ZW50KHtpYWJDb25zZW50SGFzaDppfSl9by5leGVjdXRlKCJGRVRDSF9DT05TRU5UX0RBVEEiLFtudWxsLHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGFdKX0pfSxyPWZ1bmN0aW9uKGUpe3ZhciB0PVBlKGFlKSxuPXAoKTsiZnVuY3Rpb24iPT10eXBlb2YgbiYmbigiZ2V0VENEYXRhIiwyLGUsdCl9fXZhciB6PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307T2JqZWN0LmFzc2lnbj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyPTE7cjxhcmd1bWVudHMubGVuZ3RoOysrcilmb3IodCBpbiBuPWFyZ3VtZW50c1tyXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKGVbdF09blt0XSk7cmV0dXJuIGV9O3ZhciBoLHYsYix5LEg9e01FU1NBR0VTOntIQU5EU0hBS0U6IkhBTkRTSEFLRSIsR0VUU1RBVEU6IkdFVFNUQVRFIixQQVJFTlRTVEFURToiUEFSRU5UU1RBVEUifSxTVEFURV9LRVlTX01BUDp7TUNNSUQ6Ik1DTUlEIixNQ0FJRDoiTUNBSUQiLE1DQUFNQjoiTUNBQU1CIixNQ0FBTUxIOiJNQ0FBTUxIIixNQ09QVE9VVDoiTUNPUFRPVVQiLENVU1RPTUVSSURTOiJDVVNUT01FUklEUyJ9LEFTWU5DX0FQSV9NQVA6e01DTUlEOiJnZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCIsTUNBSUQ6ImdldEFuYWx5dGljc1Zpc2l0b3JJRCIsTUNBQU1COiJnZXRBdWRpZW5jZU1hbmFnZXJCbG9iIixNQ0FBTUxIOiJnZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQiLE1DT1BUT1VUOiJpc09wdGVkT3V0IixBTExGSUVMRFM6ImdldFZpc2l0b3JWYWx1ZXMifSxTWU5DX0FQSV9NQVA6e0NVU1RPTUVSSURTOiJnZXRDdXN0b21lcklEcyJ9LEFMTF9BUElTOntNQ01JRDoiZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQiLE1DQUFNQjoiZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiIsTUNBQU1MSDoiZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50IixNQ09QVE9VVDoiaXNPcHRlZE91dCIsTUNBSUQ6ImdldEFuYWx5dGljc1Zpc2l0b3JJRCIsQ1VTVE9NRVJJRFM6ImdldEN1c3RvbWVySURzIixBTExGSUVMRFM6ImdldFZpc2l0b3JWYWx1ZXMifSxGSUVMREdST1VQX1RPX0ZJRUxEOntNQzoiTUNNSUQiLEE6Ik1DQUlEIixBQU06Ik1DQUFNQiJ9LEZJRUxEUzp7TUNNSUQ6Ik1DTUlEIixNQ09QVE9VVDoiTUNPUFRPVVQiLE1DQUlEOiJNQ0FJRCIsTUNBQU1MSDoiTUNBQU1MSCIsTUNBQU1COiJNQ0FBTUIifSxBVVRIX1NUQVRFOntVTktOT1dOOjAsQVVUSEVOVElDQVRFRDoxLExPR0dFRF9PVVQ6Mn0sT1BUX09VVDp7R0xPQkFMOiJnbG9iYWwifX0sXz1ILlNUQVRFX0tFWVNfTUFQLEM9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gcigpe31mdW5jdGlvbiBpKG4scil7dmFyIGk9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hKDAsbiksdD17fTtyZXR1cm4gdFtuXT1lLGkuc2V0U3RhdGVBbmRQdWJsaXNoKHQpLHIoZSksZX19dGhpcy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD1mdW5jdGlvbihlKXtlPWV8fHI7dmFyIHQ9dGhpcy5maW5kRmllbGQoXy5NQ01JRCxlKSxuPWkuY2FsbCh0aGlzLF8uTUNNSUQsZSk7cmV0dXJuIHZvaWQgMCE9PXQ/dDpuKCl9LHRoaXMuZ2V0VmlzaXRvclZhbHVlcz1mdW5jdGlvbih0KXt0aGlzLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uKGUpe3Qoe01DTUlEOmV9KX0pfX0seD1ILk1FU1NBR0VTLGs9SC5BU1lOQ19BUElfTUFQLEU9SC5TWU5DX0FQSV9NQVAsST1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gYShlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2FsbGJhY2tSZWdpc3RyeS5hZGQoZSx0KSxuLm1lc3NhZ2VQYXJlbnQoeC5HRVRTVEFURSksIiJ9fWZ1bmN0aW9uIGUocil7dGhpc1trW3JdXT1mdW5jdGlvbihlKXtlPWV8fGk7dmFyIHQ9dGhpcy5maW5kRmllbGQocixlKSxuPWEuY2FsbCh0aGlzLHIsZSk7cmV0dXJuIHZvaWQgMCE9PXQ/dDpuKCl9fWZ1bmN0aW9uIHQoZSl7dGhpc1tFW2VdXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmRGaWVsZChlLGkpfHx7fX19T2JqZWN0LmtleXMoaykuZm9yRWFjaChlLHRoaXMpLE9iamVjdC5rZXlzKEUpLmZvckVhY2godCx0aGlzKX0sdz1ILkFTWU5DX0FQSV9NQVAsRD1mdW5jdGlvbigpe09iamVjdC5rZXlzKHcpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpc1t3W3RdXT1mdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrUmVnaXN0cnkuYWRkKHQsZSl9fSx0aGlzKX0sVz0oZnVuY3Rpb24oZSx0KXt0LmlzT2JqZWN0RW1wdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1PYmplY3QoZSkmJjA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh9LHQuaXNWYWx1ZUVtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiIiPT09ZXx8dC5pc09iamVjdEVtcHR5KGUpfTt2YXIgbj1mdW5jdGlvbigpe3ZhciBlPW5hdmlnYXRvci5hcHBOYW1lLHQ9bmF2aWdhdG9yLnVzZXJBZ2VudDtyZXR1cm4iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIj09PWV8fDA8PXQuaW5kZXhPZigiTVNJRSAiKXx8MDw9dC5pbmRleE9mKCJUcmlkZW50LyIpJiYwPD10LmluZGV4T2YoIldpbmRvd3MgTlQgNiIpfTt0LmdldEllVmVyc2lvbj1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGU/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm4oKT83Om51bGx9LHQuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbih0KX0sdC5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT09cShlKSYmITE9PT1BcnJheS5pc0FycmF5KGUpfSx0LmRlZmluZUdsb2JhbE5hbWVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRvYmU9dC5pc09iamVjdCh3aW5kb3cuYWRvYmUpP3dpbmRvdy5hZG9iZTp7fSx3aW5kb3cuYWRvYmV9LHQucGx1Y2s9ZnVuY3Rpb24obixlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gblt0XSYmKGVbdF09blt0XSksZX0sT2JqZWN0LmNyZWF0ZShudWxsKSl9LHQucGFyc2VPcHRPdXQ9ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PW4sZS5kX29wdG91dCYmZS5kX29wdG91dCBpbnN0YW5jZW9mIEFycmF5JiYodD1lLmRfb3B0b3V0LmpvaW4oIiwiKSkpO3ZhciByPXBhcnNlSW50KGUuZF9vdHRsLDEwKTtyZXR1cm4gaXNOYU4ocikmJihyPTcyMDApLHtvcHRPdXQ6dCxkX290dGw6cn19LHQubm9ybWFsaXplQm9vbGVhbj1mdW5jdGlvbihlKXt2YXIgdD1lO3JldHVybiJ0cnVlIj09PWU/dD0hMDoiZmFsc2UiPT09ZSYmKHQ9ITEpLHR9fSh5PXtleHBvcnRzOnt9fSx5LmV4cG9ydHMpLHkuZXhwb3J0cyksQT0oVy5pc09iamVjdEVtcHR5LFcuaXNWYWx1ZUVtcHR5LFcuZ2V0SWVWZXJzaW9uLFcuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0LFcuaXNPYmplY3QsVy5kZWZpbmVHbG9iYWxOYW1lc3BhY2UsVy5wbHVjayxXLnBhcnNlT3B0T3V0LFcubm9ybWFsaXplQm9vbGVhbix0KSxTPUguTUVTU0FHRVMsVD17MDoicHJlZml4IiwxOiJvcmdJRCIsMjoic3RhdGUifSxHPWZ1bmN0aW9uKGEsbyl7dGhpcy5wYXJzZT1mdW5jdGlvbihlKXt0cnl7dmFyIG49e307cmV0dXJuIGUuZGF0YS5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oZSx0KXt2b2lkIDAhPT1lJiYobltUW3RdXT0yIT09dD9lOkpTT04ucGFyc2UoZSkpfSksbn1jYXRjaChlKXt9fSx0aGlzLmlzSW52YWxpZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcnNlKGUpO2lmKCF0fHxPYmplY3Qua2V5cyh0KS5sZW5ndGg8MilyZXR1cm4hMDt2YXIgbj1hIT09dC5vcmdJRCxyPSFvfHxlLm9yaWdpbiE9PW8saT0tMT09PU9iamVjdC5rZXlzKFMpLmluZGV4T2YodC5wcmVmaXgpO3JldHVybiBufHxyfHxpfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQrInwiK2E7biYmbj09PU9iamVjdChuKSYmKHIrPSJ8IitKU09OLnN0cmluZ2lmeShuKSk7dHJ5e2UucG9zdE1lc3NhZ2UocixvKX1jYXRjaChhKXt9fX0sUD1ILk1FU1NBR0VTLE89ZnVuY3Rpb24oZSx0LG4scil7ZnVuY3Rpb24gaShlKXtPYmplY3QuYXNzaWduKHAsZSl9ZnVuY3Rpb24gYShlKXtPYmplY3QuYXNzaWduKHAuc3RhdGUsZSksT2JqZWN0LmFzc2lnbihwLnN0YXRlLkFMTEZJRUxEUyxlKSxwLmNhbGxiYWNrUmVnaXN0cnkuZXhlY3V0ZUFsbChwLnN0YXRlKX1mdW5jdGlvbiBvKGUpe2lmKCFoLmlzSW52YWxpZChlKSl7bT0hMTt2YXIgdD1oLnBhcnNlKGUpO3Auc2V0U3RhdGVBbmRQdWJsaXNoKHQuc3RhdGUpfX1mdW5jdGlvbiBzKGUpeyFtJiZnJiYobT0hMCxoLnNlbmQocixlKSl9ZnVuY3Rpb24gYygpe2kobmV3IEMobi5fZ2VuZXJhdGVJRCkpLHAuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKSxwLmNhbGxiYWNrUmVnaXN0cnkuZXhlY3V0ZUFsbChwLnN0YXRlLCEwKSx6LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHUpfWZ1bmN0aW9uIHUoZSl7aWYoIWguaXNJbnZhbGlkKGUpKXt2YXIgdD1oLnBhcnNlKGUpO209ITEsei5jbGVhclRpbWVvdXQocC5faGFuZHNoYWtlVGltZW91dCksei5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix1KSxpKG5ldyBJKHApKSx6LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLHAuc2V0U3RhdGVBbmRQdWJsaXNoKHQuc3RhdGUpLHAuY2FsbGJhY2tSZWdpc3RyeS5oYXNDYWxsYmFja3MoKSYmcyhQLkdFVFNUQVRFKX19ZnVuY3Rpb24gbCgpe2cmJnBvc3RNZXNzYWdlPyh6LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHUpLHMoUC5IQU5EU0hBS0UpLHAuX2hhbmRzaGFrZVRpbWVvdXQ9c2V0VGltZW91dChjLDI1MCkpOmMoKX1mdW5jdGlvbiBkKCl7ei5zX2NfaW58fCh6LnNfY19pbD1bXSx6LnNfY19pbj0wKSxwLl9jPSJWaXNpdG9yIixwLl9pbD16LnNfY19pbCxwLl9pbj16LnNfY19pbixwLl9pbFtwLl9pbl09cCx6LnNfY19pbisrfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBlKGUpezAhPT1lLmluZGV4T2YoIl8iKSYmImZ1bmN0aW9uIj09dHlwZW9mIG5bZV0mJihwW2VdPWZ1bmN0aW9uKCl7fSl9T2JqZWN0LmtleXMobikuZm9yRWFjaChlKSxwLmdldFN1cHBsZW1lbnRhbERhdGFJRD1uLmdldFN1cHBsZW1lbnRhbERhdGFJRCxwLmlzQWxsb3dlZD1mdW5jdGlvbigpe3JldHVybiEwfX12YXIgcD10aGlzLGc9dC53aGl0ZWxpc3RQYXJlbnREb21haW47cC5zdGF0ZT17QUxMRklFTERTOnt9fSxwLnZlcnNpb249bi52ZXJzaW9uLHAubWFya2V0aW5nQ2xvdWRPcmdJRD1lLHAuY29va2llRG9tYWluPW4uY29va2llRG9tYWlufHwiIjt2YXIgbT0hKHAuX2luc3RhbmNlVHlwZT0iY2hpbGQiKSxoPW5ldyBHKGUsZyk7cC5jYWxsYmFja1JlZ2lzdHJ5PUEoKSxwLmluaXQ9ZnVuY3Rpb24oKXtkKCksZigpLGkobmV3IEQocCkpLGwoKX0scC5maW5kRmllbGQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT1wLnN0YXRlW2VdKXJldHVybiB0KHAuc3RhdGVbZV0pLHAuc3RhdGVbZV19LHAubWVzc2FnZVBhcmVudD1zLHAuc2V0U3RhdGVBbmRQdWJsaXNoPWF9LEw9SC5NRVNTQUdFUyxNPUguQUxMX0FQSVMsVj1ILkFTWU5DX0FQSV9NQVAsUj1ILkZJRUxER1JPVVBfVE9fRklFTEQsWT1mdW5jdGlvbihpLHIpe2Z1bmN0aW9uIGEoKXt2YXIgcj17fTtyZXR1cm4gT2JqZWN0LmtleXMoTSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1NW2VdLG49aVt0XSgpO1cuaXNWYWx1ZUVtcHR5KG4pfHwocltlXT1uKX0pLHJ9ZnVuY3Rpb24gbygpe3ZhciBuPVtdO3JldHVybiBpLl9sb2FkaW5nJiZPYmplY3Qua2V5cyhpLl9sb2FkaW5nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGkuX2xvYWRpbmdbZV0pe3ZhciB0PVJbZV07bi5wdXNoKHQpfX0pLG4ubGVuZ3RoP246bnVsbH1mdW5jdGlvbiB0KG4pe3JldHVybiBmdW5jdGlvbiByKCl7dmFyIGU9bygpO2lmKGUpe3ZhciB0PVZbZVswXV07aVt0XShyLCEwKX1lbHNlIG4oKX19ZnVuY3Rpb24gbihlLHQpe3ZhciBuPWEoKTtyLnNlbmQoZSx0LG4pfWZ1bmN0aW9uIHMoZSl7dShlKSxuKGUsTC5IQU5EU0hBS0UpfWZ1bmN0aW9uIGMoZSl7dChmdW5jdGlvbigpe24oZSxMLlBBUkVOVFNUQVRFKX0pKCl9ZnVuY3Rpb24gdSh0KXtmdW5jdGlvbiBlKGUpe24uY2FsbChpLGUpLHIuc2VuZCh0LEwuUEFSRU5UU1RBVEUse0NVU1RPTUVSSURTOmkuZ2V0Q3VzdG9tZXJJRHMoKX0pfXZhciBuPWkuc2V0Q3VzdG9tZXJJRHM7aS5zZXRDdXN0b21lcklEcz1lfXJldHVybiBmdW5jdGlvbihlKXtyLmlzSW52YWxpZChlKXx8KHIucGFyc2UoZSkucHJlZml4PT09TC5IQU5EU0hBS0U/czpjKShlLnNvdXJjZSl9fSxYPWZ1bmN0aW9uKHIsbil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7YVt0XT1lLCsrbz09PXMmJm4oYSl9fXZhciBhPXt9LG89MCxzPU9iamVjdC5rZXlzKHIpLmxlbmd0aDtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07aWYodC5mbil7dmFyIG49dC5hcmdzfHxbXTtuLnVuc2hpZnQoaShlKSksdC5mbi5hcHBseSh0LmNvbnRleHR8fG51bGwsbil9fSl9LEs9e2dldDpmdW5jdGlvbihlKXtlPWVuY29kZVVSSUNvbXBvbmVudChlKTt2YXIgdD0oIjsiK2RvY3VtZW50LmNvb2tpZSkuc3BsaXQoIiAiKS5qb2luKCI7Iiksbj10LmluZGV4T2YoIjsiK2UrIj0iKSxyPW48MD9uOnQuaW5kZXhPZigiOyIsbisxKTtyZXR1cm4gbjwwPyIiOmRlY29kZVVSSUNvbXBvbmVudCh0LnN1YnN0cmluZyhuKzIrZS5sZW5ndGgscjwwP3QubGVuZ3RoOnIpKX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj11KG4sImNvb2tpZUxpZmV0aW1lIiksaT11KG4sImV4cGlyZXMiKSxhPXUobiwiZG9tYWluIiksbz11KG4sInNlY3VyZSIpPyJTZWN1cmUiOiIiO2lmKGkmJiJTRVNTSU9OIiE9PXImJiJOT05FIiE9PXIpe3ZhciBzPSIiIT09dD9wYXJzZUludChyfHwwLDEwKTotNjA7aWYocykoaT1uZXcgRGF0ZSkuc2V0VGltZShpLmdldFRpbWUoKSsxZTMqcyk7ZWxzZSBpZigxPT09aSl7dmFyIGM9KGk9bmV3IERhdGUpLmdldFllYXIoKTtpLnNldFllYXIoYysyKyhjPDE5MDA/MTkwMDowKSl9fWVsc2UgaT0wO3JldHVybiBlJiYiTk9ORSIhPT1yPyhkb2N1bWVudC5jb29raWU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkrIjsgcGF0aD0vOyIrKGk/IiBleHBpcmVzPSIraS50b0dNVFN0cmluZygpKyI7IjoiIikrKGE/IiBkb21haW49IithKyI7IjoiIikrbyx0aGlzLmdldChlKT09PXQpOjB9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXUodCwiZG9tYWluIik7bj1uPyIgZG9tYWluPSIrbisiOyI6IiIsZG9jdW1lbnQuY29va2llPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPTsgUGF0aD0vOyBFeHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UOyIrbn19LFE9ZnVuY3Rpb24oZSl7dmFyIHQ7IWUmJnoubG9jYXRpb24mJihlPXoubG9jYXRpb24uaG9zdG5hbWUpO3ZhciBuLHI9KHQ9ZSkuc3BsaXQoIi4iKTtmb3Iobj1yLmxlbmd0aC0yOzA8PW47bi0tKWlmKHQ9ci5zbGljZShuKS5qb2luKCIuIiksSy5zZXQoInRlc3QiLCJjb29raWUiLHtkb21haW46dH0pKXJldHVybiBLLnJlbW92ZSgidGVzdCIse2RvbWFpbjp0fSksdDtyZXR1cm4iIn0sJD17Y29tcGFyZTpuLGlzTGVzc1RoYW46ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbihlLHQpPDB9LGFyZVZlcnNpb25zRGlmZmVyZW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIDAhPT1uKGUsdCl9LGlzR3JlYXRlclRoYW46ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxuKGUsdCl9LGlzRXF1YWw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09PW4oZSx0KX19LEY9ISF6LnBvc3RNZXNzYWdlLEo9e3Bvc3RNZXNzYWdlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0xO3QmJihGP24ucG9zdE1lc3NhZ2UoZSx0LnJlcGxhY2UoLyhbXjpdKzpcL1wvW15cL10rKS4qLywiJDEiKSk6dCYmKG4ubG9jYXRpb249dC5yZXBsYWNlKC8jLiokLywiIikrIiMiKyArbmV3IERhdGUrcisrKyImIitlKSl9LHJlY2VpdmVNZXNzYWdlOmZ1bmN0aW9uKHQsbil7dmFyIGU7dHJ5e0YmJih0JiYoZT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIG4mJmUub3JpZ2luIT09bnx8IltvYmplY3QgRnVuY3Rpb25dIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKSYmITE9PT1uKGUub3JpZ2luKSlyZXR1cm4hMTt0KGUpfSksei5hZGRFdmVudExpc3RlbmVyP3pbdD8iYWRkRXZlbnRMaXN0ZW5lciI6InJlbW92ZUV2ZW50TGlzdGVuZXIiXSgibWVzc2FnZSIsZSk6elt0PyJhdHRhY2hFdmVudCI6ImRldGFjaEV2ZW50Il0oIm9ubWVzc2FnZSIsZSkpfWNhdGNoKHQpe319fSxaPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj0iMDEyMzQ1Njc4OSIsaT0iIixhPSIiLG89OCxzPTEwLGM9MTA7aWYoMT09ZSl7Zm9yKHIrPSJBQkNERUYiLHQ9MDt0PDE2O3QrKyluPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvKSxpKz1yLnN1YnN0cmluZyhuLG4rMSksbj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbyksYSs9ci5zdWJzdHJpbmcobixuKzEpLG89MTY7cmV0dXJuIGkrIi0iK2F9Zm9yKHQ9MDt0PDE5O3QrKyluPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpzKSxpKz1yLnN1YnN0cmluZyhuLG4rMSksMD09PXQmJjk9PW4/cz0zOigxPT10fHwyPT10KSYmMTAhPXMmJm48Mj9zPTEwOjI8dCYmKHM9MTApLG49TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmMpLGErPXIuc3Vic3RyaW5nKG4sbisxKSwwPT09dCYmOT09bj9jPTM6KDE9PXR8fDI9PXQpJiYxMCE9YyYmbjwyP2M9MTA6Mjx0JiYoYz0xMCk7cmV0dXJuIGkrYX0sZWU9ZnVuY3Rpb24ocil7Y29uc3QgJF9fX29sZF9iY2MyODkzZDg0ODRlNjI5PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiksJF9fX29sZF81ZGViMDBmMDQ0ODlkNjEzPXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2lmKCRfX19vbGRfYmNjMjg5M2Q4NDg0ZTYyOSkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQuWE1MSHR0cFJlcXVlc3QpO2lmKCRfX19vbGRfNWRlYjAwZjA0NDg5ZDYxMykoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQuWE1MSHR0cFJlcXVlc3QpO3JldHVybiBmdW5jdGlvbigpe3JldHVybntjb3JzTWV0YWRhdGE6KGU9Im5vbmUiLHQ9ITAsInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdCYmWE1MSHR0cFJlcXVlc3Q9PT1PYmplY3QoWE1MSHR0cFJlcXVlc3QpJiYoIndpdGhDcmVkZW50aWFscyJpbiBuZXcgWE1MSHR0cFJlcXVlc3Q/ZT0iWE1MSHR0cFJlcXVlc3QiOiJ1bmRlZmluZWQiIT10eXBlb2YgWERvbWFpblJlcXVlc3QmJlhEb21haW5SZXF1ZXN0PT09T2JqZWN0KFhEb21haW5SZXF1ZXN0KSYmKHQ9ITEpLDA8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHouSFRNTEVsZW1lbnQpLmluZGV4T2YoIkNvbnN0cnVjdG9yIikmJih0PSExKSkse2NvcnNUeXBlOmUsY29yc0Nvb2tpZXNFbmFibGVkOnR9KSxnZXRDT1JTSW5zdGFuY2U6ZnVuY3Rpb24oKXtjb25zdCAkX19fb2xkX2QzOTQ2NDRiMWQ3MzUyMDU9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiKSwkX19fb2xkX2ExNmU2NTNmOGZiMjI2MDk9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiKTt0cnl7aWYoJF9fX29sZF9kMzk0NjQ0YjFkNzM1MjA1KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCk7aWYoJF9fX29sZF9hMTZlNjUzZjhmYjIyNjA5KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIm5vbmUiPT09dGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGU/bnVsbDpuZXcgelt0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZV19LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2lmKCRfX19vbGRfZDM5NDY0NGIxZDczNTIwNSkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19vbGRfZDM5NDY0NGIxZDczNTIwNSk7aWYoJF9fX29sZF9hMTZlNjUzZjhmYjIyNjA5KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX29sZF9hMTZlNjUzZjhmYjIyNjA5KX19LGZpcmVDT1JTOmZ1bmN0aW9uKGEsZSl7ZnVuY3Rpb24gdChlKXt2YXIgdDt0cnl7aWYoKHQ9SlNPTi5wYXJzZShlKSkhPT1PYmplY3QodCkpcmV0dXJuIHZvaWQgby5oYW5kbGVDT1JTRXJyb3IoYSxudWxsLCJSZXNwb25zZSBpcyBub3QgSlNPTiIpfWNhdGNoKGUpe3JldHVybiB2b2lkIG8uaGFuZGxlQ09SU0Vycm9yKGEsZSwiRXJyb3IgcGFyc2luZyByZXNwb25zZSBhcyBKU09OIil9dHJ5e2Zvcih2YXIgbj1hLmNhbGxiYWNrLHI9eixpPTA7aTxuLmxlbmd0aDtpKyspcj1yW25baV1dO3IodCl9Y2F0Y2goZSl7by5oYW5kbGVDT1JTRXJyb3IoYSxlLCJFcnJvciBmb3JtaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIil9fXZhciBvPXRoaXM7ZSYmKGEubG9hZEVycm9ySGFuZGxlcj1lKTt0cnl7dmFyIG49dGhpcy5nZXRDT1JTSW5zdGFuY2UoKTtuLm9wZW4oImdldCIsYS5jb3JzVXJsKyImdHM9IisobmV3IERhdGUpLmdldFRpbWUoKSwhMCksIlhNTEh0dHBSZXF1ZXN0Ij09PXRoaXMuY29yc01ldGFkYXRhLmNvcnNUeXBlJiYobi53aXRoQ3JlZGVudGlhbHM9ITAsbi50aW1lb3V0PXIubG9hZFRpbWVvdXQsbi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT10aGlzLnJlYWR5U3RhdGUmJjIwMD09PXRoaXMuc3RhdHVzJiZ0KHRoaXMucmVzcG9uc2VUZXh0KX0pLG4ub25lcnJvcj1mdW5jdGlvbihlKXtvLmhhbmRsZUNPUlNFcnJvcihhLGUsIm9uZXJyb3IiKX0sbi5vbnRpbWVvdXQ9ZnVuY3Rpb24oZSl7by5oYW5kbGVDT1JTRXJyb3IoYSxlLCJvbnRpbWVvdXQiKX0sbi5zZW5kKCksci5fbG9nLnJlcXVlc3RzLnB1c2goYS5jb3JzVXJsKX1jYXRjaChyKXt0aGlzLmhhbmRsZUNPUlNFcnJvcihhLHIsInRyeS1jYXRjaCIpfX0saGFuZGxlQ09SU0Vycm9yOmZ1bmN0aW9uKGUsdCxuKXtyLkNPUlNFcnJvcnMucHVzaCh7Y29yc0RhdGE6ZSxlcnJvcjp0LGRlc2NyaXB0aW9uOm59KSxlLmxvYWRFcnJvckhhbmRsZXImJigib250aW1lb3V0Ij09PW4/ZS5sb2FkRXJyb3JIYW5kbGVyKCEwKTplLmxvYWRFcnJvckhhbmRsZXIoITEpKX19O3ZhciBlLHR9LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2lmKCRfX19vbGRfYmNjMjg5M2Q4NDg0ZTYyOSkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiLCRfX19vbGRfYmNjMjg5M2Q4NDg0ZTYyOSk7aWYoJF9fX29sZF81ZGViMDBmMDQ0ODlkNjEzKSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX29sZF81ZGViMDBmMDQ0ODlkNjEzKX19LHRlPXtQT1NUX01FU1NBR0VfRU5BQkxFRDohIXoucG9zdE1lc3NhZ2UsREFZU19CRVRXRUVOX1NZTkNfSURfQ0FMTFM6MSxNSUxMSVNfUEVSX0RBWTo4NjRlNSxBRE9CRV9NQzoiYWRvYmVfbWMiLEFET0JFX01DX1NESUQ6ImFkb2JlX21jX3NkaWQiLFZBTElEX1ZJU0lUT1JfSURfUkVHRVg6L15bMC05YS1mQS1GXC1dKyQvLEFET0JFX01DX1RUTF9JTl9NSU46NSxWRVJTSU9OX1JFR0VYOi92VmVyc2lvblx8KChcZCtcLik/KFxkK1wuKT8oXCp8XGQrKSkoPz0kfFx8KS8sRklSU1RfUEFSVFlfU0VSVkVSX0NPT0tJRToic19lY2lkIn0sbmU9ZnVuY3Rpb24oZyx0KXt2YXIgaT16LmRvY3VtZW50O3JldHVybntUSFJPVFRMRV9TVEFSVDozZTQsTUFYX1NZTkNTX0xFTkdUSDo2NDksdGhyb3R0bGVUaW1lclNldDohMSxpZDpudWxsLG9uUGFnZVBpeGVsczpbXSxpZnJhbWVIb3N0Om51bGwsZ2V0SWZyYW1lSG9zdDpmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFswXSsiLy8iK3RbMl19fSxzdWJkb21haW46bnVsbCx1cmw6bnVsbCxnZXRVcmw6ZnVuY3Rpb24oKXt2YXIgZSx0PSJodHRwOi8vZmFzdC4iLG49Ij9kX25zaWQ9IitnLmlkU3luY0NvbnRhaW5lcklEKyIjIitlbmNvZGVVUklDb21wb25lbnQoaS5sb2NhdGlvbi5vcmlnaW4pO3JldHVybiB0aGlzLnN1YmRvbWFpbnx8KHRoaXMuc3ViZG9tYWluPSJub3N1YmRvbWFpbnJldHVybmVkIiksZy5sb2FkU1NMJiYodD1nLmlkU3luY1NTTFVzZUFrYW1haT8iaHR0cHM6Ly9mYXN0LiI6Imh0dHBzOi8vIiksZT10K3RoaXMuc3ViZG9tYWluKyIuZGVtZGV4Lm5ldC9kZXN0NS5odG1sIituLHRoaXMuaWZyYW1lSG9zdD10aGlzLmdldElmcmFtZUhvc3QoZSksdGhpcy5pZD0iZGVzdGluYXRpb25fcHVibGlzaGluZ19pZnJhbWVfIit0aGlzLnN1YmRvbWFpbisiXyIrZy5pZFN5bmNDb250YWluZXJJRCxlfSxjaGVja0RQSWZyYW1lU3JjOmZ1bmN0aW9uKCl7dmFyIGU9Ij9kX25zaWQ9IitnLmlkU3luY0NvbnRhaW5lcklEKyIjIitlbmNvZGVVUklDb21wb25lbnQoaS5sb2NhdGlvbi5ocmVmKTsic3RyaW5nIj09dHlwZW9mIGcuZHBJZnJhbWVTcmMmJmcuZHBJZnJhbWVTcmMubGVuZ3RoJiYodGhpcy5pZD0iZGVzdGluYXRpb25fcHVibGlzaGluZ19pZnJhbWVfIisoZy5fc3ViZG9tYWlufHx0aGlzLnN1YmRvbWFpbnx8KG5ldyBEYXRlKS5nZXRUaW1lKCkpKyJfIitnLmlkU3luY0NvbnRhaW5lcklELHRoaXMuaWZyYW1lSG9zdD10aGlzLmdldElmcmFtZUhvc3QoZy5kcElmcmFtZVNyYyksdGhpcy51cmw9Zy5kcElmcmFtZVNyYytlKX0saWRDYWxsTm90UHJvY2Vzc3NlZDpudWxsLGRvQXR0YWNoSWZyYW1lOiExLHN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWU6ITEsaWZyYW1lSGFzTG9hZGVkOm51bGwsaWZyYW1lSWRDaGFuZ2VkOm51bGwsbmV3SWZyYW1lQ3JlYXRlZDpudWxsLG9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeTpudWxsLGlmcmFtZUxvYWRlZENhbGxiYWNrczpbXSxyZWdpb25DaGFuZ2VkOiExLHRpbWVzUmVnaW9uQ2hhbmdlZDowLHNlbmRpbmdNZXNzYWdlczohMSxtZXNzYWdlczpbXSxtZXNzYWdlc1Bvc3RlZDpbXSxtZXNzYWdlc1JlY2VpdmVkOltdLG1lc3NhZ2VTZW5kaW5nSW50ZXJ2YWw6dGUuUE9TVF9NRVNTQUdFX0VOQUJMRUQ/bnVsbDoxMDAsb25QYWdlRGVzdGluYXRpb25zRmlyZWQ6W10sanNvbkZvckNvbXBhcmlzb246W10sanNvbkR1cGxpY2F0ZXM6W10sanNvbldhaXRpbmc6W10sanNvblByb2Nlc3NlZDpbXSxjYW5TZXRUaGlyZFBhcnR5Q29va2llczohMCxyZWNlaXZlZFRoaXJkUGFydHlDb29raWVzTm90aWZpY2F0aW9uOiExLHJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeTpmdW5jdGlvbigpe3JldHVybiEoZy5pZFN5bmNEaXNhYmxlU3luY3N8fGcuZGlzYWJsZUlkU3luY3N8fGcuaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZ3x8Zy5kaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXN8fGcuZGlzYWJsZVRoaXJkUGFydHlDYWxscyl9LHJlYWR5VG9BdHRhY2hJZnJhbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkeVRvQXR0YWNoSWZyYW1lUHJlbGltaW5hcnkoKSYmKHRoaXMuZG9BdHRhY2hJZnJhbWV8fGcuX2RvQXR0YWNoSWZyYW1lKSYmKHRoaXMuc3ViZG9tYWluJiYibm9zdWJkb21haW5yZXR1cm5lZCIhPT10aGlzLnN1YmRvbWFpbnx8Zy5fc3ViZG9tYWluKSYmdGhpcy51cmwmJiF0aGlzLnN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWV9LGF0dGFjaElmcmFtZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXsocj1pLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpKS5zYW5kYm94PSJhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luIixyLnRpdGxlPSJBZG9iZSBJRCBTeW5jaW5nIGlGcmFtZSIsci5pZD1uLmlkLHIubmFtZT1uLmlkKyJfbmFtZSIsci5zdHlsZS5jc3NUZXh0PSJkaXNwbGF5OiBub25lOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyIsci5zcmM9bi51cmwsbi5uZXdJZnJhbWVDcmVhdGVkPSEwLHQoKSxpLmJvZHkuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gdChlKXtyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7ci5jbGFzc05hbWU9ImFhbUlmcmFtZUxvYWRlZCIsbi5pZnJhbWVIYXNMb2FkZWQ9ITAsbi5maXJlSWZyYW1lTG9hZGVkQ2FsbGJhY2tzKGUpLG4ucmVxdWVzdFRvUHJvY2VzcygpfSl9dGhpcy5zdGFydGVkQXR0YWNoaW5nSWZyYW1lPSEwO3ZhciBuPXRoaXMscj1pLmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpO3I/IklGUkFNRSIhPT1yLm5vZGVOYW1lPyh0aGlzLmlkKz0iXzIiLHRoaXMuaWZyYW1lSWRDaGFuZ2VkPSEwLGUoKSk6KHRoaXMubmV3SWZyYW1lQ3JlYXRlZD0hMSwiYWFtSWZyYW1lTG9hZGVkIiE9PXIuY2xhc3NOYW1lPyh0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeT0hMSx0KCJUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgYWxyZWFkeSBleGlzdHMgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LCBidXQgaGFkbid0IGxvYWRlZCB5ZXQuIikpOih0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeT0hMCx0aGlzLmlmcmFtZUhhc0xvYWRlZD0hMCx0aGlzLmlmcmFtZT1yLHRoaXMuZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrcygiVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGFscmVhZHkgZXhpc3RzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSwgYW5kIGhhZCBsb2FkZWQgYWxyZXNhZHkuIiksdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCkpKTplKCksdGhpcy5pZnJhbWU9cn0sZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrczpmdW5jdGlvbih0KXt0aGlzLmlmcmFtZUxvYWRlZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHttZXNzYWdlOnR8fCJUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgd2FzIGF0dGFjaGVkIGFuZCBsb2FkZWQgc3VjY2Vzc2Z1bGx5LiJ9KX0pLHRoaXMuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzPVtdfSxyZXF1ZXN0VG9Qcm9jZXNzOmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyLmpzb25Gb3JDb21wYXJpc29uLnB1c2goZSksci5qc29uV2FpdGluZy5wdXNoKGUpLHIucHJvY2Vzc1N5bmNPblBhZ2UoZSl9dmFyIG4scj10aGlzO2lmKGU9PT1PYmplY3QoZSkmJmUuaWJzKWlmKG49SlNPTi5zdHJpbmdpZnkoZS5pYnN8fFtdKSx0aGlzLmpzb25Gb3JDb21wYXJpc29uLmxlbmd0aCl7dmFyIGksYSxvLHM9ITE7Zm9yKGk9MCxhPXRoaXMuanNvbkZvckNvbXBhcmlzb24ubGVuZ3RoO2k8YTtpKyspaWYobz10aGlzLmpzb25Gb3JDb21wYXJpc29uW2ldLG49PT1KU09OLnN0cmluZ2lmeShvLmlic3x8W10pKXtzPSEwO2JyZWFrfXM/dGhpcy5qc29uRHVwbGljYXRlcy5wdXNoKGUpOnQoKX1lbHNlIHQoKTtpZigodGhpcy5yZWNlaXZlZFRoaXJkUGFydHlDb29raWVzTm90aWZpY2F0aW9ufHwhdGUuUE9TVF9NRVNTQUdFX0VOQUJMRUR8fHRoaXMuaWZyYW1lSGFzTG9hZGVkKSYmdGhpcy5qc29uV2FpdGluZy5sZW5ndGgpe3ZhciBjPXRoaXMuanNvbldhaXRpbmcuc2hpZnQoKTt0aGlzLnByb2Nlc3MoYyksdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCl9Zy5pZFN5bmNEaXNhYmxlU3luY3N8fGcuZGlzYWJsZUlkU3luY3N8fCF0aGlzLmlmcmFtZUhhc0xvYWRlZHx8IXRoaXMubWVzc2FnZXMubGVuZ3RofHx0aGlzLnNlbmRpbmdNZXNzYWdlc3x8KHRoaXMudGhyb3R0bGVUaW1lclNldHx8KHRoaXMudGhyb3R0bGVUaW1lclNldD0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5tZXNzYWdlU2VuZGluZ0ludGVydmFsPXRlLlBPU1RfTUVTU0FHRV9FTkFCTEVEP251bGw6MTUwfSx0aGlzLlRIUk9UVExFX1NUQVJUKSksdGhpcy5zZW5kaW5nTWVzc2FnZXM9ITAsdGhpcy5zZW5kTWVzc2FnZXMoKSl9LGdldFJlZ2lvbkFuZENoZWNrSWZDaGFuZ2VkOmZ1bmN0aW9uKGUsdCl7dmFyIG49Zy5fZ2V0RmllbGQoIk1DQUFNTEgiKSxyPWUuZF9yZWdpb258fGUuZGNzX3JlZ2lvbjtyZXR1cm4gbj9yJiYoZy5fc2V0RmllbGRFeHBpcmUoIk1DQUFNTEgiLHQpLGcuX3NldEZpZWxkKCJNQ0FBTUxIIixyKSxwYXJzZUludChuLDEwKSE9PXImJih0aGlzLnJlZ2lvbkNoYW5nZWQ9ITAsdGhpcy50aW1lc1JlZ2lvbkNoYW5nZWQrKyxnLl9zZXRGaWVsZCgiTUNTWU5DU09QIiwiIiksZy5fc2V0RmllbGQoIk1DU1lOQ1MiLCIiKSxuPXIpKToobj1yKSYmKGcuX3NldEZpZWxkRXhwaXJlKCJNQ0FBTUxIIix0KSxnLl9zZXRGaWVsZCgiTUNBQU1MSCIsbikpLG58fChuPSIiKSxufSxwcm9jZXNzU3luY09uUGFnZTpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaTtpZigodD1lLmlicykmJnQgaW5zdGFuY2VvZiBBcnJheSYmKG49dC5sZW5ndGgpKWZvcihyPTA7cjxuO3IrKykoaT10W3JdKS5zeW5jT25QYWdlJiZ0aGlzLmNoZWNrRmlyc3RQYXJ0eUNvb2tpZShpLCIiLCJzeW5jT25QYWdlIil9LHByb2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksYSxvPWVuY29kZVVSSUNvbXBvbmVudCxzPSExO2lmKCh0PWUuaWJzKSYmdCBpbnN0YW5jZW9mIEFycmF5JiYobj10Lmxlbmd0aCkpZm9yKHM9ITAscj0wO3I8bjtyKyspaT10W3JdLGE9W28oImlicyIpLG8oaS5pZHx8IiIpLG8oaS50YWd8fCIiKSxXLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChpLnVybHx8W10sIiwiKSxvKGkudHRsfHwiIiksIiIsIiIsaS5maXJlVVJMU3luYz8idHJ1ZSI6ImZhbHNlIl0saS5zeW5jT25QYWdlfHwodGhpcy5jYW5TZXRUaGlyZFBhcnR5Q29va2llcz90aGlzLmFkZE1lc3NhZ2UoYS5qb2luKCJ8IikpOmkuZmlyZVVSTFN5bmMmJnRoaXMuY2hlY2tGaXJzdFBhcnR5Q29va2llKGksYS5qb2luKCJ8IikpKTtzJiZ0aGlzLmpzb25Qcm9jZXNzZWQucHVzaChlKX0sY2hlY2tGaXJzdFBhcnR5Q29va2llOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ic3luY09uUGFnZSI9PT1uLGk9cj8iTUNTWU5DU09QIjoiTUNTWU5DUyI7Zy5fcmVhZFZpc2l0b3IoKTt2YXIgYSxvLHM9Zy5fZ2V0RmllbGQoaSksYz0hMSx1PSExLGw9TWF0aC5jZWlsKChuZXcgRGF0ZSkuZ2V0VGltZSgpL3RlLk1JTExJU19QRVJfREFZKTtzPyhhPXMuc3BsaXQoIioiKSxjPShvPXRoaXMucHJ1bmVTeW5jRGF0YShhLGUuaWQsbCkpLmRhdGFQcmVzZW50LHU9by5kYXRhVmFsaWQsYyYmdXx8dGhpcy5maXJlU3luYyhyLGUsdCxhLGksbCkpOihhPVtdLHRoaXMuZmlyZVN5bmMocixlLHQsYSxpLGwpKX0scHJ1bmVTeW5jRGF0YTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxhLG89ITEscz0hMTtmb3IoaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxhPXBhcnNlSW50KHIuc3BsaXQoIi0iKVsxXSwxMCksci5tYXRjaCgiXiIrdCsiLSIpPyhvPSEwLG48YT9zPSEwOihlLnNwbGljZShpLDEpLGktLSkpOmE8PW4mJihlLnNwbGljZShpLDEpLGktLSk7cmV0dXJue2RhdGFQcmVzZW50Om8sZGF0YVZhbGlkOnN9fSxtYW5hZ2VTeW5jc1NpemU6ZnVuY3Rpb24oZSl7aWYoZS5qb2luKCIqIikubGVuZ3RoPnRoaXMuTUFYX1NZTkNTX0xFTkdUSClmb3IoZS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHBhcnNlSW50KGUuc3BsaXQoIi0iKVsxXSwxMCktcGFyc2VJbnQodC5zcGxpdCgiLSIpWzFdLDEwKX0pO2Uuam9pbigiKiIpLmxlbmd0aD50aGlzLk1BWF9TWU5DU19MRU5HVEg7KWUuc2hpZnQoKX0sZmlyZVN5bmM6ZnVuY3Rpb24oZSx0LG4scixsLGkpe3ZhciBkPXRoaXM7aWYoZSl7aWYoImltZyI9PT10LnRhZyl7dmFyIGEsbyxzLGMsdT10LnVybCxmPWcubG9hZFNTTD8iaHR0cHM6IjoiaHR0cDoiO2ZvcihhPTAsbz11Lmxlbmd0aDthPG87YSsrKXtzPXVbYV0sYz0vXlwvXC8vLnRlc3Qocyk7dmFyIHA9bmV3IEltYWdlO3AuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24obyxzLGMsdSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZC5vblBhZ2VQaXhlbHNbb109bnVsbCxnLl9yZWFkVmlzaXRvcigpO3ZhciBlLHQsbixyLGk9Zy5fZ2V0RmllbGQobCksYT1bXTtpZihpKWZvcih0PTAsbj0oZT1pLnNwbGl0KCIqIikpLmxlbmd0aDt0PG47dCsrKShyPWVbdF0pLm1hdGNoKCJeIitzLmlkKyItIil8fGEucHVzaChyKTtkLnNldFN5bmNUcmFja2luZ0RhdGEoYSxzLGMsdSl9fSh0aGlzLm9uUGFnZVBpeGVscy5sZW5ndGgsdCxsLGkpKSxwLnNyYz0oYz9mOiIiKStzLHRoaXMub25QYWdlUGl4ZWxzLnB1c2gocCl9fX1lbHNlIHRoaXMuYWRkTWVzc2FnZShuKSx0aGlzLnNldFN5bmNUcmFja2luZ0RhdGEocix0LGwsaSl9LGFkZE1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZW5jb2RlVVJJQ29tcG9uZW50KGcuX2VuYWJsZUVycm9yUmVwb3J0aW5nPyItLS1kZXN0cHViLWRlYnVnLS0tIjoiLS0tZGVzdHB1Yi0tLSIpO3RoaXMubWVzc2FnZXMucHVzaCgodGUuUE9TVF9NRVNTQUdFX0VOQUJMRUQ/IiI6dCkrZSl9LHNldFN5bmNUcmFja2luZ0RhdGE6ZnVuY3Rpb24oZSx0LG4scil7ZS5wdXNoKHQuaWQrIi0iKyhyK01hdGguY2VpbCh0LnR0bC82MC8yNCkpKSx0aGlzLm1hbmFnZVN5bmNzU2l6ZShlKSxnLl9zZXRGaWVsZChuLGUuam9pbigiKiIpKX0sc2VuZE1lc3NhZ2VzOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49IiIscj1lbmNvZGVVUklDb21wb25lbnQ7dGhpcy5yZWdpb25DaGFuZ2VkJiYobj1yKCItLS1kZXN0cHViLWNsZWFyLWRleHRwLS0tIiksdGhpcy5yZWdpb25DaGFuZ2VkPSExKSx0aGlzLm1lc3NhZ2VzLmxlbmd0aD90ZS5QT1NUX01FU1NBR0VfRU5BQkxFRD8oZT1uK3IoIi0tLWRlc3RwdWItY29tYmluZWQtLS0iKSt0aGlzLm1lc3NhZ2VzLmpvaW4oIiUwMSIpLHRoaXMucG9zdE1lc3NhZ2UoZSksdGhpcy5tZXNzYWdlcz1bXSx0aGlzLnNlbmRpbmdNZXNzYWdlcz0hMSk6KGU9dGhpcy5tZXNzYWdlcy5zaGlmdCgpLHRoaXMucG9zdE1lc3NhZ2UobitlKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZW5kTWVzc2FnZXMoKX0sdGhpcy5tZXNzYWdlU2VuZGluZ0ludGVydmFsKSk6dGhpcy5zZW5kaW5nTWVzc2FnZXM9ITF9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGUpe0oucG9zdE1lc3NhZ2UoZSx0aGlzLnVybCx0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSx0aGlzLm1lc3NhZ2VzUG9zdGVkLnB1c2goZSl9LHJlY2VpdmVNZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG49L14tLS1kZXN0cHViLXRvLXBhcmVudC0tLS87InN0cmluZyI9PXR5cGVvZiBlJiZuLnRlc3QoZSkmJigiY2FuU2V0VGhpcmRQYXJ0eUNvb2tpZXMiPT09KHQ9ZS5yZXBsYWNlKG4sIiIpLnNwbGl0KCJ8IikpWzBdJiYodGhpcy5jYW5TZXRUaGlyZFBhcnR5Q29va2llcz0idHJ1ZSI9PT10WzFdLHRoaXMucmVjZWl2ZWRUaGlyZFBhcnR5Q29va2llc05vdGlmaWNhdGlvbj0hMCx0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoKSksdGhpcy5tZXNzYWdlc1JlY2VpdmVkLnB1c2goZSkpfSxwcm9jZXNzSURDYWxsRGF0YTpmdW5jdGlvbihlKXsobnVsbD09dGhpcy51cmx8fGUuc3ViZG9tYWluJiYibm9zdWJkb21haW5yZXR1cm5lZCI9PT10aGlzLnN1YmRvbWFpbikmJigic3RyaW5nIj09dHlwZW9mIGcuX3N1YmRvbWFpbiYmZy5fc3ViZG9tYWluLmxlbmd0aD90aGlzLnN1YmRvbWFpbj1nLl9zdWJkb21haW46dGhpcy5zdWJkb21haW49ZS5zdWJkb21haW58fCIiLHRoaXMudXJsPXRoaXMuZ2V0VXJsKCkpLGUuaWJzIGluc3RhbmNlb2YgQXJyYXkmJmUuaWJzLmxlbmd0aCYmKHRoaXMuZG9BdHRhY2hJZnJhbWU9ITApLHRoaXMucmVhZHlUb0F0dGFjaElmcmFtZSgpJiYoZy5pZFN5bmNBdHRhY2hJZnJhbWVPbldpbmRvd0xvYWQ/KHQud2luZG93TG9hZGVkfHwiY29tcGxldGUiPT09aS5yZWFkeVN0YXRlfHwibG9hZGVkIj09PWkucmVhZHlTdGF0ZSkmJnRoaXMuYXR0YWNoSWZyYW1lKCk6dGhpcy5hdHRhY2hJZnJhbWVBU0FQKCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBnLmlkU3luY0lEQ2FsbFJlc3VsdD9nLmlkU3luY0lEQ2FsbFJlc3VsdChlKTp0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoZSksImZ1bmN0aW9uIj09dHlwZW9mIGcuaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQmJmcuaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQoZSl9LGNhbk1ha2VTeW5jSURDYWxsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcuX2ZvcmNlU3luY0lEQ2FsbHx8IWV8fHQtZT50ZS5EQVlTX0JFVFdFRU5fU1lOQ19JRF9DQUxMU30sYXR0YWNoSWZyYW1lQVNBUDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0LnN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWV8fChpLmJvZHk/dC5hdHRhY2hJZnJhbWUoKTpzZXRUaW1lb3V0KGUsMzApKX12YXIgdD10aGlzO2UoKX19fSxOPXthdWRpZW5jZU1hbmFnZXJTZXJ2ZXI6e30sYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlOnt9LGNvb2tpZURvbWFpbjp7fSxjb29raWVMaWZldGltZTp7fSxjb29raWVOYW1lOnt9LGRvZXNPcHRJbkFwcGx5Ont9LGRpc2FibGVUaGlyZFBhcnR5Q2FsbHM6e30sZGlzY2FyZFRyYWNraW5nU2VydmVyRUNJRDp7fSxpZFN5bmNBZnRlcklEQ2FsbFJlc3VsdDp7fSxpZFN5bmNBdHRhY2hJZnJhbWVPbldpbmRvd0xvYWQ6e30saWRTeW5jQ29udGFpbmVySUQ6e30saWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZzp7fSxkaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXM6e30saWRTeW5jRGlzYWJsZVN5bmNzOnt9LGRpc2FibGVJZFN5bmNzOnt9LGlkU3luY0lEQ2FsbFJlc3VsdDp7fSxpZFN5bmNTU0xVc2VBa2FtYWk6e30saXNDb29wU2FmZTp7fSxpc0lhYkNvbnRleHQ6e30saXNPcHRJblN0b3JhZ2VFbmFibGVkOnt9LGxvYWRTU0w6e30sbG9hZFRpbWVvdXQ6e30sbWFya2V0aW5nQ2xvdWRTZXJ2ZXI6e30sbWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmU6e30sb3B0SW5Db29raWVEb21haW46e30sb3B0SW5TdG9yYWdlRXhwaXJ5Ont9LG92ZXJ3cml0ZUNyb3NzRG9tYWluTUNJREFuZEFJRDp7fSxwcmVPcHRJbkFwcHJvdmFsczp7fSxwcmV2aW91c1Blcm1pc3Npb25zOnt9LHJlc2V0QmVmb3JlVmVyc2lvbjp7fSxzZGlkUGFyYW1FeHBpcnk6e30sc2VydmVyU3RhdGU6e30sc2Vzc2lvbkNvb2tpZU5hbWU6e30sc2VjdXJlQ29va2llOnt9LHRha2VUaW1lb3V0TWV0cmljczp7fSx0cmFja2luZ1NlcnZlcjp7fSx0cmFja2luZ1NlcnZlclNlY3VyZTp7fSx3aGl0ZWxpc3RJZnJhbWVEb21haW5zOnt9LHdoaXRlbGlzdFBhcmVudERvbWFpbjp7fX0sQj17Z2V0Q29uZmlnTmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoTil9LGdldENvbmZpZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sbm9ybWFsaXplQ29uZmlnOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBlP2U6ZSgpfX0sVT1mdW5jdGlvbihlKXt2YXIgaT17fTtyZXR1cm4gZS5vbj1mdW5jdGlvbihlLHQsbil7aWYoIXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiW09OXSBDYWxsYmFjayBzaG91bGQgYmUgYSBmdW5jdGlvbi4iKTtpLmhhc093blByb3BlcnR5KGUpfHwoaVtlXT1bXSk7dmFyIHI9aVtlXS5wdXNoKHtjYWxsYmFjazp0LGNvbnRleHQ6bn0pLTE7cmV0dXJuIGZ1bmN0aW9uKCl7aVtlXS5zcGxpY2UociwxKSxpW2VdLmxlbmd0aHx8ZGVsZXRlIGlbZV19fSxlLm9mZj1mdW5jdGlvbihlLHQpe2kuaGFzT3duUHJvcGVydHkoZSkmJihpW2VdPWlbZV0uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKGUuY2FsbGJhY2shPT10KXJldHVybiBlfSkpfSxlLnB1Ymxpc2g9ZnVuY3Rpb24oZSl7aWYoaS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7aVtlXS5zbGljZSgwKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2FsbGJhY2suYXBwbHkoZS5jb250ZXh0LHQpfSl9fSxlLnB1Ymxpc2h9LHJlPXtQRU5ESU5HOiJwZW5kaW5nIixDSEFOR0VEOiJjaGFuZ2VkIixDT01QTEVURToiY29tcGxldGUifSxpZT17QUFNOiJhYW0iLEFEQ0xPVUQ6ImFkY2xvdWQiLEFOQUxZVElDUzoiYWEiLENBTVBBSUdOOiJjYW1wYWlnbiIsRUNJRDoiZWNpZCIsTElWRUZZUkU6ImxpdmVmeXJlIixUQVJHRVQ6InRhcmdldCIsTUVESUFfQU5BTFlUSUNTOiJtZWRpYWFhIn0sYWU9KGUoaD17fSxpZS5BQU0sNTY1KSxlKGgsaWUuRUNJRCw1NjUpLGgpLG9lPShlKHY9e30saWUuQUFNLFsxLDEwXSksZSh2LGllLkVDSUQsWzEsMTBdKSx2KSxzZT1bInZpZGVvYWEiLCJpYWJDb25zZW50SGFzaCJdLGNlPShiPWllLE9iamVjdC5rZXlzKGIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gYltlXX0pKSx1ZT1mdW5jdGlvbigpe3ZhciByPXt9O3JldHVybiByLmNhbGxiYWNrcz1PYmplY3QuY3JlYXRlKG51bGwpLHIuYWRkPWZ1bmN0aW9uKGUsdCl7aWYoIWModCkpdGhyb3cgbmV3IEVycm9yKCJbY2FsbGJhY2tSZWdpc3RyeUZhY3RvcnldIE1ha2Ugc3VyZSBjYWxsYmFjayBpcyBhIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIGZ1bmN0aW9ucy4iKTtyLmNhbGxiYWNrc1tlXT1yLmNhbGxiYWNrc1tlXXx8W107dmFyIG49ci5jYWxsYmFja3NbZV0ucHVzaCh0KS0xO3JldHVybiBmdW5jdGlvbigpe3IuY2FsbGJhY2tzW2VdLnNwbGljZShuLDEpfX0sci5leGVjdXRlPWZ1bmN0aW9uKGUsdCl7aWYoci5jYWxsYmFja3NbZV0pe3Q9KHQ9dm9pZCAwPT09dD9bXTp0KWluc3RhbmNlb2YgQXJyYXk/dDpbdF07dHJ5e2Zvcig7ci5jYWxsYmFja3NbZV0ubGVuZ3RoOyl7dmFyIG49ci5jYWxsYmFja3NbZV0uc2hpZnQoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KG51bGwsdCk6biBpbnN0YW5jZW9mIEFycmF5JiZuWzFdLmFwcGx5KG5bMF0sdCl9ZGVsZXRlIHIuY2FsbGJhY2tzW2VdfWNhdGNoKHIpe319fSxyLmV4ZWN1dGVBbGw9ZnVuY3Rpb24obixlKXsoZXx8biYmIXMobikpJiZPYmplY3Qua2V5cyhyLmNhbGxiYWNrcykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD12b2lkIDAhPT1uW2VdP25bZV06IiI7ci5leGVjdXRlKGUsdCl9LHIpfSxyLmhhc0NhbGxiYWNrcz1mdW5jdGlvbigpe3JldHVybiBCb29sZWFuKE9iamVjdC5rZXlzKHIuY2FsbGJhY2tzKS5sZW5ndGgpfSxyfSxsZT1mdW5jdGlvbigpe30sZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmNvbnNvbGU7cmV0dXJuISF0JiYiZnVuY3Rpb24iPT10eXBlb2YgdFtlXX0sZmU9ZnVuY3Rpb24ocixpLGUpe3JldHVybiBlKCk/ZnVuY3Rpb24oKXtpZihkZShyKSl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07Y29uc29sZVtyXS5hcHBseShjb25zb2xlLFtpXS5jb25jYXQodCkpfX06bGV9LHBlPXIsZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIGk9W10sZT0wO2U8MjU2O2UrKyl7Zm9yKHZhciB0PWUsbj0wO248ODtuKyspdD0xJnQ/Mzk4ODI5MjM4NF50Pj4+MTp0Pj4+MTtpLnB1c2godCl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpLHR8fCh0PTApLHRePS0xO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj0yNTUmKHReZS5jaGFyQ29kZUF0KG4pKTt0PXQ+Pj44Xmlbcl19cmV0dXJuKHRePS0xKT4+PjB9fSgpLG1lPW5ldyBwZSgiW0FET0JFIE9QVC1JTl0iKSxoZT1mdW5jdGlvbihlLHQpe3JldHVybiBxKGUpPT09dH0sdmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P2U6aGUoZSwic3RyaW5nIik/W2VdOnR8fFtdfSxiZT1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qua2V5cyh0KTtyZXR1cm4hIWUubGVuZ3RoJiZlLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiEwPT09dFtlXX0pfSx5ZT1mdW5jdGlvbihlLHQpe3ZhciBuPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dCYmYXJndW1lbnRzWzFdO3JldHVybiEoIWV8fHhlKGUpKSYmdmUoZSkuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuLTE8Y2UuaW5kZXhPZihlKXx8biYmLTE8c2UuaW5kZXhPZihlKX0pfSxfZT1mdW5jdGlvbihlLG4pe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPW4sZX0se30pfSxDZT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LHhlPWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkmJiFlLmxlbmd0aH0sa2U9ZnVuY3Rpb24oZSl7aWYod2UoZSkpcmV0dXJuIGU7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe3JldHVybnt9fX0sRWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWV8fCh3ZShlKT95ZShPYmplY3Qua2V5cyhlKSwhMCk6SWUoZSkpfSxJZT1mdW5jdGlvbihlKXt0cnl7dmFyIHQ9SlNPTi5wYXJzZShlKTtyZXR1cm4hIWUmJmhlKGUsInN0cmluZyIpJiZ5ZShPYmplY3Qua2V5cyh0KSwhMCl9Y2F0Y2goZSl7cmV0dXJuITF9fSx3ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJmhlKGUsIm9iamVjdCIpJiYhMT09PUFycmF5LmlzQXJyYXkoZSl9LERlPWZ1bmN0aW9uKCl7fSxBZT1mdW5jdGlvbihlKXtyZXR1cm4gaGUoZSwiZnVuY3Rpb24iKT9lKCk6ZX0sU2U9ZnVuY3Rpb24oZSx0KXtFZShlKXx8bWUuZXJyb3IoIiIuY29uY2F0KHQpKX0sVGU9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfSxQZT1mdW5jdGlvbihlKXtyZXR1cm4gVGUoZSkuZmlsdGVyKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi5pbmRleE9mKGUpPT09dH0pfSxPZT1mdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1lP2FyZ3VtZW50c1swXTp7fSxuPXQuY29tbWFuZCxyPXQucGFyYW1zLGk9dm9pZCAwPT09cj97fTpyLGE9dC5jYWxsYmFjayxvPXZvaWQgMD09PWE/RGU6YTtpZighbnx8LTE9PT1uLmluZGV4T2YoIi4iKSl0aHJvdyBuZXcgRXJyb3IoIltPcHRJbi5leGVjdXRlXSBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGNvbW1hbmQuIik7dHJ5e3ZhciBzPW4uc3BsaXQoIi4iKSxjPWRbc1swXV0sdT1zWzFdO2lmKCFjfHwiZnVuY3Rpb24iIT10eXBlb2YgY1t1XSl0aHJvdyBuZXcgRXJyb3IoIk1ha2Ugc3VyZSB0aGUgcGx1Z2luIGFuZCBBUEkgbmFtZSBleGlzdC4iKTt2YXIgbD1PYmplY3QuYXNzaWduKGkse2NhbGxiYWNrOm99KTtjW3VdLmNhbGwoYyxsKX1jYXRjaChkKXttZS5lcnJvcigiW2V4ZWN1dGVdIFNvbWV0aGluZyB3ZW50IHdyb25nOiAiK2QubWVzc2FnZSl9fX07bC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGwucHJvdG90eXBlLmNvbnN0cnVjdG9yPWw7dmFyIGplPSJmZXRjaFBlcm1pc3Npb25zIixMZT0iW09wdEluI3JlZ2lzdGVyUGx1Z2luXSBQbHVnaW4gaXMgaW52YWxpZC4iO2QuQ2F0ZWdvcmllcz1pZSxkLlRpbWVvdXRFcnJvcj1sO3ZhciBNZT1PYmplY3QuZnJlZXplKHtPcHRJbjpkLElhYlBsdWdpbjptfSksVmU9ZnVuY3Rpb24oZCxmKXtkLnB1Ymxpc2hEZXN0aW5hdGlvbnM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQsaT1uO3RyeXtpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6ZS5jYWxsYmFja31jYXRjaChkKXtpPWZ1bmN0aW9uKCl7fX12YXIgYT1mO2lmKGEucmVhZHlUb0F0dGFjaElmcmFtZVByZWxpbWluYXJ5KCkpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoIWUubGVuZ3RoKXJldHVybiB2b2lkIGkoe2Vycm9yOiJzdWJkb21haW4gaXMgbm90IGEgcG9wdWxhdGVkIHN0cmluZy4ifSk7aWYoIShyIGluc3RhbmNlb2YgQXJyYXkmJnIubGVuZ3RoKSlyZXR1cm4gdm9pZCBpKHtlcnJvcjoibWVzc2FnZXMgaXMgbm90IGEgcG9wdWxhdGVkIGFycmF5LiJ9KTt2YXIgbz0hMTtpZihyLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiZlLmxlbmd0aCYmKGEuYWRkTWVzc2FnZShlKSxvPSEwKX0pLCFvKXJldHVybiB2b2lkIGkoe2Vycm9yOiJOb25lIG9mIHRoZSBtZXNzYWdlcyBhcmUgcG9wdWxhdGVkIHN0cmluZ3MuIn0pfWVsc2V7aWYoIVcuaXNPYmplY3QoZSkpcmV0dXJuIHZvaWQgaSh7ZXJyb3I6IkludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIn0pO3ZhciBzPWU7aWYoInN0cmluZyIhPXR5cGVvZihlPXMuc3ViZG9tYWluKXx8IWUubGVuZ3RoKXJldHVybiB2b2lkIGkoe2Vycm9yOiJjb25maWcuc3ViZG9tYWluIGlzIG5vdCBhIHBvcHVsYXRlZCBzdHJpbmcuIn0pO3ZhciBjPXMudXJsRGVzdGluYXRpb25zO2lmKCEoYyBpbnN0YW5jZW9mIEFycmF5JiZjLmxlbmd0aCkpcmV0dXJuIHZvaWQgaSh7ZXJyb3I6ImNvbmZpZy51cmxEZXN0aW5hdGlvbnMgaXMgbm90IGEgcG9wdWxhdGVkIGFycmF5LiJ9KTt2YXIgdT1bXTtjLmZvckVhY2goZnVuY3Rpb24oZSl7Vy5pc09iamVjdChlKSYmKGUuaGlkZVJlZmVycmVyP2UubWVzc2FnZSYmYS5hZGRNZXNzYWdlKGUubWVzc2FnZSk6dS5wdXNoKGUpKX0pLGZ1bmN0aW9uIGwoKXt1Lmxlbmd0aCYmc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPW5ldyBJbWFnZSx0PXUuc2hpZnQoKTtlLnNyYz10LnVybCxhLm9uUGFnZURlc3RpbmF0aW9uc0ZpcmVkLnB1c2godCksbCgpfSwxMDApfSgpfWEuaWZyYW1lPyhpKHttZXNzYWdlOiJUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgaXMgYWxyZWFkeSBhdHRhY2hlZCBhbmQgbG9hZGVkLiJ9KSxhLnJlcXVlc3RUb1Byb2Nlc3MoKSk6IWQuc3ViZG9tYWluJiZkLl9nZXRGaWVsZCgiTUNNSUQiKT8oYS5zdWJkb21haW49ZSxhLmRvQXR0YWNoSWZyYW1lPSEwLGEudXJsPWEuZ2V0VXJsKCksYS5yZWFkeVRvQXR0YWNoSWZyYW1lKCk/KGEuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24oZSl7aSh7bWVzc2FnZToiQXR0ZW1wdGVkIHRvIGF0dGFjaCBhbmQgbG9hZCB0aGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgdGhyb3VnaCB0aGlzIEFQSSBjYWxsLiBSZXN1bHQ6ICIrKGUubWVzc2FnZXx8Im5vIHJlc3VsdCIpfSl9KSxhLmF0dGFjaElmcmFtZSgpKTppKHtlcnJvcjoiRW5jb3VudGVyZWQgYSBwcm9ibGVtIGluIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGFuZCBsb2FkIHRoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSB0aHJvdWdoIHRoaXMgQVBJIGNhbGwuIn0pKTphLmlmcmFtZUxvYWRlZENhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGUpe2koe21lc3NhZ2U6IkF0dGVtcHRlZCB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggbm9ybWFsIFZpc2l0b3IgQVBJIHByb2Nlc3NpbmcuIFJlc3VsdDogIisoZS5tZXNzYWdlfHwibm8gcmVzdWx0Iil9KX0pfWVsc2UgaSh7ZXJyb3I6IlRoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSBpcyBkaXNhYmxlZCBpbiB0aGUgVmlzaXRvciBsaWJyYXJ5LiJ9KX19LFJlPWZ1bmN0aW9uIHEoZSl7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBlPj4+dHxlPDwzMi10fWZvcih2YXIgbixyLGk9TWF0aC5wb3csYT1pKDIsMzIpLG89IiIscz1bXSxjPTgqZS5sZW5ndGgsdT1xLmg9cS5ofHxbXSxsPXEuaz1xLmt8fFtdLGQ9bC5sZW5ndGgsZj17fSxwPTI7ZDw2NDtwKyspaWYoIWZbcF0pe2ZvcihuPTA7bjwzMTM7bis9cClmW25dPXA7dVtkXT1pKHAsLjUpKmF8MCxsW2QrK109aShwLDEvMykqYXwwfWZvcihlKz0iwoAiO2UubGVuZ3RoJTY0LTU2OyllKz0iXDAiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspe2lmKChyPWUuY2hhckNvZGVBdChuKSk+PjgpcmV0dXJuO3Nbbj4+Ml18PXI8PCgzLW4pJTQqOH1mb3Ioc1tzLmxlbmd0aF09Yy9hfDAsc1tzLmxlbmd0aF09YyxyPTA7cjxzLmxlbmd0aDspe3ZhciBnPXMuc2xpY2UocixyKz0xNiksbT11O2Zvcih1PXUuc2xpY2UoMCw4KSxuPTA7bjw2NDtuKyspe3ZhciBoPWdbbi0xNV0sdj1nW24tMl0sYj11WzBdLHk9dVs0XSxfPXVbN10rKHQoeSw2KV50KHksMTEpXnQoeSwyNSkpKyh5JnVbNV1efnkmdVs2XSkrbFtuXSsoZ1tuXT1uPDE2P2dbbl06Z1tuLTE2XSsodChoLDcpXnQoaCwxOCleaD4+PjMpK2dbbi03XSsodCh2LDE3KV50KHYsMTkpXnY+Pj4xMCl8MCk7KHU9W18rKCh0KGIsMiledChiLDEzKV50KGIsMjIpKSsoYiZ1WzFdXmImdVsyXV51WzFdJnVbMl0pKXwwXS5jb25jYXQodSkpWzRdPXVbNF0rX3wwfWZvcihuPTA7bjw4O24rKyl1W25dPXVbbl0rbVtuXXwwfWZvcihuPTA7bjw4O24rKylmb3Iocj0zO3IrMTtyLS0pe3ZhciBDPXVbbl0+PjgqciYyNTU7bys9KEM8MTY/MDoiIikrQy50b1N0cmluZygxNil9cmV0dXJuIG99LEZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIlNIQS0yNTYiIT09dCYmIlNIQTI1NiIhPT10JiYic2hhMjU2IiE9PXQmJiJzaGEtMjU2IiE9PXR8fChlPVJlKGUpKSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nKGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfSxCZT1NZS5PcHRJbjtXLmRlZmluZUdsb2JhbE5hbWVzcGFjZSgpLHdpbmRvdy5hZG9iZS5PcHRJbkNhdGVnb3JpZXM9QmUuQ2F0ZWdvcmllczt2YXIgVWU9ZnVuY3Rpb24ocixuLGUpe2Z1bmN0aW9uIGYoKXt2Ll9jdXN0b21lcklEc0hhc2hDaGFuZ2VkPSExfWZ1bmN0aW9uIHQoZSl7dmFyIHI9ZTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8ay5sb2NhdGlvbi5ocmVmO3RyeXt2YXIgbj12Ll9leHRyYWN0UGFyYW1Gcm9tVXJpKHQscik7aWYobilyZXR1cm4gRi5wYXJzZVBpcGVEZWxpbWV0ZWRLZXlWYWx1ZXMobil9Y2F0Y2goZSl7fX19ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUsdCxuKXtlJiZlLm1hdGNoKHRlLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpJiYobj09PUQmJih4PSEwKSx0KGUpKX10KGVbRF0sdi5zZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCxEKSx2Ll9zZXRGaWVsZEV4cGlyZShPLC0xKSx0KGVbVF0sdi5zZXRBbmFseXRpY3NWaXNpdG9ySUQpfWZ1bmN0aW9uIGEoZSl7ZT1lfHx7fSx2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50PWUuc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudHx8IiIsdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkPWUuc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkfHx7fSx2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0PWUuc3VwcGxlbWVudGFsRGF0YUlETGFzdHx8IiIsdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkPWUuc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkfHx7fX1mdW5jdGlvbiBvKGUpe2Z1bmN0aW9uIGkoZSx0LG4pe3JldHVybihuPW4/bis9InwiOm4pKyhlKyI9IikrZW5jb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIHQoZSx0KXt2YXIgbj10WzBdLHI9dFsxXTtyZXR1cm4gbnVsbCE9ciYmciE9PWomJihlPWkobixyLGUpKSxlfXZhciBuLHI9ZS5yZWR1Y2UodCwiIik7cmV0dXJuKG49KG49cik/bis9InwiOm4pKyJUUz0iK0YuZ2V0VGltZXN0YW1wSW5TZWNvbmRzKCl9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLm1pbnV0ZXNUb0xpdmUsbj0iIjtyZXR1cm4odi5pZFN5bmNEaXNhYmxlU3luY3N8fHYuZGlzYWJsZUlkU3luY3MpJiYobj1ufHwiRXJyb3I6IGlkIHN5bmNzIGhhdmUgYmVlbiBkaXNhYmxlZCIpLCJzdHJpbmciPT10eXBlb2YgZS5kcGlkJiZlLmRwaWQubGVuZ3RofHwobj1ufHwiRXJyb3I6IGNvbmZpZy5kcGlkIGlzIGVtcHR5IiksInN0cmluZyI9PXR5cGVvZiBlLnVybCYmZS51cmwubGVuZ3RofHwobj1ufHwiRXJyb3I6IGNvbmZpZy51cmwgaXMgZW1wdHkiKSx2b2lkIDA9PT10P3Q9MjAxNjA6KHQ9cGFyc2VJbnQodCwxMCksKGlzTmFOKHQpfHx0PD0wKSYmKG49bnx8IkVycm9yOiBjb25maWcubWludXRlc1RvTGl2ZSBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIG51bWJlciIpKSx7ZXJyb3I6bix0dGw6dH19ZnVuY3Rpb24gYygpe3JldHVybiEoIXYuY29uZmlncy5kb2VzT3B0SW5BcHBseXx8Yi5vcHRJbi5pc0NvbXBsZXRlJiZkKCkpfWZ1bmN0aW9uIGQoKXtyZXR1cm4gdi5jb25maWdzLmRvZXNPcHRJbkFwcGx5JiZ2LmNvbmZpZ3MuaXNJYWJDb250ZXh0P2Iub3B0SW4uaXNBcHByb3ZlZChiLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkmJkM6Yi5vcHRJbi5pc0FwcHJvdmVkKGIub3B0SW4uQ2F0ZWdvcmllcy5FQ0lEKX1mdW5jdGlvbiB1KCl7W1siZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQiXSxbInNldEN1c3RvbWVySURzIix2b2lkIDBdLFsic3luY0lkZW50aXR5Iix2b2lkIDBdLFsiZ2V0QW5hbHl0aWNzVmlzaXRvcklEIl0sWyJnZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQiXSxbImdldExvY2F0aW9uSGludCJdLFsiZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj0yPT09ZS5sZW5ndGg/ZVsxXToiIixyPXZbdF07dlt0XT1mdW5jdGlvbihlKXtyZXR1cm4gZCgpJiZ2LmlzQWxsb3dlZCgpP3IuYXBwbHkodixhcmd1bWVudHMpOigiZnVuY3Rpb24iPT10eXBlb2YgZSYmdi5fY2FsbENhbGxiYWNrKGUsW25dKSxuKX19KX1mdW5jdGlvbiBsKCl7dmFyIGU9di5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgpLHQ9ZS51cmw7cmV0dXJuIHYuX2xvYWREYXRhKHcsdCxudWxsLGUpfWZ1bmN0aW9uIHAoZSx0KXtpZihDPSEwLGUpdGhyb3cgbmV3IEVycm9yKCJbSUFCIHBsdWdpbl0gOiAiK2UpO3QmJnQuZ2RwckFwcGxpZXMmJih5PXQuY29uc2VudFN0cmluZyxfPXQuaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsPzE6MCksbCgpLGgoKX1mdW5jdGlvbiBnKGUsdCl7aWYoQz0hMCxlKXRocm93IG5ldyBFcnJvcigiW0lBQiBwbHVnaW5dIDogIitlKTt0LmdkcHJBcHBsaWVzJiYoeT10LmNvbnNlbnRTdHJpbmcsXz10Lmhhc0NvbnNlbnRDaGFuZ2VkU2luY2VMYXN0Q21wUHVsbD8xOjApLHYuaW5pdCgpLGgoKX1mdW5jdGlvbiBtKCl7Yi5vcHRJbi5pc0NvbXBsZXRlJiYoYi5vcHRJbi5pc0FwcHJvdmVkKGIub3B0SW4uQ2F0ZWdvcmllcy5FQ0lEKT92LmNvbmZpZ3MuaXNJYWJDb250ZXh0P2Iub3B0SW4uZXhlY3V0ZSh7Y29tbWFuZDoiaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEiLGNhbGxiYWNrOmd9KToodi5pbml0KCksaCgpKTp2LmNvbmZpZ3MuaXNJYWJDb250ZXh0P2Iub3B0SW4uZXhlY3V0ZSh7Y29tbWFuZDoiaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEiLGNhbGxiYWNrOnB9KToodSgpLGgoKSkpfWZ1bmN0aW9uIGgoKXtiLm9wdEluLm9mZigiY29tcGxldGUiLG0pfWlmKCFlfHxlLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIikhPT1yKXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHVzZSBgVmlzaXRvci5nZXRJbnN0YW5jZWAgdG8gaW5zdGFudGlhdGUgVmlzaXRvci4iKTt2YXIgdj10aGlzLGI9d2luZG93LmFkb2JlLHk9IiIsXz0wLEM9ITEseD0hMTt2LnZlcnNpb249IjUuMC4xIjt2YXIgaz16LEU9ay5WaXNpdG9yO0UudmVyc2lvbj12LnZlcnNpb24sRS5BdXRoU3RhdGU9SC5BVVRIX1NUQVRFLEUuT3B0T3V0PUguT1BUX09VVCxrLnNfY19pbnx8KGsuc19jX2lsPVtdLGsuc19jX2luPTApLHYuX2M9IlZpc2l0b3IiLHYuX2lsPWsuc19jX2lsLHYuX2luPWsuc19jX2luLHYuX2lsW3YuX2luXT12LGsuc19jX2luKyssdi5faW5zdGFuY2VUeXBlPSJyZWd1bGFyIix2Ll9sb2c9e3JlcXVlc3RzOltdfSx2Lm1hcmtldGluZ0Nsb3VkT3JnSUQ9cix2LmNvb2tpZU5hbWU9IkFNQ1ZfIityLHYuc2Vzc2lvbkNvb2tpZU5hbWU9IkFNQ1ZTXyIrcix2LmNvb2tpZURvbWFpbj1RKCksdi5sb2FkU1NMPSEwLHYubG9hZFRpbWVvdXQ9M2U0LHYuQ09SU0Vycm9ycz1bXSx2Lm1hcmtldGluZ0Nsb3VkU2VydmVyPXYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyPSJkcG0uZGVtZGV4Lm5ldCIsdi5zZGlkUGFyYW1FeHBpcnk9MzA7dmFyIEk9bnVsbCx3PSJNQyIsRD0iTUNNSUQiLEE9Ik1DSURUUyIsUz0iQSIsVD0iTUNBSUQiLFA9IkFBTSIsTz0iTUNBQU1CIixqPSJOT05FIixMPWZ1bmN0aW9uKGUpe3JldHVybiFPYmplY3QucHJvdG90eXBlW2VdfSxNPWVlKHYpO3YuRklFTERTPUguRklFTERTLHYuY29va2llUmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gSy5nZXQoZSl9LHYuY29va2llV3JpdGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXYuY29va2llTGlmZXRpbWU/KCIiK3YuY29va2llTGlmZXRpbWUpLnRvVXBwZXJDYXNlKCk6IiIsaT0hMTtyZXR1cm4gdi5jb25maWdzJiZ2LmNvbmZpZ3Muc2VjdXJlQ29va2llJiYiaHR0cHM6Ij09PWxvY2F0aW9uLnByb3RvY29sJiYoaT0hMCksSy5zZXQoZSwiIit0LHtleHBpcmVzOm4sZG9tYWluOnYuY29va2llRG9tYWluLGNvb2tpZUxpZmV0aW1lOnIsc2VjdXJlOml9KX0sdi5yZXNldFN0YXRlPWZ1bmN0aW9uKGUpe2U/di5fbWVyZ2VTZXJ2ZXJTdGF0ZShlKTphKCl9LHYuX2lzQWxsb3dlZERvbmU9ITEsdi5faXNBbGxvd2VkRmxhZz0hMSx2LmlzQWxsb3dlZD1mdW5jdGlvbigpe3JldHVybiB2Ll9pc0FsbG93ZWREb25lfHwodi5faXNBbGxvd2VkRG9uZT0hMCwodi5jb29raWVSZWFkKHYuY29va2llTmFtZSl8fHYuY29va2llV3JpdGUodi5jb29raWVOYW1lLCJUIiwxKSkmJih2Ll9pc0FsbG93ZWRGbGFnPSEwKSksIlQiPT09di5jb29raWVSZWFkKHYuY29va2llTmFtZSkmJnYuX2hlbHBlcnMucmVtb3ZlQ29va2llKHYuY29va2llTmFtZSksdi5faXNBbGxvd2VkRmxhZ30sdi5zZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD1mdW5jdGlvbihlKXt2Ll9zZXRNYXJrZXRpbmdDbG91ZEZpZWxkcyhlKX0sdi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlcj0hMSx2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEPWZ1bmN0aW9uKGUsdCl7di5tYXJrZXRpbmdDbG91ZFNlcnZlciYmdi5tYXJrZXRpbmdDbG91ZFNlcnZlci5pbmRleE9mKCIuZGVtZGV4Lm5ldCIpPDAmJih2Ll91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyPSEwKTt2YXIgbj12Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCJfc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMiKSxyPW4udXJsO3JldHVybiB2Ll9nZXRSZW1vdGVGaWVsZChELHIsZSx0LG4pfTt2YXIgVj1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3YuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24oKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT12Ll9nZXRGaWVsZChlLCEwKX0pLC0xIT09ZS5pbmRleE9mKCJNQ09QVE9VVCIpP3YuaXNPcHRlZE91dChmdW5jdGlvbihlKXtuLk1DT1BUT1VUPWUsdChuKX0sbnVsbCwhMCk6dChuKX0sITApfTt2LmdldFZpc2l0b3JWYWx1ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj17TUNNSUQ6e2ZuOnYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQsYXJnczpbITBdLGNvbnRleHQ6dn0sTUNPUFRPVVQ6e2ZuOnYuaXNPcHRlZE91dCxhcmdzOlt2b2lkIDAsITBdLGNvbnRleHQ6dn0sTUNBSUQ6e2ZuOnYuZ2V0QW5hbHl0aWNzVmlzaXRvcklELGFyZ3M6WyEwXSxjb250ZXh0OnZ9LE1DQUFNTEg6e2ZuOnYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50LGFyZ3M6WyEwXSxjb250ZXh0OnZ9LE1DQUFNQjp7Zm46di5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iLGFyZ3M6WyEwXSxjb250ZXh0OnZ9fSxyPXQmJnQubGVuZ3RoP1cucGx1Y2sobix0KTpuO3QmJi0xPT09dC5pbmRleE9mKCJNQ0FJRCIpP1YoZSx0KTpYKHIsZSl9LHYuX2N1cnJlbnRDdXN0b21lcklEcz17fSx2Ll9jdXN0b21lcklEc0hhc2hDaGFuZ2VkPSExLHYuX25ld0N1c3RvbWVySURzSGFzaD0iIix2LnNldEN1c3RvbWVySURzPWZ1bmN0aW9uKGUsdCl7aWYoIXYuaXNPcHRlZE91dCgpJiZlKXtpZighVy5pc09iamVjdChlKXx8Vy5pc09iamVjdEVtcHR5KGUpKXJldHVybiExO3ZhciBuLHIsaSxhO2ZvcihuIGluIHYuX3JlYWRWaXNpdG9yKCksZSlpZihMKG4pJiYodi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzPXYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc3x8e30sdD0ocj1lW25dKS5oYXNPd25Qcm9wZXJ0eSgiaGFzaFR5cGUiKT9yLmhhc2hUeXBlOnQscikpaWYoIm9iamVjdCI9PT1xKHIpKXt2YXIgbz17fTtpZihyLmlkKXtpZih0KXtpZighKGE9RmUoTmUoci5pZCksdCkpKXJldHVybjtyLmlkPWEsby5oYXNoVHlwZT10fW8uaWQ9ci5pZH1udWxsIT1yLmF1dGhTdGF0ZSYmKG8uYXV0aFN0YXRlPXIuYXV0aFN0YXRlKSx2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbbl09b31lbHNlIGlmKHQpe2lmKCEoYT1GZShOZShyKSx0KSkpcmV0dXJuO3YuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc1tuXT17aWQ6YSxoYXNoVHlwZTp0fX1lbHNlIHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc1tuXT17aWQ6cn07dmFyIHM9di5nZXRDdXN0b21lcklEcyghMCksYz12Ll9nZXRGaWVsZCgiTUNDSURIIiksdT0iIjtmb3IoaSBpbiBjfHwoYz0wKSxzKXt2YXIgbD1zW2ldO2lmKCFXLmlzT2JqZWN0RW1wdHkobCkpZm9yKG4gaW4gbClMKG4pJiYodSs9KHU/InwiOiIiKStuKyJ8IisoKHI9bFtuXSkuaWQ/ci5pZDoiIikrKHIuYXV0aFN0YXRlP3IuYXV0aFN0YXRlOiIiKSl9di5fbmV3Q3VzdG9tZXJJRHNIYXNoPVN0cmluZyh2Ll9oYXNoKHUpKSx2Ll9uZXdDdXN0b21lcklEc0hhc2ghPT1jJiYodi5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZD0hMCx2Ll9tYXBDdXN0b21lcklEcyhmKSl9fSx2LnN5bmNJZGVudGl0eT1mdW5jdGlvbihlLHQpe2lmKCF2LmlzT3B0ZWRPdXQoKSYmZSl7aWYoIVcuaXNPYmplY3QoZSl8fFcuaXNPYmplY3RFbXB0eShlKSlyZXR1cm4hMTt2YXIgbixyLGksYSxvO2ZvcihuIGluIHYuX3JlYWRWaXNpdG9yKCksZSlpZihMKG4pJiYodi5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXM9di5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXN8fHt9LHQ9KHI9ZVtuXSkuaGFzT3duUHJvcGVydHkoImhhc2hUeXBlIik/ci5oYXNoVHlwZTp0LHImJiJvYmplY3QiPT09cShyKSkpe3ZhciBzPXt9O2lmKHIuaWQpe2lmKHQpe2lmKCEoaT1GZShOZShyLmlkKSx0KSkpcmV0dXJuO3IuaWQ9aSxzLmhhc2hUeXBlPXR9cy5pZD1yLmlkfW51bGwhPXIuYXV0aFN0YXRlJiYocy5hdXRoU3RhdGU9ci5hdXRoU3RhdGUpLHIuZGF0YVNvdXJjZSYmKHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcz12Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXN8fHt9LGE9ci5kYXRhU291cmNlLHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc1thXT1zKSx2Ll9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlc1tuXT1zfXZhciBjPXYuZ2V0Q3VzdG9tZXJJRHMoITApLHU9di5fZ2V0RmllbGQoIk1DQ0lESCIpLGw9IiI7Zm9yKG8gaW4gdXx8KHU9IjAiKSxjKXt2YXIgZD1jW29dO2lmKCFXLmlzT2JqZWN0RW1wdHkoZCkpZm9yKG4gaW4gZClMKG4pJiYobCs9KGw/InwiOiIiKStuKyJ8IisoKHI9ZFtuXSkuaWQ/ci5pZDoiIikrKHIuYXV0aFN0YXRlP3IuYXV0aFN0YXRlOiIiKSl9di5fbmV3Q3VzdG9tZXJJRHNIYXNoPVN0cmluZyh2Ll9oYXNoKGwpKSx2Ll9uZXdDdXN0b21lcklEc0hhc2ghPT11JiYodi5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZD0hMCx2Ll9tYXBDdXN0b21lcklEcyhmKSl9fSx2LmdldEN1c3RvbWVySURzPWZ1bmN0aW9uKGUpe3YuX3JlYWRWaXNpdG9yKCk7dmFyIHQsbixyPXtkYXRhU291cmNlczp7fSxuYW1lU3BhY2VzOnt9fSxpPXYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcztmb3IodCBpbiBpKUwodCkmJihuPWlbdF0pLmlkJiYoci5kYXRhU291cmNlc1t0XXx8KHIuZGF0YVNvdXJjZXNbdF09e30pLHIuZGF0YVNvdXJjZXNbdF0uaWQ9bi5pZCxudWxsIT1uLmF1dGhTdGF0ZT9yLmRhdGFTb3VyY2VzW3RdLmF1dGhTdGF0ZT1uLmF1dGhTdGF0ZTpyLmRhdGFTb3VyY2VzW3RdLmF1dGhTdGF0ZT1FLkF1dGhTdGF0ZS5VTktOT1dOLG4uaGFzaFR5cGUmJihyLmRhdGFTb3VyY2VzW3RdLmhhc2hUeXBlPW4uaGFzaFR5cGUpKTt2YXIgYT12Ll9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlcztmb3IodCBpbiBhKUwodCkmJihuPWFbdF0pLmlkJiYoci5uYW1lU3BhY2VzW3RdfHwoci5uYW1lU3BhY2VzW3RdPXt9KSxyLm5hbWVTcGFjZXNbdF0uaWQ9bi5pZCxudWxsIT1uLmF1dGhTdGF0ZT9yLm5hbWVTcGFjZXNbdF0uYXV0aFN0YXRlPW4uYXV0aFN0YXRlOnIubmFtZVNwYWNlc1t0XS5hdXRoU3RhdGU9RS5BdXRoU3RhdGUuVU5LTk9XTixuLmhhc2hUeXBlJiYoci5uYW1lU3BhY2VzW3RdLmhhc2hUeXBlPW4uaGFzaFR5cGUpKTtyZXR1cm4gZT9yOnIuZGF0YVNvdXJjZXN9LHYuc2V0QW5hbHl0aWNzVmlzaXRvcklEPWZ1bmN0aW9uKGUpe3YuX3NldEFuYWx5dGljc0ZpZWxkcyhlKX0sdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCFGLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSYmIW4pcmV0dXJuIHYuX2NhbGxDYWxsYmFjayhlLFsiIl0pLCIiO3ZhciByPSIiO2lmKG58fChyPXYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24oKXt2LmdldEFuYWx5dGljc1Zpc2l0b3JJRChlLCEwKX0pKSxyfHxuKXt2YXIgaT1uP3YubWFya2V0aW5nQ2xvdWRTZXJ2ZXI6di50cmFja2luZ1NlcnZlcixhPSIiO3YubG9hZFNTTCYmKG4/di5tYXJrZXRpbmdDbG91ZFNlcnZlclNlY3VyZSYmKGk9di5tYXJrZXRpbmdDbG91ZFNlcnZlclNlY3VyZSk6di50cmFja2luZ1NlcnZlclNlY3VyZSYmKGk9di50cmFja2luZ1NlcnZlclNlY3VyZSkpO3ZhciBvPXt9O2lmKGkpe3ZhciBzPSJodHRwIisodi5sb2FkU1NMPyJzIjoiIikrIjovLyIraSsiL2lkIixjPSJkX3Zpc2lkX3Zlcj0iK3YudmVyc2lvbisiJm1jb3JnaWQ9IitlbmNvZGVVUklDb21wb25lbnQodi5tYXJrZXRpbmdDbG91ZE9yZ0lEKSsocj8iJm1pZD0iK2VuY29kZVVSSUNvbXBvbmVudChyKToiIikrKHYuaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZ3x8di5kaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXM/IiZkX2NvcHBhPXRydWUiOiIiKSx1PVsic19jX2lsIix2Ll9pbiwiX3NldCIrKG4/Ik1hcmtldGluZ0Nsb3VkIjoiQW5hbHl0aWNzIikrIkZpZWxkcyJdO2E9cysiPyIrYysiJmNhbGxiYWNrPXNfY19pbCU1QiIrdi5faW4rIiU1RC5fc2V0Iisobj8iTWFya2V0aW5nQ2xvdWQiOiJBbmFseXRpY3MiKSsiRmllbGRzIixvLmNvcnNVcmw9cysiPyIrYyxvLmNhbGxiYWNrPXV9cmV0dXJuIG8udXJsPWEsdi5fZ2V0UmVtb3RlRmllbGQobj9EOlQsYSxlLHQsbyl9cmV0dXJuIiJ9LHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50PWZ1bmN0aW9uKGUsdCl7aWYodi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbigpe3YuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KGUsITApfSkpe3ZhciBuPXYuX2dldEZpZWxkKFQpO2lmKCFuJiZGLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSYmKG49di5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZnVuY3Rpb24oKXt2LmdldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludChlLCEwKX0pKSxufHwhRi5pc1RyYWNraW5nU2VydmVyUG9wdWxhdGVkKCkpe3ZhciByPXYuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoKSxpPXIudXJsO3JldHVybiB2Ll9nZXRSZW1vdGVGaWVsZCgiTUNBQU1MSCIsaSxlLHQscil9fXJldHVybiIifSx2LmdldExvY2F0aW9uSGludD12LmdldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCx2LmdldEF1ZGllbmNlTWFuYWdlckJsb2I9ZnVuY3Rpb24oZSx0KXtpZih2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uKCl7di5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKGUsITApfSkpe3ZhciBuPXYuX2dldEZpZWxkKFQpO2lmKCFuJiZGLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSYmKG49di5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZnVuY3Rpb24oKXt2LmdldEF1ZGllbmNlTWFuYWdlckJsb2IoZSwhMCl9KSksbnx8IUYuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpKXt2YXIgcj12Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCksaT1yLnVybDtyZXR1cm4gdi5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCYmdi5fc2V0RmllbGRFeHBpcmUoTywtMSksdi5fZ2V0UmVtb3RlRmllbGQoTyxpLGUsdCxyKX19cmV0dXJuIiJ9LHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQ9IiIsdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkPXt9LHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3Q9IiIsdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkPXt9O3ZhciBSPSEodi5nZXRTdXBwbGVtZW50YWxEYXRhSUQ9ZnVuY3Rpb24oZSx0KXt2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50fHx0fHwodi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudD12Ll9nZW5lcmF0ZUlEKDEpKTt2YXIgbj12Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50O3JldHVybiB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0JiYhdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkW2VdPyhuPXYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3Qsdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkW2VdPSEwKTpuJiYodi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkW2VdJiYodi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdD12Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50LHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZD12Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQsdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudD1uPXQ/IiI6di5fZ2VuZXJhdGVJRCgxKSx2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQ9e30pLG4mJih2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWRbZV09ITApKSxufSk7di5fbGliZXJhdGVkT3B0T3V0PW51bGwsdi5nZXRPcHRPdXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj12Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCJfc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMiKSxyPW4udXJsO2lmKGQoKSlyZXR1cm4gdi5fZ2V0UmVtb3RlRmllbGQoIk1DT1BUT1VUIixyLGUsdCxuKTtpZih2Ll9yZWdpc3RlckNhbGxiYWNrKCJsaWJlcmF0ZWRPcHRPdXQiLGUpLG51bGwhPT12Ll9saWJlcmF0ZWRPcHRPdXQpcmV0dXJuIHYuX2NhbGxBbGxDYWxsYmFja3MoImxpYmVyYXRlZE9wdE91dCIsW3YuX2xpYmVyYXRlZE9wdE91dF0pLFI9ITEsdi5fbGliZXJhdGVkT3B0T3V0O2lmKFIpcmV0dXJuIG51bGw7Uj0hMDt2YXIgaT0ibGliZXJhdGVkR2V0T3B0T3V0IjtyZXR1cm4gbi5jb3JzVXJsPW4uY29yc1VybC5yZXBsYWNlKC9cLmRlbWRleFwubmV0XC9pZFw/LywiLmRlbWRleC5uZXQvb3B0T3V0U3RhdHVzPyIpLG4uY2FsbGJhY2s9W2ldLHpbaV09ZnVuY3Rpb24oZSl7aWYoZT09PU9iamVjdChlKSl7dmFyIHQsbixyPVcucGFyc2VPcHRPdXQoZSx0LGopO3Q9ci5vcHRPdXQsbj0xZTMqci5kX290dGwsdi5fbGliZXJhdGVkT3B0T3V0PXQsc2V0VGltZW91dChmdW5jdGlvbigpe3YuX2xpYmVyYXRlZE9wdE91dD1udWxsfSxuKX12Ll9jYWxsQWxsQ2FsbGJhY2tzKCJsaWJlcmF0ZWRPcHRPdXQiLFt0XSksUj0hMX0sTS5maXJlQ09SUyhuKSxudWxsfSx2LmlzT3B0ZWRPdXQ9ZnVuY3Rpb24obixyLGUpe3J8fChyPUUuT3B0T3V0LkdMT0JBTCk7dmFyIHQ9di5nZXRPcHRPdXQoZnVuY3Rpb24oZSl7dmFyIHQ9ZT09PUUuT3B0T3V0LkdMT0JBTHx8MDw9ZS5pbmRleE9mKHIpO3YuX2NhbGxDYWxsYmFjayhuLFt0XSl9LGUpO3JldHVybiB0P3Q9PT1FLk9wdE91dC5HTE9CQUx8fDA8PXQuaW5kZXhPZihyKTpudWxsfSx2Ll9maWVsZHM9bnVsbCx2Ll9maWVsZHNFeHBpcmVkPW51bGwsdi5faGFzaD1mdW5jdGlvbihlKXt2YXIgdCxuPTA7aWYoZSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKW49KG48PDUpLW4rZS5jaGFyQ29kZUF0KHQpLG4mPW47cmV0dXJuIG59LHYuX2dlbmVyYXRlSUQ9Wix2Ll9nZW5lcmF0ZUxvY2FsTUlEPWZ1bmN0aW9uKCl7dmFyIGU9di5fZ2VuZXJhdGVJRCgwKTtyZXR1cm4gVS5pc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD0hMCxlfSx2Ll9jYWxsYmFja0xpc3Q9bnVsbCx2Ll9jYWxsQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseShrLHQpOmVbMV0uYXBwbHkoZVswXSx0KX1jYXRjaChlKXt9fSx2Ll9yZWdpc3RlckNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7dCYmKG51bGw9PXYuX2NhbGxiYWNrTGlzdCYmKHYuX2NhbGxiYWNrTGlzdD17fSksbnVsbD09di5fY2FsbGJhY2tMaXN0W2VdJiYodi5fY2FsbGJhY2tMaXN0W2VdPVtdKSx2Ll9jYWxsYmFja0xpc3RbZV0ucHVzaCh0KSl9LHYuX2NhbGxBbGxDYWxsYmFja3M9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT12Ll9jYWxsYmFja0xpc3Qpe3ZhciBuPXYuX2NhbGxiYWNrTGlzdFtlXTtpZihuKWZvcig7MDxuLmxlbmd0aDspdi5fY2FsbENhbGxiYWNrKG4uc2hpZnQoKSx0KX19LHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW09ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQobiksYT1GLnBhcnNlSGFzaChlKSxvPUYuaGFzaGxlc3NVcmwoZSk7aWYoLTE9PT1vLmluZGV4T2YoIj8iKSlyZXR1cm4gbysiPyIraSthO3ZhciBzPW8uc3BsaXQoIj8iKSxjPXNbMF0rIj8iLHU9c1sxXTtyZXR1cm4gYytGLmFkZFF1ZXJ5UGFyYW1BdExvY2F0aW9uKHUsaSxyKSthfSx2Ll9leHRyYWN0UGFyYW1Gcm9tVXJpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IFJlZ0V4cCgiW1xcPyYjXSIrdCsiPShbXiYjXSopIikuZXhlYyhlKTtpZihuJiZuLmxlbmd0aClyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG5bMV0pfSx2Ll9wYXJzZUFkb2JlTWNGcm9tVXJsPXQodGUuQURPQkVfTUMpLHYuX3BhcnNlQWRvYmVNY1NkaWRGcm9tVXJsPXQodGUuQURPQkVfTUNfU0RJRCksdi5fYXR0ZW1wdFRvUG9wdWxhdGVTZGlkRnJvbVVybD1mdW5jdGlvbihlKXt2YXIgdD12Ll9wYXJzZUFkb2JlTWNTZGlkRnJvbVVybChlKSxuPTFlOTt0JiZ0LlRTJiYobj1GLmdldFRpbWVzdGFtcEluU2Vjb25kcygpLXQuVFMpLHQmJnQuU0RJRCYmdC5NQ09SR0lEPT09ciYmbjx2LnNkaWRQYXJhbUV4cGlyeSYmKHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQ9dC5TRElELHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZC5TRElEX1VSTF9QQVJBTT0hMCl9LHYuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybD1mdW5jdGlvbigpe3ZhciBlPXYuX3BhcnNlQWRvYmVNY0Zyb21VcmwoKTtpZihlJiZlLlRTKXt2YXIgdD1GLmdldFRpbWVzdGFtcEluU2Vjb25kcygpLWUuVFM7aWYoTWF0aC5mbG9vcih0LzYwKT50ZS5BRE9CRV9NQ19UVExfSU5fTUlOfHxlLk1DT1JHSUQhPT1yKXJldHVybjtpKGUpfX0sdi5fbWVyZ2VTZXJ2ZXJTdGF0ZT1mdW5jdGlvbihlKXtpZihlKXRyeXtpZihyPWUsKGU9Ri5pc09iamVjdChyKT9yOkpTT04ucGFyc2UocikpW3YubWFya2V0aW5nQ2xvdWRPcmdJRF0pe3ZhciB0PWVbdi5tYXJrZXRpbmdDbG91ZE9yZ0lEXTtuPXQuY3VzdG9tZXJJRHMsRi5pc09iamVjdChuKSYmdi5zZXRDdXN0b21lcklEcyhuKSxhKHQuc2RpZCl9fWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiYHNlcnZlclN0YXRlYCBoYXMgYW4gaW52YWxpZCBmb3JtYXQuIil9dmFyIG4scn0sdi5fdGltZW91dD1udWxsLHYuX2xvYWREYXRhPWZ1bmN0aW9uKGUsdCxuLHIpe3Q9di5fYWRkUXVlcnlzdHJpbmdQYXJhbSh0LCJkX2ZpZWxkZ3JvdXAiLGUsMSksci51cmw9di5fYWRkUXVlcnlzdHJpbmdQYXJhbShyLnVybCwiZF9maWVsZGdyb3VwIixlLDEpLHIuY29yc1VybD12Ll9hZGRRdWVyeXN0cmluZ1BhcmFtKHIuY29yc1VybCwiZF9maWVsZGdyb3VwIixlLDEpLFUuZmllbGRHcm91cE9ialtlXT0hMCxyPT09T2JqZWN0KHIpJiZyLmNvcnNVcmwmJiJYTUxIdHRwUmVxdWVzdCI9PT1NLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSYmTS5maXJlQ09SUyhyLG4sZSl9LHYuX2NsZWFyVGltZW91dD1mdW5jdGlvbihlKXtudWxsIT12Ll90aW1lb3V0JiZ2Ll90aW1lb3V0W2VdJiYoY2xlYXJUaW1lb3V0KHYuX3RpbWVvdXRbZV0pLHYuX3RpbWVvdXRbZV09MCl9LHYuX3NldHRpbmdzRGlnZXN0PTAsdi5fZ2V0U2V0dGluZ3NEaWdlc3Q9ZnVuY3Rpb24oKXtpZighdi5fc2V0dGluZ3NEaWdlc3Qpe3ZhciBlPXYudmVyc2lvbjt2LmF1ZGllbmNlTWFuYWdlclNlcnZlciYmKGUrPSJ8Iit2LmF1ZGllbmNlTWFuYWdlclNlcnZlciksdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUmJihlKz0ifCIrdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUpLHYuX3NldHRpbmdzRGlnZXN0PXYuX2hhc2goZSl9cmV0dXJuIHYuX3NldHRpbmdzRGlnZXN0fSx2Ll9yZWFkVmlzaXRvckRvbmU9ITEsdi5fcmVhZFZpc2l0b3I9ZnVuY3Rpb24oKXtpZighdi5fcmVhZFZpc2l0b3JEb25lKXt2Ll9yZWFkVmlzaXRvckRvbmU9ITA7dmFyIGUsdCxuLHIsaSxhLG89di5fZ2V0U2V0dGluZ3NEaWdlc3QoKSxzPSExLGM9di5jb29raWVSZWFkKHYuY29va2llTmFtZSksdT1uZXcgRGF0ZTtpZihjfHx4fHx2LmRpc2NhcmRUcmFja2luZ1NlcnZlckVDSUR8fChjPXYuY29va2llUmVhZCh0ZS5GSVJTVF9QQVJUWV9TRVJWRVJfQ09PS0lFKSksbnVsbD09di5fZmllbGRzJiYodi5fZmllbGRzPXt9KSxjJiYiVCIhPT1jKWZvcigoYz1jLnNwbGl0KCJ8IikpWzBdLm1hdGNoKC9eW1wtMC05XSskLykmJihwYXJzZUludChjWzBdLDEwKSE9PW8mJihzPSEwKSxjLnNoaWZ0KCkpLGMubGVuZ3RoJTI9PTEmJmMucG9wKCksZT0wO2U8Yy5sZW5ndGg7ZSs9MiluPSh0PWNbZV0uc3BsaXQoIi0iKSlbMF0scj1jW2UrMV0sMTx0Lmxlbmd0aD8oaT1wYXJzZUludCh0WzFdLDEwKSxhPTA8dFsxXS5pbmRleE9mKCJzIikpOihpPTAsYT0hMSkscyYmKCJNQ0NJREgiPT09biYmKHI9IiIpLDA8aSYmKGk9dS5nZXRUaW1lKCkvMWUzLTYwKSksbiYmciYmKHYuX3NldEZpZWxkKG4sciwxKSwwPGkmJih2Ll9maWVsZHNbImV4cGlyZSIrbl09aSsoYT8icyI6IiIpLCh1LmdldFRpbWUoKT49MWUzKml8fGEmJiF2LmNvb2tpZVJlYWQodi5zZXNzaW9uQ29va2llTmFtZSkpJiYodi5fZmllbGRzRXhwaXJlZHx8KHYuX2ZpZWxkc0V4cGlyZWQ9e30pLHYuX2ZpZWxkc0V4cGlyZWRbbl09ITApKSk7IXYuX2dldEZpZWxkKFQpJiZGLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSYmKGM9di5jb29raWVSZWFkKCJzX3ZpIikpJiYxPChjPWMuc3BsaXQoInwiKSkubGVuZ3RoJiYwPD1jWzBdLmluZGV4T2YoInYxIikmJigwPD0oZT0ocj1jWzFdKS5pbmRleE9mKCJbIikpJiYocj1yLnN1YnN0cmluZygwLGUpKSxyJiZyLm1hdGNoKHRlLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpJiZ2Ll9zZXRGaWVsZChULHIpKX19LHYuX2FwcGVuZFZlcnNpb25Ubz1mdW5jdGlvbihlKXt2YXIgdD0idlZlcnNpb258Iit2LnZlcnNpb24sbj1lP3YuX2dldENvb2tpZVZlcnNpb24oZSk6bnVsbDtyZXR1cm4gbj8kLmFyZVZlcnNpb25zRGlmZmVyZW50KG4sdi52ZXJzaW9uKSYmKGU9ZS5yZXBsYWNlKHRlLlZFUlNJT05fUkVHRVgsdCkpOmUrPShlPyJ8IjoiIikrdCxlfSx2Ll93cml0ZVZpc2l0b3I9ZnVuY3Rpb24oKXt2YXIgZSx0LG49di5fZ2V0U2V0dGluZ3NEaWdlc3QoKTtmb3IoZSBpbiB2Ll9maWVsZHMpTChlKSYmdi5fZmllbGRzW2VdJiYiZXhwaXJlIiE9PWUuc3Vic3RyaW5nKDAsNikmJih0PXYuX2ZpZWxkc1tlXSxuKz0obj8ifCI6IiIpK2UrKHYuX2ZpZWxkc1siZXhwaXJlIitlXT8iLSIrdi5fZmllbGRzWyJleHBpcmUiK2VdOiIiKSsifCIrdCk7bj12Ll9hcHBlbmRWZXJzaW9uVG8obiksdi5jb29raWVXcml0ZSh2LmNvb2tpZU5hbWUsbiwxKX0sdi5fZ2V0RmllbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09di5fZmllbGRzfHwhdCYmdi5fZmllbGRzRXhwaXJlZCYmdi5fZmllbGRzRXhwaXJlZFtlXT9udWxsOnYuX2ZpZWxkc1tlXX0sdi5fc2V0RmllbGQ9ZnVuY3Rpb24oZSx0LG4pe251bGw9PXYuX2ZpZWxkcyYmKHYuX2ZpZWxkcz17fSksdi5fZmllbGRzW2VdPXQsbnx8di5fd3JpdGVWaXNpdG9yKCl9LHYuX2dldEZpZWxkTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXYuX2dldEZpZWxkKGUsdCk7cmV0dXJuIG4/bi5zcGxpdCgiKiIpOm51bGx9LHYuX3NldEZpZWxkTGlzdD1mdW5jdGlvbihlLHQsbil7di5fc2V0RmllbGQoZSx0P3Quam9pbigiKiIpOiIiLG4pfSx2Ll9nZXRGaWVsZE1hcD1mdW5jdGlvbihlLHQpe3ZhciBuPXYuX2dldEZpZWxkTGlzdChlLHQpO2lmKG4pe3ZhciByLGk9e307Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrPTIpaVtuW3JdXT1uW3IrMV07cmV0dXJuIGl9cmV0dXJuIG51bGx9LHYuX3NldEZpZWxkTWFwPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPW51bGw7aWYodClmb3IociBpbiBpPVtdLHQpTChyKSYmKGkucHVzaChyKSxpLnB1c2godFtyXSkpO3YuX3NldEZpZWxkTGlzdChlLGksbil9LHYuX3NldEZpZWxkRXhwaXJlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgRGF0ZTtyLnNldFRpbWUoci5nZXRUaW1lKCkrMWUzKnQpLG51bGw9PXYuX2ZpZWxkcyYmKHYuX2ZpZWxkcz17fSksdi5fZmllbGRzWyJleHBpcmUiK2VdPU1hdGguZmxvb3Ioci5nZXRUaW1lKCkvMWUzKSsobj8icyI6IiIpLHQ8MD8odi5fZmllbGRzRXhwaXJlZHx8KHYuX2ZpZWxkc0V4cGlyZWQ9e30pLHYuX2ZpZWxkc0V4cGlyZWRbZV09ITApOnYuX2ZpZWxkc0V4cGlyZWQmJih2Ll9maWVsZHNFeHBpcmVkW2VdPSExKSxuJiYodi5jb29raWVSZWFkKHYuc2Vzc2lvbkNvb2tpZU5hbWUpfHx2LmNvb2tpZVdyaXRlKHYuc2Vzc2lvbkNvb2tpZU5hbWUsIjEiKSl9LHYuX2ZpbmRWaXNpdG9ySUQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJigib2JqZWN0Ij09PXEoZSkmJihlPWUuZF9taWQ/ZS5kX21pZDplLnZpc2l0b3JJRD9lLnZpc2l0b3JJRDplLmlkP2UuaWQ6ZS51dWlkP2UudXVpZDoiIitlKSxlJiYiTk9UQVJHRVQiPT09KGU9ZS50b1VwcGVyQ2FzZSgpKSYmKGU9aiksZSYmKGU9PT1qfHxlLm1hdGNoKHRlLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpKXx8KGU9IiIpKSxlfSx2Ll9zZXRGaWVsZHM9ZnVuY3Rpb24oZSx0KXtpZih2Ll9jbGVhclRpbWVvdXQoZSksbnVsbCE9di5fbG9hZGluZyYmKHYuX2xvYWRpbmdbZV09ITEpLFUuZmllbGRHcm91cE9ialtlXSYmVS5zZXRTdGF0ZShlLCExKSxlPT09dyl7ITAhPT1VLmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEJiYoVS5pc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD0hMSk7dmFyIG49di5fZ2V0RmllbGQoRCk7aWYoIW58fHYub3ZlcndyaXRlQ3Jvc3NEb21haW5NQ0lEQW5kQUlEKXtpZighKG49Im9iamVjdCI9PT1xKHQpJiZ0Lm1pZD90Lm1pZDp2Ll9maW5kVmlzaXRvcklEKHQpKSl7aWYodi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciYmIXYudHJpZWQxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyKXJldHVybiB2LnRyaWVkMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlcj0hMCx2b2lkIHYuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKG51bGwsITEsITApO249di5fZ2VuZXJhdGVMb2NhbE1JRCgpfXYuX3NldEZpZWxkKEQsbil9biYmbiE9PWp8fChuPSIiKSwib2JqZWN0Ij09PXEodCkmJigodC5kX3JlZ2lvbnx8dC5kY3NfcmVnaW9ufHx0LmRfYmxvYnx8dC5ibG9iKSYmdi5fc2V0RmllbGRzKFAsdCksdi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciYmdC5taWQmJnYuX3NldEZpZWxkcyhTLHtpZDp0LmlkfSkpLHYuX2NhbGxBbGxDYWxsYmFja3MoRCxbbl0pfWlmKGU9PT1QJiYib2JqZWN0Ij09PXEodCkpe3ZhciByPTYwNDgwMDtudWxsIT10LmlkX3N5bmNfdHRsJiZ0LmlkX3N5bmNfdHRsJiYocj1wYXJzZUludCh0LmlkX3N5bmNfdHRsLDEwKSk7dmFyIGk9Ti5nZXRSZWdpb25BbmRDaGVja0lmQ2hhbmdlZCh0LHIpO3YuX2NhbGxBbGxDYWxsYmFja3MoIk1DQUFNTEgiLFtpXSk7dmFyIGE9di5fZ2V0RmllbGQoTyk7KHQuZF9ibG9ifHx0LmJsb2IpJiYoKGE9dC5kX2Jsb2IpfHwoYT10LmJsb2IpLHYuX3NldEZpZWxkRXhwaXJlKE8sciksdi5fc2V0RmllbGQoTyxhKSksYXx8KGE9IiIpLHYuX2NhbGxBbGxDYWxsYmFja3MoTyxbYV0pLCF0LmVycm9yX21zZyYmdi5fbmV3Q3VzdG9tZXJJRHNIYXNoJiZ2Ll9zZXRGaWVsZCgiTUNDSURIIix2Ll9uZXdDdXN0b21lcklEc0hhc2gpfWlmKGU9PT1TKXt2YXIgbz12Ll9nZXRGaWVsZChUKTtvJiYhdi5vdmVyd3JpdGVDcm9zc0RvbWFpbk1DSURBbmRBSUR8fCgobz12Ll9maW5kVmlzaXRvcklEKHQpKT9vIT09aiYmdi5fc2V0RmllbGRFeHBpcmUoTywtMSk6bz1qLHYuX3NldEZpZWxkKFQsbykpLG8mJm8hPT1qfHwobz0iIiksdi5fY2FsbEFsbENhbGxiYWNrcyhULFtvXSl9aWYodi5pZFN5bmNEaXNhYmxlU3luY3N8fHYuZGlzYWJsZUlkU3luY3MpTi5pZENhbGxOb3RQcm9jZXNzc2VkPSEwO2Vsc2V7Ti5pZENhbGxOb3RQcm9jZXNzc2VkPSExO3ZhciBzPXt9O3MuaWJzPXQuaWJzLHMuc3ViZG9tYWluPXQuc3ViZG9tYWluLE4ucHJvY2Vzc0lEQ2FsbERhdGEocyl9aWYodD09PU9iamVjdCh0KSl7dmFyIGMsdTtkKCkmJnYuaXNBbGxvd2VkKCkmJihjPXYuX2dldEZpZWxkKCJNQ09QVE9VVCIpKTt2YXIgbD1XLnBhcnNlT3B0T3V0KHQsYyxqKTtjPWwub3B0T3V0LHU9bC5kX290dGwsdi5fc2V0RmllbGRFeHBpcmUoIk1DT1BUT1VUIix1LCEwKSx2Ll9zZXRGaWVsZCgiTUNPUFRPVVQiLGMpLHYuX2NhbGxBbGxDYWxsYmFja3MoIk1DT1BUT1VUIixbY10pfX0sdi5fbG9hZGluZz1udWxsLHYuX2dldFJlbW90ZUZpZWxkPWZ1bmN0aW9uKG4sZSx0LHIsaSl7dmFyIGEsbz0iIixzPUYuaXNGaXJzdFBhcnR5QW5hbHl0aWNzVmlzaXRvcklEQ2FsbChuKSxjPXtNQ0FBTUxIOiEwLE1DQUFNQjohMH07aWYoZCgpJiZ2LmlzQWxsb3dlZCgpKWlmKHYuX3JlYWRWaXNpdG9yKCksISghKG89di5fZ2V0RmllbGQobiwhMD09PWNbbl0pKXx8di5fZmllbGRzRXhwaXJlZCYmdi5fZmllbGRzRXhwaXJlZFtuXSl8fHYuZGlzYWJsZVRoaXJkUGFydHlDYWxscyYmIXMpb3x8KG49PT1EPyh2Ll9yZWdpc3RlckNhbGxiYWNrKG4sdCksbz12Ll9nZW5lcmF0ZUxvY2FsTUlEKCksdi5zZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChvKSk6bj09PVQ/KHYuX3JlZ2lzdGVyQ2FsbGJhY2sobix0KSxvPSIiLHYuc2V0QW5hbHl0aWNzVmlzaXRvcklEKG8pKTpyPSEobz0iIikpO2Vsc2UgaWYobj09PUR8fCJNQ09QVE9VVCI9PT1uP2E9dzoiTUNBQU1MSCI9PT1ufHxuPT09Tz9hPVA6bj09PVQmJihhPVMpLGEpcmV0dXJuIWV8fG51bGwhPXYuX2xvYWRpbmcmJnYuX2xvYWRpbmdbYV18fChudWxsPT12Ll9sb2FkaW5nJiYodi5fbG9hZGluZz17fSksdi5fbG9hZGluZ1thXT0hMCxhPT09UCYmKF89MCksdi5fbG9hZERhdGEoYSxlLGZ1bmN0aW9uKGUpe2lmKCF2Ll9nZXRGaWVsZChuKSl7ZSYmVS5zZXRTdGF0ZShhLCEwKTt2YXIgdD0iIjtuPT09RD90PXYuX2dlbmVyYXRlTG9jYWxNSUQoKTphPT09UCYmKHQ9e2Vycm9yX21zZzoidGltZW91dCJ9KSx2Ll9zZXRGaWVsZHMoYSx0KX19LGkpKSx2Ll9yZWdpc3RlckNhbGxiYWNrKG4sdCksb3x8KGV8fHYuX3NldEZpZWxkcyhhLHtpZDpqfSksIiIpO3JldHVybiBuIT09RCYmbiE9PVR8fG8hPT1qfHwocj0hKG89IiIpKSx0JiZyJiZ2Ll9jYWxsQ2FsbGJhY2sodCxbb10pLG99LHYuX3NldE1hcmtldGluZ0Nsb3VkRmllbGRzPWZ1bmN0aW9uKGUpe3YuX3JlYWRWaXNpdG9yKCksdi5fc2V0RmllbGRzKHcsZSl9LHYuX21hcEN1c3RvbWVySURzPWZ1bmN0aW9uKGUpe3YuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYihlLCEwKX0sdi5fc2V0QW5hbHl0aWNzRmllbGRzPWZ1bmN0aW9uKGUpe3YuX3JlYWRWaXNpdG9yKCksdi5fc2V0RmllbGRzKFMsZSl9LHYuX3NldEF1ZGllbmNlTWFuYWdlckZpZWxkcz1mdW5jdGlvbihlKXt2Ll9yZWFkVmlzaXRvcigpLHYuX3NldEZpZWxkcyhQLGUpfSx2Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhPWZ1bmN0aW9uKGUpe3ZhciB0PXYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyLG49IiIscj12Ll9nZXRGaWVsZChEKSxpPXYuX2dldEZpZWxkKE8sITApLGE9di5fZ2V0RmllbGQoVCksbz1hJiZhIT09aj8iJmRfY2lkX2ljPUFWSUQlMDEiK2VuY29kZVVSSUNvbXBvbmVudChhKToiIjtpZih2LmxvYWRTU0wmJnYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlJiYodD12LmF1ZGllbmNlTWFuYWdlclNlcnZlclNlY3VyZSksdCl7dmFyIHMsYyx1LGw9di5nZXRDdXN0b21lcklEcyghMCk7aWYobClmb3IoYyBpbiBsKXt2YXIgZD1sW2NdO2lmKCFXLmlzT2JqZWN0RW1wdHkoZCkpe3ZhciBmPSJuYW1lU3BhY2VzIj09PWM/IiZkX2NpZF9ucz0iOiImZF9jaWRfaWM9Ijtmb3IocyBpbiBkKUwocykmJih1PWRbc10sbys9ZitlbmNvZGVVUklDb21wb25lbnQocykrIiUwMSIrZW5jb2RlVVJJQ29tcG9uZW50KHUuaWQ/dS5pZDoiIikrKHUuYXV0aFN0YXRlPyIlMDEiK3UuYXV0aFN0YXRlOiIiKSl9fWV8fChlPSJfc2V0QXVkaWVuY2VNYW5hZ2VyRmllbGRzIik7dmFyIHA9Imh0dHAiKyh2LmxvYWRTU0w/InMiOiIiKSsiOi8vIit0KyIvaWQiLGc9ImRfdmlzaWRfdmVyPSIrdi52ZXJzaW9uKyh5JiYtMSE9PXAuaW5kZXhPZigiZGVtZGV4Lm5ldCIpPyImZ2Rwcj0xJmdkcHJfY29uc2VudD0iK3k6IiIpKyhfJiYtMSE9PXAuaW5kZXhPZigiZGVtZGV4Lm5ldCIpPyImZF9jZj0iK186IiIpKyImZF9ydGJkPWpzb24mZF92ZXI9MiIrKCFyJiZ2Ll91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyPyImZF92ZXJpZnk9MSI6IiIpKyImZF9vcmdpZD0iK2VuY29kZVVSSUNvbXBvbmVudCh2Lm1hcmtldGluZ0Nsb3VkT3JnSUQpKyImZF9uc2lkPSIrKHYuaWRTeW5jQ29udGFpbmVySUR8fDApKyhyPyImZF9taWQ9IitlbmNvZGVVUklDb21wb25lbnQocik6IiIpKyh2LmlkU3luY0Rpc2FibGUzcmRQYXJ0eVN5bmNpbmd8fHYuZGlzYWJsZVRoaXJkUGFydHlDb29raWVzPyImZF9jb3BwYT10cnVlIjoiIikrKCEwPT09ST8iJmRfY29vcF9zYWZlPTEiOiExPT09ST8iJmRfY29vcF91bnNhZmU9MSI6IiIpKyhpPyImZF9ibG9iPSIrZW5jb2RlVVJJQ29tcG9uZW50KGkpOiIiKStvLG09WyJzX2NfaWwiLHYuX2luLGVdO3JldHVybnt1cmw6bj1wKyI/IitnKyImZF9jYj1zX2NfaWwlNUIiK3YuX2luKyIlNUQuIitlLGNvcnNVcmw6cCsiPyIrZyxjYWxsYmFjazptfX1yZXR1cm57dXJsOm59fSx2LmFwcGVuZFZpc2l0b3JJRHNUbz1mdW5jdGlvbihlKXt0cnl7dmFyIHQ9W1tELHYuX2dldEZpZWxkKEQpXSxbVCx2Ll9nZXRGaWVsZChUKV0sWyJNQ09SR0lEIix2Lm1hcmtldGluZ0Nsb3VkT3JnSURdXTtyZXR1cm4gdi5fYWRkUXVlcnlzdHJpbmdQYXJhbShlLHRlLkFET0JFX01DLG8odCkpfWNhdGNoKHQpe3JldHVybiBlfX0sdi5hcHBlbmRTdXBwbGVtZW50YWxEYXRhSURUbz1mdW5jdGlvbihlLHQpe2lmKCEodD10fHx2LmdldFN1cHBsZW1lbnRhbERhdGFJRChGLmdlbmVyYXRlUmFuZG9tU3RyaW5nKCksITApKSlyZXR1cm4gZTt0cnl7dmFyIG49byhbWyJTRElEIix0XSxbIk1DT1JHSUQiLHYubWFya2V0aW5nQ2xvdWRPcmdJRF1dKTtyZXR1cm4gdi5fYWRkUXVlcnlzdHJpbmdQYXJhbShlLHRlLkFET0JFX01DX1NESUQsbil9Y2F0Y2godCl7cmV0dXJuIGV9fTt2YXIgRj17cGFyc2VIYXNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiIyIpO3JldHVybiAwPHQ/ZS5zdWJzdHIodCk6IiJ9LGhhc2hsZXNzVXJsOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiIyIpO3JldHVybiAwPHQ/ZS5zdWJzdHIoMCx0KTplfSxhZGRRdWVyeVBhcmFtQXRMb2NhdGlvbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5zcGxpdCgiJiIpO3JldHVybiBuPW51bGwhPW4/bjpyLmxlbmd0aCxyLnNwbGljZShuLDAsdCksci5qb2luKCImIil9LGlzRmlyc3RQYXJ0eUFuYWx5dGljc1Zpc2l0b3JJRENhbGw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPT09VCYmKHR8fCh0PXYudHJhY2tpbmdTZXJ2ZXIpLG58fChuPXYudHJhY2tpbmdTZXJ2ZXJTZWN1cmUpLCEoInN0cmluZyIhPXR5cGVvZihyPXYubG9hZFNTTD9uOnQpfHwhci5sZW5ndGgpJiZyLmluZGV4T2YoIjJvNy5uZXQiKTwwJiZyLmluZGV4T2YoIm9tdHJkYy5uZXQiKTwwKTt2YXIgcn0saXNPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIEJvb2xlYW4oZSYmZT09PU9iamVjdChlKSl9LHJlbW92ZUNvb2tpZTpmdW5jdGlvbihlKXtLLnJlbW92ZShlLHtkb21haW46di5jb29raWVEb21haW59KX0saXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZDpmdW5jdGlvbigpe3JldHVybiEhdi50cmFja2luZ1NlcnZlcnx8ISF2LnRyYWNraW5nU2VydmVyU2VjdXJlfSxnZXRUaW1lc3RhbXBJblNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpfSxwYXJzZVBpcGVEZWxpbWV0ZWRLZXlWYWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoInwiKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwbGl0KCI9Iik7cmV0dXJuIGVbblswXV09ZGVjb2RlVVJJQ29tcG9uZW50KG5bMV0pLGV9LHt9KX0sZ2VuZXJhdGVSYW5kb21TdHJpbmc6ZnVuY3Rpb24oZSl7ZT1lfHw1O2Zvcih2YXIgdD0iIixuPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiO2UtLTspdCs9bltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbi5sZW5ndGgpXTtyZXR1cm4gdH0sbm9ybWFsaXplQm9vbGVhbjpmdW5jdGlvbihlKXtyZXR1cm4idHJ1ZSI9PT1lfHwiZmFsc2UiIT09ZSYmZX0scGFyc2VCb29sZWFuOmZ1bmN0aW9uKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiZudWxsfSxyZXBsYWNlTWV0aG9kc1dpdGhGdW5jdGlvbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dJiYoZVtuXT10KTtyZXR1cm4gZX19O3YuX2hlbHBlcnM9Rjt2YXIgTj1uZSh2LEUpO3YuX2Rlc3RpbmF0aW9uUHVibGlzaGluZz1OLHYudGltZW91dE1ldHJpY3NMb2c9W107dmFyIEIsVT17aXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQ6bnVsbCxNQ0lEQ2FsbFRpbWVkT3V0Om51bGwsQW5hbHl0aWNzSURDYWxsVGltZWRPdXQ6bnVsbCxBQU1JRENhbGxUaW1lZE91dDpudWxsLGZpZWxkR3JvdXBPYmo6e30sc2V0U3RhdGU6ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZSl7Y2FzZSB3OiExPT09dD8hMCE9PXRoaXMuTUNJRENhbGxUaW1lZE91dCYmKHRoaXMuTUNJRENhbGxUaW1lZE91dD0hMSk6dGhpcy5NQ0lEQ2FsbFRpbWVkT3V0PXQ7YnJlYWs7Y2FzZSBTOiExPT09dD8hMCE9PXRoaXMuQW5hbHl0aWNzSURDYWxsVGltZWRPdXQmJih0aGlzLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0PSExKTp0aGlzLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0PXQ7YnJlYWs7Y2FzZSBQOiExPT09dD8hMCE9PXRoaXMuQUFNSURDYWxsVGltZWRPdXQmJih0aGlzLkFBTUlEQ2FsbFRpbWVkT3V0PSExKTp0aGlzLkFBTUlEQ2FsbFRpbWVkT3V0PXR9fX07di5pc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD1mdW5jdGlvbigpe3JldHVybiBVLmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEfSx2Lk1DSURDYWxsVGltZWRPdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gVS5NQ0lEQ2FsbFRpbWVkT3V0fSx2LkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0PWZ1bmN0aW9uKCl7cmV0dXJuIFUuQW5hbHl0aWNzSURDYWxsVGltZWRPdXR9LHYuQUFNSURDYWxsVGltZWRPdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gVS5BQU1JRENhbGxUaW1lZE91dH0sdi5pZFN5bmNHZXRPblBhZ2VTeW5jSW5mbz1mdW5jdGlvbigpe3JldHVybiB2Ll9yZWFkVmlzaXRvcigpLHYuX2dldEZpZWxkKCJNQ1NZTkNTT1AiKX0sdi5pZFN5bmNCeVVSTD1mdW5jdGlvbihlKXtpZighdi5pc09wdGVkT3V0KCkpe3ZhciB0PXMoZXx8e30pO2lmKHQuZXJyb3IpcmV0dXJuIHQuZXJyb3I7dmFyIG4scixpPWUudXJsLGE9ZW5jb2RlVVJJQ29tcG9uZW50LG89TjtyZXR1cm4gaT1pLnJlcGxhY2UoL15odHRwczovLCIiKS5yZXBsYWNlKC9eaHR0cDovLCIiKSxuPVcuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0KFsiIixlLmRwaWQsZS5kcHV1aWR8fCIiXSwiLCIpLHI9WyJpYnMiLGEoZS5kcGlkKSwiaW1nIixhKGkpLHQudHRsLCIiLG5dLG8uYWRkTWVzc2FnZShyLmpvaW4oInwiKSksby5yZXF1ZXN0VG9Qcm9jZXNzKCksIlN1Y2Nlc3NmdWxseSBxdWV1ZWQifX0sdi5pZFN5bmNCeURhdGFTb3VyY2U9ZnVuY3Rpb24oZSl7aWYoIXYuaXNPcHRlZE91dCgpKXJldHVybiBlPT09T2JqZWN0KGUpJiYic3RyaW5nIj09dHlwZW9mIGUuZHB1dWlkJiZlLmRwdXVpZC5sZW5ndGg/KGUudXJsPSIvL2RwbS5kZW1kZXgubmV0L2liczpkcGlkPSIrZS5kcGlkKyImZHB1dWlkPSIrZS5kcHV1aWQsdi5pZFN5bmNCeVVSTChlKSk6IkVycm9yOiBjb25maWcgb3IgY29uZmlnLmRwdXVpZCBpcyBlbXB0eSJ9LFZlKHYsTiksdi5fZ2V0Q29va2llVmVyc2lvbj1mdW5jdGlvbihlKXtlPWV8fHYuY29va2llUmVhZCh2LmNvb2tpZU5hbWUpO3ZhciB0PXRlLlZFUlNJT05fUkVHRVguZXhlYyhlKTtyZXR1cm4gdCYmMTx0Lmxlbmd0aD90WzFdOm51bGx9LHYuX3Jlc2V0QW1jdkNvb2tpZT1mdW5jdGlvbihlKXt2YXIgdD12Ll9nZXRDb29raWVWZXJzaW9uKCk7dCYmISQuaXNMZXNzVGhhbih0LGUpfHxGLnJlbW92ZUNvb2tpZSh2LmNvb2tpZU5hbWUpfSx2LnNldEFzQ29vcFNhZmU9ZnVuY3Rpb24oKXtJPSEwfSx2LnNldEFzQ29vcFVuc2FmZT1mdW5jdGlvbigpe0k9ITF9LGZ1bmN0aW9uKCl7aWYodi5jb25maWdzPU9iamVjdC5jcmVhdGUobnVsbCksRi5pc09iamVjdChuKSlmb3IodmFyIGUgaW4gbilMKGUpJiYodltlXT1uW2VdLHYuY29uZmlnc1tlXT1uW2VdKX0oKSx1KCksdi5pbml0PWZ1bmN0aW9uKCl7YygpJiYoYi5vcHRJbi5mZXRjaFBlcm1pc3Npb25zKG0sITApLCFiLm9wdEluLmlzQXBwcm92ZWQoYi5vcHRJbi5DYXRlZ29yaWVzLkVDSUQpKXx8Qnx8KEI9ITAsZnVuY3Rpb24oKXtpZihGLmlzT2JqZWN0KG4pKXt2LmlkU3luY0NvbnRhaW5lcklEPXYuaWRTeW5jQ29udGFpbmVySUR8fDAsST0iYm9vbGVhbiI9PXR5cGVvZiB2LmlzQ29vcFNhZmU/di5pc0Nvb3BTYWZlOkYucGFyc2VCb29sZWFuKHYuaXNDb29wU2FmZSksdi5yZXNldEJlZm9yZVZlcnNpb24mJnYuX3Jlc2V0QW1jdkNvb2tpZSh2LnJlc2V0QmVmb3JlVmVyc2lvbiksdi5fYXR0ZW1wdFRvUG9wdWxhdGVJZHNGcm9tVXJsKCksdi5fYXR0ZW1wdFRvUG9wdWxhdGVTZGlkRnJvbVVybCgpLHYuX3JlYWRWaXNpdG9yKCk7dmFyIGU9di5fZ2V0RmllbGQoQSksdD1NYXRoLmNlaWwoKG5ldyBEYXRlKS5nZXRUaW1lKCkvdGUuTUlMTElTX1BFUl9EQVkpO3YuaWRTeW5jRGlzYWJsZVN5bmNzfHx2LmRpc2FibGVJZFN5bmNzfHwhTi5jYW5NYWtlU3luY0lEQ2FsbChlLHQpfHwodi5fc2V0RmllbGRFeHBpcmUoTywtMSksdi5fc2V0RmllbGQoQSx0KSksdi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KCksdi5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKCksdi5fbWVyZ2VTZXJ2ZXJTdGF0ZSh2LnNlcnZlclN0YXRlKX1lbHNlIHYuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybCgpLHYuX2F0dGVtcHRUb1BvcHVsYXRlU2RpZEZyb21VcmwoKX0oKSxmdW5jdGlvbigpe2lmKCF2LmlkU3luY0Rpc2FibGVTeW5jcyYmIXYuZGlzYWJsZUlkU3luY3Mpe04uY2hlY2tEUElmcmFtZVNyYygpO3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9TjtlLnJlYWR5VG9BdHRhY2hJZnJhbWUoKSYmZS5hdHRhY2hJZnJhbWUoKX07ay5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe0Uud2luZG93TG9hZGVkPSEwLGUoKX0pO3RyeXtKLnJlY2VpdmVNZXNzYWdlKGZ1bmN0aW9uKGUpe04ucmVjZWl2ZU1lc3NhZ2UoZS5kYXRhKX0sTi5pZnJhbWVIb3N0KX1jYXRjaChlKXt9fX0oKSx2LndoaXRlbGlzdElmcmFtZURvbWFpbnMmJnRlLlBPU1RfTUVTU0FHRV9FTkFCTEVEJiYodi53aGl0ZWxpc3RJZnJhbWVEb21haW5zPXYud2hpdGVsaXN0SWZyYW1lRG9tYWlucyBpbnN0YW5jZW9mIEFycmF5P3Yud2hpdGVsaXN0SWZyYW1lRG9tYWluczpbdi53aGl0ZWxpc3RJZnJhbWVEb21haW5zXSx2LndoaXRlbGlzdElmcmFtZURvbWFpbnMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uZXcgRyhyLGUpLG49WSh2LHQpO0oucmVjZWl2ZU1lc3NhZ2UobixlKX0pKSl9fTtVZS5jb25maWc9Qjt2YXIgcWU9ei5WaXNpdG9yPVVlLHplPWZ1bmN0aW9uKGkpe2lmKFcuaXNPYmplY3QoaSkpcmV0dXJuIE9iamVjdC5rZXlzKGkpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iIiE9PWlbZV19KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj1CLm5vcm1hbGl6ZUNvbmZpZyhpW3RdKSxyPVcubm9ybWFsaXplQm9vbGVhbihuKTtyZXR1cm4gZVt0XT1yLGV9LE9iamVjdC5jcmVhdGUobnVsbCkpfSxIZT1NZS5PcHRJbixXZT1NZS5JYWJQbHVnaW47cWUuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24ocixlKXtpZighcil0aHJvdyBuZXcgRXJyb3IoIlZpc2l0b3IgcmVxdWlyZXMgQWRvYmUgTWFya2V0aW5nIENsb3VkIE9yZyBJRC4iKTtyLmluZGV4T2YoIkAiKTwwJiYocis9IkBBZG9iZU9yZyIpO3ZhciB0PWZ1bmN0aW9uKCl7dmFyIGU9ei5zX2NfaWw7aWYoZSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihuJiYiVmlzaXRvciI9PT1uLl9jJiZuLm1hcmtldGluZ0Nsb3VkT3JnSUQ9PT1yKXJldHVybiBufX0oKTtpZih0KXJldHVybiB0O3ZhciBpLG49emUoZSk7aT1ufHx7fSx6LmFkb2JlLm9wdEluPXouYWRvYmUub3B0SW58fGZ1bmN0aW9uKCl7dmFyIGU9Vy5wbHVjayhpLFsiZG9lc09wdEluQXBwbHkiLCJwcmV2aW91c1Blcm1pc3Npb25zIiwicHJlT3B0SW5BcHByb3ZhbHMiLCJpc09wdEluU3RvcmFnZUVuYWJsZWQiLCJvcHRJblN0b3JhZ2VFeHBpcnkiLCJpc0lhYkNvbnRleHQiXSksdD1pLm9wdEluQ29va2llRG9tYWlufHxpLmNvb2tpZURvbWFpbjt0PSh0PXR8fFEoKSk9PT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWU/IiI6dCxlLm9wdEluQ29va2llRG9tYWluPXQ7dmFyIG49bmV3IEhlKGUse2Nvb2tpZXM6S30pO2lmKGUuaXNJYWJDb250ZXh0JiZlLmRvZXNPcHRJbkFwcGx5KXt2YXIgcj1uZXcgV2U7bi5yZWdpc3RlclBsdWdpbihyKX1yZXR1cm4gbn0oKTt2YXIgYT1yLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIiksbz1uZXcgcWUocixudWxsLGEpO1cuaXNPYmplY3QobikmJm4uY29va2llRG9tYWluJiYoby5jb29raWVEb21haW49bi5jb29raWVEb21haW4pLHouc19jX2lsLnNwbGljZSgtLXouc19jX2luLDEpO3ZhciBzPVcuZ2V0SWVWZXJzaW9uKCk7aWYoIm51bWJlciI9PXR5cGVvZiBzJiZzPDEwKXJldHVybiBvLl9oZWxwZXJzLnJlcGxhY2VNZXRob2RzV2l0aEZ1bmN0aW9uKG8sZnVuY3Rpb24oKXt9KTt2YXIgYyx1PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB6LnNlbGYhPT16LnBhcmVudH1jYXRjaChyKXtyZXR1cm4hMH19KCkmJigoYz1vKS5jb29raWVXcml0ZSgiVEVTVF9BTUNWX0NPT0tJRSIsIlQiLDEpLCJUIiE9PWMuY29va2llUmVhZCgiVEVTVF9BTUNWX0NPT0tJRSIpfHwoYy5faGVscGVycy5yZW1vdmVDb29raWUoIlRFU1RfQU1DVl9DT09LSUUiKSwwKSkmJnoucGFyZW50P25ldyBPKHIsbixvLHoucGFyZW50KTpuZXcgcWUocixuLGEpO3JldHVybiBvPW51bGwsdS5pbml0KCksdX0sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cWUud2luZG93TG9hZGVkPSEwfXouYWRkRXZlbnRMaXN0ZW5lcj96LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpOnouYXR0YWNoRXZlbnQmJnouYXR0YWNoRXZlbnQoIm9ubG9hZCIsZSkscWUuY29kZUxvYWRFbmQ9KG5ldyBEYXRlKS5nZXRUaW1lKCl9KCl9KCksVmlzaXRvcil9fSwiYWRvYmUtbWNpZC9zcmMvdmlldy91dGlscy90aW1lVW5pdHMuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e0hvdXJzOjM2MDAsRGF5czo4NjQwMCxXZWVrczo2MDQ4MDAsTW9udGhzOjI1OTJlMyxZZWFyczozMTUzNmUzfTtlLmV4cG9ydHM9dH19fSxzZXR0aW5nczp7b3JnSWQ6IiVtY29yZ0lEJSIsdmFyaWFibGVzOlt7bmFtZToibG9hZFRpbWVvdXQiLHZhbHVlOiI3MDAwIn0se25hbWU6InRyYWNraW5nU2VydmVyIix2YWx1ZToibWV0cmljcy5mZWRleC5jb20ifSx7bmFtZToidHJhY2tpbmdTZXJ2ZXJTZWN1cmUiLHZhbHVlOiJzbWV0cmljcy5mZWRleC5jb20ifSx7bmFtZToibWFya2V0aW5nQ2xvdWRTZXJ2ZXIiLHZhbHVlOiJtZXRyaWNzLmZlZGV4LmNvbSJ9LHtuYW1lOiJtYXJrZXRpbmdDbG91ZFNlcnZlclNlY3VyZSIsdmFsdWU6InNtZXRyaWNzLmZlZGV4LmNvbSJ9LHtuYW1lOiJkaXNhYmxlSWRTeW5jcyIsdmFsdWU6IiVhYW06SWRTeW5jRGlzYWJsZSUifSx7bmFtZToiaWRTeW5jQ29udGFpbmVySUQiLHZhbHVlOiIlYWFtOlJlZ2lvbkNvbnRhaW5lck5TSUQlIn1dfSxob3N0ZWRMaWJGaWxlc0Jhc2VVcmw6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQNjQzN2ZhNzhhYjAyNDk0NmEyMTEzOTc2ODkwNTIzODEvIn0sImFkb2JlLWFuYWx5dGljcyI6e2Rpc3BsYXlOYW1lOiJBZG9iZSBBbmFseXRpY3MiLG1vZHVsZXM6eyJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcyI6e25hbWU6InNldC12YXJpYWJsZXMiLGRpc3BsYXlOYW1lOiJTZXQgVmFyaWFibGVzIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO3ZhciBpPW4oIi4uL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlciIpLGE9bigiLi4vaGVscGVycy9hcHBseVRyYWNrZXJWYXJpYWJsZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gaSgpLnRoZW4oZnVuY3Rpb24oZSl7ci5sb2dnZXIuaW5mbygiU2V0IHZhcmlhYmxlcyBvbiB0aGUgdHJhY2tlci4iKSxhKGUsdC50cmFja2VyUHJvcGVydGllcyksdC5jdXN0b21TZXR1cCYmdC5jdXN0b21TZXR1cC5zb3VyY2UmJnQuY3VzdG9tU2V0dXAuc291cmNlLmNhbGwobi5lbGVtZW50LG4sZSl9LGZ1bmN0aW9uKGUpe3IubG9nZ2VyLmVycm9yKCJDYW5ub3Qgc2V0IHZhcmlhYmxlczogIitlKX0pfX19LCJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiOntuYW1lOiJzZW5kLWJlYWNvbiIsZGlzcGxheU5hbWU6IlNlbmQgQmVhY29uIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4saSl7InVzZSBzdHJpY3QiO3ZhciByPW4oIi4uL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlciIpLGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUubm9kZU5hbWUmJiJhIj09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0sbz1mdW5jdGlvbihlKXtyZXR1cm4gYShlKT9lLmlubmVySFRNTDoibGluayBjbGlja2VkIn0scz1mdW5jdGlvbihlLHQsbil7aWYoInBhZ2UiPT09dC50eXBlKWkubG9nZ2VyLmluZm8oIkZpcmluZyBwYWdlIHZpZXcgYmVhY29uLiIpLGUudCgpO2Vsc2V7dmFyIHI9e2xpbmtUeXBlOnQubGlua1R5cGV8fCJvIixsaW5rTmFtZTp0LmxpbmtOYW1lfHxvKG4pfTtpLmxvZ2dlci5pbmZvKCJGaXJpbmcgbGluayB0cmFjayBiZWFjb24gdXNpbmcgdGhlIHZhbHVlczogIitKU09OLnN0cmluZ2lmeShyKSsiLiIpLGUudGwoYShuKT9uOiJ0cnVlIixyLmxpbmtUeXBlLHIubGlua05hbWUpfX07ZS5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHIoKS50aGVuKGZ1bmN0aW9uKGUpe3MoZSx0LG4uZWxlbWVudCl9LGZ1bmN0aW9uKGUpe2kubG9nZ2VyLmVycm9yKCJDYW5ub3Qgc2VuZCBiZWFjb246ICIrZSl9KX19fSwiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcyI6e25hbWU6ImNsZWFyLXZhcmlhYmxlcyIsZGlzcGxheU5hbWU6IkNsZWFyIFZhcmlhYmxlcyIsc2NyaXB0OmZ1bmN0aW9uKGUsdCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKCIuLi9zaGFyZWRNb2R1bGVzL2dldFRyYWNrZXIiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gaSgpLnRoZW4oZnVuY3Rpb24oZSl7ZS5jbGVhclZhcnMmJihyLmxvZ2dlci5pbmZvKCJDbGVhciB2YXJpYWJsZXMuIiksZS5jbGVhclZhcnMoKSl9LGZ1bmN0aW9uKGUpe3IubG9nZ2VyLmVycm9yKCJDYW5ub3QgY2xlYXIgdmFyaWFibGVzOiAiK2UpfSl9fX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlci5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGksYT1uKCJAYWRvYmUvcmVhY3Rvci1jb29raWUiKSxvPW4oIkBhZG9iZS9yZWFjdG9yLXByb21pc2UiKSxzPW4oIkBhZG9iZS9yZWFjdG9yLXdpbmRvdyIpLGM9bigiLi4vaGVscGVycy9zZXR0aW5nc0hlbHBlciIpLHU9bigiLi4vaGVscGVycy9hdWdtZW50ZXJzIiksbD1uKCIuLi9oZWxwZXJzL2FwcGx5VHJhY2tlclZhcmlhYmxlcyIpLGQ9bigiLi4vaGVscGVycy9sb2FkTGlicmFyeSIpLGY9bigiLi4vaGVscGVycy9nZW5lcmF0ZVZlcnNpb24iKShyLmJ1aWxkSW5mby50dXJiaW5lQnVpbGREYXRlKSxwPSJiZWZvcmVTZXR0aW5ncyIsZz1yLmdldFNoYXJlZE1vZHVsZSgiYWRvYmUtbWNpZCIsIm1jaWQtaW5zdGFuY2UiKSxtPWZ1bmN0aW9uKGUpe3JldHVybiFlfHwidHJ1ZSI9PT1hLmdldChlKX0saD1mdW5jdGlvbihyKXtyZXR1cm4gby5hbGwodS5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ7dHJ5e3Q9ZShyKX1jYXRjaChuKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgbn0pfXJldHVybiBvLnJlc29sdmUodCl9KSkudGhlbihmdW5jdGlvbigpe3JldHVybiByfSl9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIGcmJihyLmxvZ2dlci5pbmZvKCJTZXR0aW5nIE1DSUQgaW5zdGFuY2Ugb24gdGhlIHRyYWNrZXIuIiksZS52aXNpdG9yPWcpLGV9LGI9ZnVuY3Rpb24oZSl7cmV0dXJuIHIubG9nZ2VyLmluZm8oJ1NldHRpbmcgdmVyc2lvbiBvbiB0cmFja2VyOiAiJytmKyciLicpLCJ1bmRlZmluZWQiIT10eXBlb2YgZS50YWdDb250YWluZXJNYXJrZXI/ZS50YWdDb250YWluZXJNYXJrZXI9Zjoic3RyaW5nIj09dHlwZW9mIGUudmVyc2lvbiYmZS52ZXJzaW9uLnN1YnN0cmluZyhlLnZlcnNpb24ubGVuZ3RoLTUpIT09Ii0iK2YmJihlLnZlcnNpb24rPSItIitmKSxlfSx5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5sb2FkUGhhc2U9PT1wJiZ0LnNvdXJjZSYmKHIubG9nZ2VyLmluZm8oIkNhbGxpbmcgY3VzdG9tIHNjcmlwdCBiZWZvcmUgc2V0dGluZ3MuIiksdC5zb3VyY2UuY2FsbChzLG4pKSxsKG4sZXx8e30pLHQubG9hZFBoYXNlIT09cCYmdC5zb3VyY2UmJihyLmxvZ2dlci5pbmZvKCJDYWxsaW5nIGN1c3RvbSBzY3JpcHQgYWZ0ZXIgc2V0dGluZ3MuIiksdC5zb3VyY2UuY2FsbChzLG4pKSxufSxfPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGMuaXNBdWRpZW5jZU1hbmFnZW1lbnRFbmFibGVkKGUpJiYodC5sb2FkTW9kdWxlKCJBdWRpZW5jZU1hbmFnZW1lbnQiKSxyLmxvZ2dlci5pbmZvKCJJbml0aWFsaXppbmcgQXVkaWVuY2VNYW5hZ2VtZW50IG1vZHVsZSIpLHQuQXVkaWVuY2VNYW5hZ2VtZW50LnNldHVwKGUubW9kdWxlUHJvcGVydGllcy5hdWRpZW5jZU1hbmFnZXIuY29uZmlnKSksdH0sQz0oaT1yLmdldEV4dGVuc2lvblNldHRpbmdzKCksbShpLnRyYWNraW5nQ29va2llTmFtZSk/ZChpKS50aGVuKGgpLnRoZW4odikudGhlbihiKS50aGVuKHkuYmluZChudWxsLGkudHJhY2tlclByb3BlcnRpZXMsaS5jdXN0b21TZXR1cHx8e30pKS50aGVuKF8uYmluZChudWxsLGkpKTpvLnJlamVjdCgiRVUgY29tcGxpYW5jZSB3YXMgbm90IGFja25vd2xlZGdlZCBieSB0aGUgdXNlci4iKSk7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIEN9fSxuYW1lOiJnZXQtdHJhY2tlciIsc2hhcmVkOiEwfSwiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvc2hhcmVkTW9kdWxlcy9hdWdtZW50VHJhY2tlci5qcyI6e25hbWU6ImF1Z21lbnQtdHJhY2tlciIsc2hhcmVkOiEwLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIi4uL2hlbHBlcnMvYXVnbWVudGVycyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyLnB1c2goZSl9fX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvYXBwbHlUcmFja2VyVmFyaWFibGVzLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKCJAYWRvYmUvcmVhY3Rvci1xdWVyeS1zdHJpbmciKSxhPW4oIkBhZG9iZS9yZWFjdG9yLXdpbmRvdyIpLHM9L2VWYXIoWzAtOV0rKS8sYz0vcHJvcChbMC05XSspLyx1PW5ldyBSZWdFeHAoIl4oZVZhclswLTldKyl8KHByb3BbMC05XSspfChoaWVyWzAtOV0rKXxjYW1wYWlnbnxwdXJjaGFzZUlEfGNoYW5uZWx8c2VydmVyfHN0YXRlfHppcHxwYWdlVHlwZSQiKSxsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi5pbmRleE9mKGUpPT09dH0sZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9T2JqZWN0LmtleXModCkuZmlsdGVyKHUudGVzdC5iaW5kKHUpKTtyZXR1cm4gbiYmci5wdXNoKCJldmVudHMiKSwocj1yLmNvbmNhdCgoZS5saW5rVHJhY2tWYXJzfHwiIikuc3BsaXQoIiwiKSkpLmZpbHRlcihmdW5jdGlvbihlLHQpe3JldHVybiJOb25lIiE9PWUmJmUmJmwoZSx0LHIpfSkuam9pbigiLCIpfSxmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZX0pO3JldHVybihuPW4uY29uY2F0KChlLmxpbmtUcmFja0V2ZW50c3x8IiIpLnNwbGl0KCIsIikpKS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4iTm9uZSIhPT1lJiZsKGUsdCxuKX0pLmpvaW4oIiwiKX0scj1mdW5jdGlvbihlLHQsbil7ZVt0XT1uW3RdLmpvaW4oIiwiKX0scD1mdW5jdGlvbihpLGUsdCl7dmFyIGE9dC5keW5hbWljVmFyaWFibGVQcmVmaXh8fCJEPSI7dFtlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJ2YWx1ZSI9PT1lLnR5cGUpdD1lLnZhbHVlO2Vsc2V7dmFyIG49cy5leGVjKGUudmFsdWUpO2lmKG4pdD1hKyJ2IituWzFdO2Vsc2V7dmFyIHI9Yy5leGVjKGUudmFsdWUpO3ImJih0PWErImMiK3JbMV0pfX1pW2UubmFtZV09dH0pfSxnPXtsaW5rRG93bmxvYWRGaWxlVHlwZXM6cixsaW5rRXh0ZXJuYWxGaWx0ZXJzOnIsbGlua0ludGVybmFsRmlsdGVyczpyLGhpZXJhcmNoaWVzOmZ1bmN0aW9uKHQsZSxuKXtuW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlLm5hbWVdPWUuc2VjdGlvbnMuam9pbihlLmRlbGltaXRlcil9KX0scHJvcHM6cCxlVmFyczpwLGNhbXBhaWduOmZ1bmN0aW9uKGUsdCxuKXtpZigicXVlcnlQYXJhbSI9PT1uW3RdLnR5cGUpe3ZhciByPWkucGFyc2UoYS5sb2NhdGlvbi5zZWFyY2gpO2VbdF09cltuW3RdLnZhbHVlXX1lbHNlIGVbdF09blt0XS52YWx1ZX0sZXZlbnRzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uW3RdLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLm5hbWU7cmV0dXJuIGUuaWQmJih0PVt0LGUuaWRdLmpvaW4oIjoiKSksZS52YWx1ZSYmKHQ9W3QsZS52YWx1ZV0uam9pbigiPSIpKSx0fSk7ZVt0XT1yLmpvaW4oIiwiKX19O2UuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3ZhciBpPXt9O3I9cnx8e30sT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1nW2VdLG49cltlXTt0P3QoaSxlLHIpOmlbZV09bn0pLGkuZXZlbnRzJiZ0LmV2ZW50cyYmMDx0LmV2ZW50cy5sZW5ndGgmJihpLmV2ZW50cz10LmV2ZW50cysiLCIraS5ldmVudHMpO3ZhciBlPXImJnIuZXZlbnRzJiYwPHIuZXZlbnRzLmxlbmd0aCxuPWQodCxpLGUpO24mJihpLmxpbmtUcmFja1ZhcnM9bik7dmFyIGE9Zih0LHIuZXZlbnRzfHxbXSk7YSYmKGkubGlua1RyYWNrRXZlbnRzPWEpLG8ubG9nZ2VyLmluZm8oJ0FwcGx5aW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiB0cmFja2VyOiAiJytKU09OLnN0cmluZ2lmeShpKSsnIi4nKSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09aVtlXX0pfX19LCJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL3NldHRpbmdzSGVscGVyLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKCJAYWRvYmUvcmVhY3Rvci13aW5kb3ciKSxhPXtMSUJfVFlQRVM6e01BTkFHRUQ6Im1hbmFnZWQiLFBSRUlOU1RBTExFRDoicHJlaW5zdGFsbGVkIixSRU1PVEU6InJlbW90ZSIsQ1VTVE9NOiJjdXN0b20ifSxNQU5BR0VEX0xJQl9QQVRIUzp7QVBQX01FQVNVUkVNRU5UOiJBcHBNZWFzdXJlbWVudC5qcyIsQUNUSVZJVFlfTUFQOiJBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQWN0aXZpdHlNYXAuanMiLEFVRElFTkNFX01BTkFHRU1FTlQ6IkFwcE1lYXN1cmVtZW50X01vZHVsZV9BdWRpZW5jZU1hbmFnZW1lbnQuanMifSxnZXRSZXBvcnRTdWl0ZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9kdWN0aW9uO3JldHVybiBlW3IuYnVpbGRJbmZvLmVudmlyb25tZW50XSYmKHQ9ZVtyLmJ1aWxkSW5mby5lbnZpcm9ubWVudF0pLHQuam9pbigiLCIpfSxpc0FjdGl2aXR5TWFwRW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4hKGUubGlicmFyeUNvZGUmJiFlLmxpYnJhcnlDb2RlLnVzZUFjdGl2aXR5TWFwJiYhMT09PWUubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXApfSxpc0F1ZGllbmNlTWFuYWdlbWVudEVuYWJsZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGUmJmUubW9kdWxlUHJvcGVydGllcyYmZS5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlciYmZS5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcmJmkmJmkuX3NhdGVsbGl0ZSYmaS5fc2F0ZWxsaXRlLmNvbXBhbnkmJmkuX3NhdGVsbGl0ZS5jb21wYW55Lm9yZ0lkJiYodD0hMCksdH19O2UuZXhwb3J0cz1hfX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvYXVnbWVudGVycy5qcyI6e3NjcmlwdDpmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPVtdfX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvbG9hZExpYnJhcnkuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO3ZhciBpPW4oIkBhZG9iZS9yZWFjdG9yLWxvYWQtc2NyaXB0IiksYT1uKCJAYWRvYmUvcmVhY3Rvci13aW5kb3ciKSxvPW4oIkBhZG9iZS9yZWFjdG9yLXByb21pc2UiKSxzPW4oIi4vc2V0dGluZ3NIZWxwZXIiKSxjPW4oIi4vcG9sbEhlbHBlciIpLHU9ZnVuY3Rpb24oZSx0KXtpZighYS5zX2dpKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBBcHBNZWFzdXJlbWVudCB0cmFja2VyLCBgc19naWAgZnVuY3Rpb24gbm90IGZvdW5kLiIrYS5BcHBNZWFzdXJlbWVudCk7ci5sb2dnZXIuaW5mbygnQ3JlYXRpbmcgQXBwTWVhc3VyZW1lbnQgdHJhY2tlciB3aXRoIHRoZXNlIHJlcG9ydCBzdWl0ZXM6ICInK3QrJyInKTt2YXIgbj1hLnNfZ2kodCk7cmV0dXJuIGUubGlicmFyeUNvZGUuc2NvcGVUcmFja2VyR2xvYmFsbHkmJihyLmxvZ2dlci5pbmZvKCJTZXR0aW5nIHRoZSB0cmFja2VyIGFzIHdpbmRvdy5zIiksYS5zPW4pLG59LGw9ZnVuY3Rpb24oZSl7dmFyIHQ9W107c3dpdGNoKGUubGlicmFyeUNvZGUudHlwZSl7Y2FzZSBzLkxJQl9UWVBFUy5NQU5BR0VEOnQucHVzaChyLmdldEhvc3RlZExpYkZpbGVVcmwocy5NQU5BR0VEX0xJQl9QQVRIUy5BUFBfTUVBU1VSRU1FTlQpKSxzLmlzQWN0aXZpdHlNYXBFbmFibGVkKGUpJiZ0LnB1c2goci5nZXRIb3N0ZWRMaWJGaWxlVXJsKHMuTUFOQUdFRF9MSUJfUEFUSFMuQUNUSVZJVFlfTUFQKSk7YnJlYWs7Y2FzZSBzLkxJQl9UWVBFUy5DVVNUT006dC5wdXNoKGUubGlicmFyeUNvZGUuc291cmNlKTticmVhaztjYXNlIHMuTElCX1RZUEVTLlJFTU9URTp0LnB1c2goImh0dHBzOiI9PT1hLmxvY2F0aW9uLnByb3RvY29sP2UubGlicmFyeUNvZGUuaHR0cHNVcmw6ZS5saWJyYXJ5Q29kZS5odHRwVXJsKX1pZihzLmlzQXVkaWVuY2VNYW5hZ2VtZW50RW5hYmxlZChlKSl7dmFyIG49e25hbWVzcGFjZTphLl9zYXRlbGxpdGUuY29tcGFueS5vcmdJZH07ZS5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcudmlzaXRvclNlcnZpY2U9bix0LnB1c2goci5nZXRIb3N0ZWRMaWJGaWxlVXJsKHMuTUFOQUdFRF9MSUJfUEFUSFMuQVVESUVOQ0VfTUFOQUdFTUVOVCkpfXJldHVybiB0fSxkPWZ1bmN0aW9uKGUpe3JldHVybiBvLmFsbChsKGUpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gci5sb2dnZXIuaW5mbygiTG9hZGluZyBzY3JpcHQ6ICIrZSksaShlKX0pKX0sZj1mdW5jdGlvbihlLHQpe2lmKGUubGlicmFyeUNvZGUuYWNjb3VudHMpaWYodC5zYSl7dmFyIG49cy5nZXRSZXBvcnRTdWl0ZXMoZS5saWJyYXJ5Q29kZS5hY2NvdW50cyk7ci5sb2dnZXIuaW5mbygnU2V0dGluZyB0aGUgZm9sbG93aW5nIHJlcG9ydCBzdWl0ZXMgb24gdGhlIHRyYWNrZXI6ICInK24rJyInKSx0LnNhKG4pfWVsc2Ugci5sb2dnZXIud2FybigiQ2Fubm90IHNldCByZXBvcnQgc3VpdGVzIG9uIHRyYWNrZXIuIGBzYWAgbWV0aG9kIG5vdCBhdmFpbGFibGUuIik7cmV0dXJuIHR9LHA9ZnVuY3Rpb24oZSl7aWYoYVtlXSlyZXR1cm4gci5sb2dnZXIuaW5mbygnRm91bmQgdHJhY2tlciBsb2NhdGVkIGF0OiAiJytlKyciLicpLGFbZV07dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgZ2xvYmFsIHZhcmlhYmxlIG5hbWU6ICInK2UrJyIuJyl9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1kKGUpO3N3aXRjaChlLmxpYnJhcnlDb2RlLnR5cGUpe2Nhc2Ugcy5MSUJfVFlQRVMuTUFOQUdFRDp2YXIgbj1zLmdldFJlcG9ydFN1aXRlcyhlLmxpYnJhcnlDb2RlLmFjY291bnRzKTtyZXR1cm4gdC50aGVuKHUuYmluZChudWxsLGUsbikpO2Nhc2Ugcy5MSUJfVFlQRVMuUFJFSU5TVEFMTEVEOnJldHVybiB0LnRoZW4oYy5wb2xsLmJpbmQobnVsbCxhLGUubGlicmFyeUNvZGUudHJhY2tlclZhcmlhYmxlTmFtZSkpLnRoZW4oZi5iaW5kKG51bGwsZSkpO2Nhc2Ugcy5MSUJfVFlQRVMuQ1VTVE9NOmNhc2Ugcy5MSUJfVFlQRVMuUkVNT1RFOnJldHVybiB0LnRoZW4ocC5iaW5kKG51bGwsZS5saWJyYXJ5Q29kZS50cmFja2VyVmFyaWFibGVOYW1lKSkudGhlbihmLmJpbmQobnVsbCxlKSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIGxpYnJhcnkuIFR5cGUgbm90IHN1cHBvcnRlZC4iKX19fX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvZ2VuZXJhdGVWZXJzaW9uLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD04LG49ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKDM2KX0scj1mdW5jdGlvbihlKXtyZXR1cm4gZS5zdWJzdHIoZS5sZW5ndGgtMSl9LGk9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoZS5nZXRVVENIb3VycygpL3QpfSxhPWZ1bmN0aW9uKGUpe3ZhciB0PShlLmdldFVUQ01vbnRoKCkrMSsxMippKGUpKS50b1N0cmluZygzNik7cmV0dXJuIHIodCl9LG89ZnVuY3Rpb24oZSl7cmV0dXJuKGUuZ2V0VVRDRnVsbFllYXIoKS0yMDEwKS50b1N0cmluZygzNil9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlKTtpZihpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0ZSBwcm92aWRlZCIpO3JldHVybigiTCIrbyh0KSthKHQpK24odCkpLnRvVXBwZXJDYXNlKCl9fX0sImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvcG9sbEhlbHBlci5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbixyKXsidXNlIHN0cmljdCI7dmFyIG89bigiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLHM9NDAsYz0yNTAsdT1mdW5jdGlvbihlLHQsbil7ci5sb2dnZXIuaW5mbygnRm91bmQgcHJvcGVydHkgbG9jYXRlZCBhdDogIicrdCsnIl0uJyksZShuKX0saT1mdW5jdGlvbihpLGEpe3JldHVybiBuZXcgbyhmdW5jdGlvbihlLHQpe2lmKGlbYV0pcmV0dXJuIHUoZSxhLGlbYV0pO3ZhciBuPTEscj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lbYV0mJih1KGUsYSxpW2FdKSxjbGVhckludGVydmFsKHIpKSxzPD1uJiYoY2xlYXJJbnRlcnZhbChyKSx0KG5ldyBFcnJvcignQmFpbGluZyBvdXQuIENhbm5vdCBmaW5kIHRoZSB2YXJpYWJsZSBuYW1lOiAiJythKyciXS4nKSkpLG4rK30sYyl9KX07ZS5leHBvcnRzPXtwb2xsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIubG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZWNvbWUgYWNjZXNzaWJsZSBhdDogIicrdCsnIl0uJyksaShlLHQpfX19fX0sc2V0dGluZ3M6e29yZ0lkOiIxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmciLGxpYnJhcnlDb2RlOnt0eXBlOiJjdXN0b20iLHNvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L0VYYzJmMmM4MWQ4NDM0NDFiZmJlM2VmMDk0YTljZmYzOWQtbGlicmFyeUNvZGVfc291cmNlLm1pbi5qcyIsYWNjb3VudHM6e3N0YWdpbmc6WyJmZWRleGdsYmxkZXYiXSxwcm9kdWN0aW9uOlsiJXNBY2NvdW50JSJdLGRldmVsb3BtZW50OlsiZmVkZXhnbGJsZGV2Il19LHRyYWNrZXJWYXJpYWJsZU5hbWU6InMifSx0cmFja2VyUHJvcGVydGllczp7cHJvcHM6W3tuYW1lOiJwcm9wMiIsdHlwZToidmFsdWUiLHZhbHVlOiIlY29udGVudDpjb3VudHJ5Q29kZSUifSx7bmFtZToicHJvcDMiLHR5cGU6InZhbHVlIix2YWx1ZToiJWNvbnRlbnQ6bGFuZ3VhZ2UlIn1dLGN1cnJlbmN5Q29kZToiVVNEIix0cmFja2luZ1NlcnZlcjoibWV0cmljcy5mZWRleC5jb20iLHRyYWNrSW5saW5lU3RhdHM6ITAsdHJhY2tEb3dubG9hZExpbmtzOiEwLHRyYWNrRXh0ZXJuYWxMaW5rczohMCxsaW5rRXh0ZXJuYWxGaWx0ZXJzOlsib3Blbi5zcG90aWZ5LmNvbSIsInBvZGNhc3RzLmFwcGxlLmNvbSIsInNvdW5kY2xvdWQuY29tIiwid3d3LnN0aXRjaGVyLmNvbSIsImV2ZW50Lm9uMjQuY29tIiwiY3VzdG9tYnJhbmRlZGJveGVzLmZlZGV4LmNvbSIsImJpdC5seSIsInNwb3RpLmZpIiwiYXBwbGUuY28iXSxsaW5rSW50ZXJuYWxGaWx0ZXJzOltdLHRyYWNraW5nU2VydmVyU2VjdXJlOiJzbWV0cmljcy5mZWRleC5jb20iLGxpbmtEb3dubG9hZEZpbGVUeXBlczpbImRvYyIsImRvY3giLCJlcHMiLCJqcGciLCJwbmciLCJzdmciLCJ4bHMiLCJwcHQiLCJwcHR4IiwicGRmIiwieGxzeCIsInRhYiIsImNzdiIsInppcCIsInR4dCIsInZzZCIsInZ4ZCIsInhtbCIsImpzIiwiY3NzIiwicmFyIiwiZXhlIiwid21hIiwibW92IiwiYXZpIiwid212IiwibXAzIiwid2F2IiwibTR2IiwianBlZyJdfX0saG9zdGVkTGliRmlsZXNCYXNlVXJsOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vZXh0ZW5zaW9ucy9FUGJkZTJmN2NhMTRlNTQwMzk5ZGNjMWY4MjA4ODYwYjdiLyJ9LGNvcmU6e2Rpc3BsYXlOYW1lOiJDb3JlIixtb2R1bGVzOnsiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIjp7bmFtZToiY3VzdG9tLWNvZGUiLGRpc3BsYXlOYW1lOiJDdXN0b20gQ29kZSIsc2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zb3VyY2UodCl9fX0sImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzIjp7bmFtZToiamF2YXNjcmlwdC12YXJpYWJsZSIsZGlzcGxheU5hbWU6IkphdmFTY3JpcHQgVmFyaWFibGUiLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIi4uL2hlbHBlcnMvZ2V0T2JqZWN0UHJvcGVydHkuanMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIod2luZG93LGUucGF0aCl9fX0sImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMiOntuYW1lOiJxdWVyeS1zdHJpbmctcGFyYW1ldGVyIixkaXNwbGF5TmFtZToiUXVlcnkgU3RyaW5nIFBhcmFtZXRlciIsc2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIG89bigiQGFkb2JlL3JlYWN0b3Itd2luZG93Iikscz1uKCJAYWRvYmUvcmVhY3Rvci1xdWVyeS1zdHJpbmciKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9cy5wYXJzZShvLmxvY2F0aW9uLnNlYXJjaCk7aWYoIWUuY2FzZUluc2Vuc2l0aXZlKXJldHVybiB0W2UubmFtZV07Zm9yKHZhciBuPWUubmFtZS50b0xvd2VyQ2FzZSgpLHI9T2JqZWN0LmtleXModCksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgYT1yW2ldO2lmKGEudG9Mb3dlckNhc2UoKT09PW4pcmV0dXJuIHRbYV19fX19LCJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIjp7bmFtZToiY3VzdG9tLWNvZGUiLGRpc3BsYXlOYW1lOiJDdXN0b20gQ29kZSIsc2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zb3VyY2UuY2FsbCh0LmVsZW1lbnQsdCx0LnRhcmdldCl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyI6e25hbWU6ImxpYnJhcnktbG9hZGVkIixkaXNwbGF5TmFtZToiTGlicmFyeSBMb2FkZWQgKFBhZ2UgVG9wKSIsc2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyLnJlZ2lzdGVyTGlicmFyeUxvYWRlZFRyaWdnZXIodCl9fX0sImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiOntuYW1lOiJjdXN0b20tY29kZSIsZGlzcGxheU5hbWU6IkN1c3RvbSBDb2RlIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO3ZhciBpLGEsbyxzPW4oIkBhZG9iZS9yZWFjdG9yLWRvY3VtZW50IiksYz1uKCIuL2hlbHBlcnMvZGVjb3JhdGVDb2RlIiksdT1uKCIuL2hlbHBlcnMvbG9hZENvZGVTZXF1ZW50aWFsbHkiKSxsPW4oIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZSIpLGQ9ci5nZXRFeHRlbnNpb25TZXR0aW5ncygpLGY9KGk9ZnVuY3Rpb24oZSl7bChzLmJvZHksZSx7YmVmb3JlV3JpdGVUb2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gZC5jc3BOb25jZSYmInNjcmlwdCI9PT1lLnRhZ05hbWUmJihlLmF0dHJzLm5vbmNlPWQuY3NwTm9uY2UpLGV9LGVycm9yOmZ1bmN0aW9uKGUpe3IubG9nZ2VyLmVycm9yKGUubXNnKX19KX0sYT1bXSxvPWZ1bmN0aW9uKCl7aWYocy5ib2R5KWZvcig7YS5sZW5ndGg7KWkoYS5zaGlmdCgpKTtlbHNlIHNldFRpbWVvdXQobywyMCl9LGZ1bmN0aW9uKGUpe2EucHVzaChlKSxvKCl9KSxwPWZ1bmN0aW9uKCl7aWYocy5jdXJyZW50U2NyaXB0KXJldHVybiBzLmN1cnJlbnRTY3JpcHQuYXN5bmM7Zm9yKHZhciBlPXMucXVlcnlTZWxlY3RvckFsbCgic2NyaXB0IiksdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO2lmKC8obGF1bmNofHNhdGVsbGl0ZUxpYiktW15cL10rLmpzKFw/LiopPyQvLnRlc3Qobi5zcmMpKXJldHVybiBuLmFzeW5jfXJldHVybiEwfSgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXtzZXR0aW5nczplLGV2ZW50OnR9LHI9bi5zZXR0aW5ncy5zb3VyY2U7aWYocilyZXR1cm4gbi5zZXR0aW5ncy5pc0V4dGVybmFsP3UocikudGhlbihmdW5jdGlvbihlKXtlJiZmKGMobixlKSl9KTp2b2lkKHB8fCJsb2FkaW5nIiE9PXMucmVhZHlTdGF0ZT9mKGMobixyKSk6cy53cml0ZT9zLndyaXRlKGMobixyKSk6ZihjKG4scikpKX19fSwiY29yZS9zcmMvbGliL2V2ZW50cy9jdXN0b21FdmVudC5qcyI6e25hbWU6ImN1c3RvbS1ldmVudCIsZGlzcGxheU5hbWU6IkN1c3RvbSBFdmVudCIsc2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiLi9oZWxwZXJzL2NyZWF0ZUJ1YmJseSIpKCksaT1bXTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnR5cGU7LTE9PT1pLmluZGV4T2YobikmJihpLnB1c2gobiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIobixyLmV2YWx1YXRlRXZlbnQsITApKSxyLmFkZExpc3RlbmVyKGUsZnVuY3Rpb24oZSl7ZS5uYXRpdmVFdmVudC50eXBlPT09biYmKGUuZGV0YWlsPWUubmF0aXZlRXZlbnQuZGV0YWlsLHQoZSkpfSl9fX0sImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcyI6e25hbWU6InBhdGgtYW5kLXF1ZXJ5c3RyaW5nIixkaXNwbGF5TmFtZToiUGF0aCBBbmQgUXVlcnkgU3RyaW5nIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCIpLGk9bigiLi4vaGVscGVycy90ZXh0TWF0Y2giKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIG49ci5sb2NhdGlvbi5wYXRobmFtZStyLmxvY2F0aW9uLnNlYXJjaDtyZXR1cm4gZS5wYXRocy5zb21lKGZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWVJc1JlZ2V4P25ldyBSZWdFeHAoZS52YWx1ZSwiaSIpOmUudmFsdWU7cmV0dXJuIGkobix0KX0pfX19LCJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiOntuYW1lOiJwYWdlLWJvdHRvbSIsZGlzcGxheU5hbWU6IlBhZ2UgQm90dG9tIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCIuL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IucmVnaXN0ZXJQYWdlQm90dG9tVHJpZ2dlcih0KX19fSwiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyI6e25hbWU6ImNsaWNrIixkaXNwbGF5TmFtZToiQ2xpY2siLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBhPW4oIkBhZG9iZS9yZWFjdG9yLXdpbmRvdyIpLG89bigiLi9oZWxwZXJzL2NyZWF0ZUJ1YmJseSIpKCkscz1uZXcobigiLi9oZWxwZXJzL3dlYWtNYXAiKSksYz1mdW5jdGlvbihlKXtmb3IoO2U7KXt2YXIgdD1lLnRhZ05hbWU7aWYodCYmImEiPT09dC50b0xvd2VyQ2FzZSgpKXt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiaHJlZiIpLHI9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpO3JldHVybiBuJiYoIXJ8fCJfc2VsZiI9PT1yfHwiX3RvcCI9PT1yJiZhLnRvcD09PWF8fHI9PT1hLm5hbWUpP2U6dm9pZCAwfWU9ZS5wYXJlbnROb2RlfX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uZXZhbHVhdGVFdmVudCwhMCksZS5leHBvcnRzPWZ1bmN0aW9uKHIsaSl7by5hZGRMaXN0ZW5lcihyLGZ1bmN0aW9uKGUpe3ZhciB0PWUubmF0aXZlRXZlbnQ7aWYoIXQuc19mZSl7aWYoci5hbmNob3JEZWxheSYmIXMuaGFzKHQpKXt2YXIgbj1jKHQudGFyZ2V0KTtuJiYodC5wcmV2ZW50RGVmYXVsdCgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmxvY2F0aW9uPW4uaHJlZn0sci5hbmNob3JEZWxheSkpLHMuc2V0KHQsITApfWkoZSl9fSl9LGUuZXhwb3J0cy5fX3Jlc2V0PW8uX19yZXNldH19LCJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIjp7bmFtZToicGF0aCIsZGlzcGxheU5hbWU6IlBhdGggV2l0aG91dCBRdWVyeSBTdHJpbmciLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkBhZG9iZS9yZWFjdG9yLWRvY3VtZW50IiksaT1uKCIuLi9oZWxwZXJzL3RleHRNYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgbj1yLmxvY2F0aW9uLnBhdGhuYW1lO3JldHVybiBlLnBhdGhzLnNvbWUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZUlzUmVnZXg/bmV3IFJlZ0V4cChlLnZhbHVlLCJpIik6ZS52YWx1ZTtyZXR1cm4gaShuLHQpfSl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvbWVkaWFUaW1lUGxheWVkLmpzIjp7bmFtZToibWVkaWEtdGltZS1wbGF5ZWQiLGRpc3BsYXlOYW1lOiJNZWRpYSBUaW1lIFBsYXllZCIsc2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHM9bigiLi9oZWxwZXJzL2NyZWF0ZUJ1YmJseSIpKCksYz1uZXcobigiLi9oZWxwZXJzL3dlYWtNYXAiKSksdT1bXSxsPXtTRUNPTkQ6InNlY29uZCIsUEVSQ0VOVDoicGVyY2VudCJ9LHI9ZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQ7aWYobi5zZWVrYWJsZSYmbi5zZWVrYWJsZS5sZW5ndGgpe3ZhciB0PW4uc2Vla2FibGUscj10LnN0YXJ0KDApLGk9dC5lbmQoMCksYT1uLmN1cnJlbnRUaW1lLXIsbz1jLmdldChuKXx8MDt1LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS51bml0PT09bC5TRUNPTkQ/ZS5hbW91bnQ6KGktcikqKGUuYW1vdW50LzEwMCk7bzx0JiZ0PD1hJiZzLmV2YWx1YXRlRXZlbnQoe3RhcmdldDpuLGFtb3VudDplLmFtb3VudCx1bml0OmUudW5pdH0sITApfSksYy5zZXQobixhKX19O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHIsITApLGUuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciBlPWZ1bmN0aW9uKGUpe3JldHVybiBlLmFtb3VudD09PXQuYW1vdW50JiZlLnVuaXQ9PT10LnVuaXR9O3Uuc29tZShlKXx8dS5wdXNoKHthbW91bnQ6dC5hbW91bnQsdW5pdDp0LnVuaXR9KSxzLmFkZExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7aWYoZS5hbW91bnQhPT10LmFtb3VudHx8ZS51bml0IT09dC51bml0KXJldHVybiExO24oZSl9KX19fSwiY29yZS9zcmMvbGliL2V2ZW50cy9kYXRhRWxlbWVudENoYW5nZS5qcyI6e25hbWU6ImRhdGEtZWxlbWVudC1jaGFuZ2UiLGRpc3BsYXlOYW1lOiJEYXRhIEVsZW1lbnQgQ2hhbmdlIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4saSl7InVzZSBzdHJpY3QiO3ZhciBhPXt9LG89e307c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUpTT04uc3RyaW5naWZ5KGkuZ2V0RGF0YUVsZW1lbnRWYWx1ZShlKSk7aWYodCE9PW9bZV0pe3ZhciBuPXtkYXRhRWxlbWVudE5hbWU6ZX07YVtlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uobil9KSxvW2VdPXR9fSl9LDFlMyksZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5uYW1lLHI9YVtuXTtyfHwocj1hW25dPVtdLG9bbl09SlNPTi5zdHJpbmdpZnkoaS5nZXREYXRhRWxlbWVudFZhbHVlKG4pKSksci5wdXNoKHQpfX19LCJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jb29raWUuanMiOntuYW1lOiJjb29raWUiLGRpc3BsYXlOYW1lOiJDb29raWUiLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkBhZG9iZS9yZWFjdG9yLWNvb2tpZSIpLGk9bigiLi4vaGVscGVycy90ZXh0TWF0Y2giKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZUlzUmVnZXg/bmV3IFJlZ0V4cChlLnZhbHVlLCJpIik6ZS52YWx1ZTtyZXR1cm4gaShyLmdldChlLm5hbWUpLHQpfX19LCJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIjp7bmFtZToiZG9tLXJlYWR5IixkaXNwbGF5TmFtZToiRE9NIFJlYWR5IixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCIuL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IucmVnaXN0ZXJEb21SZWFkeVRyaWdnZXIodCl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvZWxlbWVudEV4aXN0cy5qcyI6e25hbWU6ImVsZW1lbnQtZXhpc3RzIixkaXNwbGF5TmFtZToiRWxlbWVudCBFeGlzdHMiLHNjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPTNlMyxzPW5ldyhuKCIuL2hlbHBlcnMvd2Vha01hcCIpKSxjPW4oIi4vaGVscGVycy9tYXRjaGVzUHJvcGVydGllcyIpLHU9e307c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtPYmplY3Qua2V5cyh1KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD11W2VdLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoIXMuaGFzKGkpKXtzLnNldChpLCEwKTtmb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXTtjKGksby5zZXR0aW5ncy5lbGVtZW50UHJvcGVydGllcykmJihvLnRyaWdnZXIoe2VsZW1lbnQ6aSx0YXJnZXQ6aX0pLHQuc3BsaWNlKGEsMSksYS0tKX19aWYoIXQubGVuZ3RoKXtkZWxldGUgdVtlXTticmVha319fSl9LHIpLGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXVbZS5lbGVtZW50U2VsZWN0b3JdO258fChuPXVbZS5lbGVtZW50U2VsZWN0b3JdPVtdKSxuLnB1c2goe3NldHRpbmdzOmUsdHJpZ2dlcjp0fSl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvY2hhbmdlLmpzIjp7bmFtZToiY2hhbmdlIixkaXNwbGF5TmFtZToiQ2hhbmdlIixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCIuL2hlbHBlcnMvY3JlYXRlQnViYmx5IikoKSxpPW4oIi4uL2hlbHBlcnMvdGV4dE1hdGNoIik7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyLmV2YWx1YXRlRXZlbnQsITApLGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuO2UudmFsdWUhPT11bmRlZmluZWQmJihuPWUudmFsdWVJc1JlZ2V4P25ldyBSZWdFeHAoZS52YWx1ZSwiaSIpOmUudmFsdWUpLHIuYWRkTGlzdGVuZXIoZSxmdW5jdGlvbihlKXtpZihuIT09dW5kZWZpbmVkJiYhaShlLnRhcmdldC52YWx1ZSxuKSlyZXR1cm4hMTt0KGUpfSl9fX0sImNvcmUvc3JjL2xpYi9oZWxwZXJzL2dldE9iamVjdFByb3BlcnR5LmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5zcGxpdCgiLiIpLHI9ZSxpPTAsYT1uLmxlbmd0aDtpPGE7aSsrKXtpZihudWxsPT1yKXJldHVybiB1bmRlZmluZWQ7cj1yW25baV1dfXJldHVybiByfX19LCJjb3JlL3NyYy9saWIvZXZlbnRzL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cy5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkBhZG9iZS9yZWFjdG9yLXdpbmRvdyIpLGk9bigiQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQiKSxhPS0xIT09ci5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIDEwIiksbz0iV0lORE9XX0xPQURFRCIscz0iRE9NX1JFQURZIixjPSJQQUdFX0JPVFRPTSIsdT1bYyxzLG9dLGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZWxlbWVudDplLHRhcmdldDplLG5hdGl2ZUV2ZW50OnR9fSxkPXt9O3UuZm9yRWFjaChmdW5jdGlvbihlKXtkW2VdPVtdfSk7dmFyIGY9ZnVuY3Rpb24oZSx0KXt1LnNsaWNlKDAsZyhlKSsxKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe20odCxlKX0pfSxwPWZ1bmN0aW9uKCl7cmV0dXJuImNvbXBsZXRlIj09PWkucmVhZHlTdGF0ZT9vOiJpbnRlcmFjdGl2ZSI9PT1pLnJlYWR5U3RhdGU/YT9udWxsOnM6dm9pZCAwfSxnPWZ1bmN0aW9uKGUpe3JldHVybiB1LmluZGV4T2YoZSl9LG09ZnVuY3Rpb24odCxlKXtkW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7aCh0LGUpfSksZFtlXT1bXX0saD1mdW5jdGlvbihlLHQpe3ZhciBuPXQudHJpZ2dlcixyPXQuc3ludGhldGljRXZlbnRGbjtuKHI/cihlKTpudWxsKX07ci5fc2F0ZWxsaXRlPXIuX3NhdGVsbGl0ZXx8e30sci5fc2F0ZWxsaXRlLnBhZ2VCb3R0b209Zi5iaW5kKG51bGwsYyksaS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmLmJpbmQobnVsbCxzKSwhMCksci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmLmJpbmQobnVsbCxvKSwhMCksci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9cCgpO2UmJmYoZSl9LDApLGUuZXhwb3J0cz17cmVnaXN0ZXJMaWJyYXJ5TG9hZGVkVHJpZ2dlcjpmdW5jdGlvbihlKXtlKCl9LHJlZ2lzdGVyUGFnZUJvdHRvbVRyaWdnZXI6ZnVuY3Rpb24oZSl7ZFtjXS5wdXNoKHt0cmlnZ2VyOmV9KX0scmVnaXN0ZXJEb21SZWFkeVRyaWdnZXI6ZnVuY3Rpb24oZSl7ZFtzXS5wdXNoKHt0cmlnZ2VyOmUsc3ludGhldGljRXZlbnRGbjpsLmJpbmQobnVsbCxpKX0pfSxyZWdpc3RlcldpbmRvd0xvYWRlZFRyaWdnZXI6ZnVuY3Rpb24oZSl7ZFtvXS5wdXNoKHt0cmlnZ2VyOmUsc3ludGhldGljRXZlbnRGbjpsLmJpbmQobnVsbCxyKX0pfX19fSwiY29yZS9zcmMvbGliL2FjdGlvbnMvaGVscGVycy9kZWNvcmF0ZUNvZGUuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO3ZhciBpPTAsYT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zZXR0aW5ncy5pc0V4dGVybmFsfSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIjxzY3JpcHQ+XG4iK3QrIlxuPFwvc2NyaXB0PiJ9LHM9ZnVuY3Rpb24odCxlKXt2YXIgbj0iX19ydW5TY3JpcHQiKyArK2k7cmV0dXJuIF9zYXRlbGxpdGVbbl09ZnVuY3Rpb24oZSl7ZS5jYWxsKHQuZXZlbnQuZWxlbWVudCx0LmV2ZW50LHQuZXZlbnQudGFyZ2V0KSxkZWxldGUgX3NhdGVsbGl0ZVtuXX0sJzxzY3JpcHQ+X3NhdGVsbGl0ZVsiJytuKyciXShmdW5jdGlvbihldmVudCwgdGFyZ2V0KSB7XG4nK2UrIlxufSk7PFwvc2NyaXB0PiJ9LGM9e2phdmFzY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXR0aW5ncy5nbG9iYWw/byhlLHQpOnMoZSx0KX0saHRtbDpmdW5jdGlvbihlLHQpe3JldHVybiBhKGUpP3IucmVwbGFjZVRva2Vucyh0LGUuZXZlbnQpOnR9fTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY1tlLnNldHRpbmdzLmxhbmd1YWdlXShlLHQpfX19LCJjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2xvYWRDb2RlU2VxdWVudGlhbGx5LmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLGk9bigiLi9nZXRTb3VyY2VCeVVybCIpLGE9ci5yZXNvbHZlKCk7ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyByKGZ1bmN0aW9uKG4pe3ZhciBlPWkodCk7ci5hbGwoW2UsYV0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtuKHQpfSl9KTtyZXR1cm4gYT1lfX19LCJjb3JlL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZS5qcyI6e3NjcmlwdDpmdW5jdGlvbihuLHIpeyFmdW5jdGlvbiBpKGUsdCl7Im9iamVjdCI9PXR5cGVvZiByJiYib2JqZWN0Ij09dHlwZW9mIG4/bi5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KToib2JqZWN0Ij09dHlwZW9mIHI/ci5wb3N0c2NyaWJlPXQoKTplLnBvc3RzY3JpYmU9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIoZSl7aWYoaVtlXSlyZXR1cm4gaVtlXS5leHBvcnRzO3ZhciB0PWlbZV09e2V4cG9ydHM6e30saWQ6ZSxsb2FkZWQ6ITF9O3JldHVybiBuW2VdLmNhbGwodC5leHBvcnRzLHQsdC5leHBvcnRzLHIpLHQubG9hZGVkPSEwLHQuZXhwb3J0c312YXIgaT17fTtyZXR1cm4gci5tPW4sci5jPWksci5wPSIiLHIoMCl9KFtmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBpPXIobigxKSk7ZS5leHBvcnRzPWlbImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiYodFtuXT1lW25dKTtyZXR1cm4gdFsiZGVmYXVsdCJdPWUsdH1mdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1mdW5jdGlvbiB1KCl7fWZ1bmN0aW9uIGwoKXt2YXIgZT1jLnNoaWZ0KCk7aWYoZSl7dmFyIHQ9by5sYXN0KGUpO3QuYWZ0ZXJEZXF1ZXVlKCksZS5zdHJlYW09YS5hcHBseSh1bmRlZmluZWQsZSksdC5hZnRlclN0cmVhbVN0YXJ0KCl9fWZ1bmN0aW9uIGEoZSx0LHIpe2Z1bmN0aW9uIGkoZSl7ZT1yLmJlZm9yZVdyaXRlKGUpLG0ud3JpdGUoZSksci5hZnRlcldyaXRlKGUpfShtPW5ldyBwWyJkZWZhdWx0Il0oZSxyKSkuaWQ9ZysrLG0ubmFtZT1yLm5hbWV8fG0uaWQsZC5zdHJlYW1zW20ubmFtZV09bTt2YXIgbj1lLm93bmVyRG9jdW1lbnQsYT17Y2xvc2U6bi5jbG9zZSxvcGVuOm4ub3Blbix3cml0ZTpuLndyaXRlLHdyaXRlbG46bi53cml0ZWxufTtmKG4se2Nsb3NlOnUsb3Blbjp1LHdyaXRlOmZ1bmN0aW9uIHMoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBpKHQuam9pbigiIikpfSx3cml0ZWxuOmZ1bmN0aW9uIGMoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBpKHQuam9pbigiIikrIlxuIil9fSk7dmFyIG89bS53aW4ub25lcnJvcnx8dTtyZXR1cm4gbS53aW4ub25lcnJvcj1mdW5jdGlvbihlLHQsbil7ci5lcnJvcih7bXNnOmUrIiAtICIrdCsiOiAiK259KSxvLmFwcGx5KG0ud2luLFtlLHQsbl0pfSxtLndyaXRlKHQsZnVuY3Rpb24oKXtmKG4sYSksbS53aW4ub25lcnJvcj1vLHIuZG9uZSgpLG09bnVsbCxsKCl9KSxtfWZ1bmN0aW9uIGQoZSx0LG4pe2lmKG8uaXNGdW5jdGlvbihuKSluPXtkb25lOm59O2Vsc2UgaWYoImNsZWFyIj09PW4pcmV0dXJuIGM9W10sbT1udWxsLHZvaWQoZz0wKTtuPW8uZGVmYXVsdHMobixzKTt2YXIgcj1bZT0vXiMvLnRlc3QoZSk/d2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUuc3Vic3RyKDEpKTplLmpxdWVyeT9lWzBdOmUsdCxuXTtyZXR1cm4gZS5wb3N0c2NyaWJlPXtjYW5jZWw6ZnVuY3Rpb24gaSgpe3Iuc3RyZWFtP3Iuc3RyZWFtLmFib3J0KCk6clsxXT11fX0sbi5iZWZvcmVFbnF1ZXVlKHIpLGMucHVzaChyKSxtfHxsKCksZS5wb3N0c2NyaWJlfXQuX19lc01vZHVsZT0hMDt2YXIgZj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfTt0WyJkZWZhdWx0Il09ZDt2YXIgcD1pKG4oMikpLG89cihuKDQpKSxzPXthZnRlckFzeW5jOnUsYWZ0ZXJEZXF1ZXVlOnUsYWZ0ZXJTdHJlYW1TdGFydDp1LGFmdGVyV3JpdGU6dSxhdXRvRml4OiEwLGJlZm9yZUVucXVldWU6dSxiZWZvcmVXcml0ZVRva2VuOmZ1bmN0aW9uIGgoZSl7cmV0dXJuIGV9LGJlZm9yZVdyaXRlOmZ1bmN0aW9uIHYoZSl7cmV0dXJuIGV9LGRvbmU6dSxlcnJvcjpmdW5jdGlvbiBiKGUpe3Rocm93IG5ldyBFcnJvcihlLm1zZyl9LHJlbGVhc2VBc3luYzohMX0sZz0wLGM9W10sbT1udWxsO2YoZCx7c3RyZWFtczp7fSxxdWV1ZTpjLFdyaXRlU3RyZWFtOnBbImRlZmF1bHQiXX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJih0W25dPWVbbl0pO3JldHVybiB0WyJkZWZhdWx0Il09ZSx0fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIHkoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBfKGUsdCl7dmFyIG49dyt0LHI9ZS5nZXRBdHRyaWJ1dGUobik7cmV0dXJuIEUuZXhpc3R5KHIpP1N0cmluZyhyKTpyfWZ1bmN0aW9uIEMoZSx0LG4pe3ZhciByPTI8YXJndW1lbnRzLmxlbmd0aCYmbiE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06bnVsbCxpPXcrdDtFLmV4aXN0eShyKSYmIiIhPT1yP2Uuc2V0QXR0cmlidXRlKGkscik6ZS5yZW1vdmVBdHRyaWJ1dGUoaSl9dC5fX2VzTW9kdWxlPSEwO3ZhciB4PU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGs9aShuKDMpKSxFPXIobig0KSksST0hMSx3PSJkYXRhLXBzLSIsRD0icHMtc3R5bGUiLEE9InBzLXNjcmlwdCIsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnt9O3kodGhpcyxyKSx0aGlzLnJvb3Q9ZSx0aGlzLm9wdGlvbnM9bix0aGlzLmRvYz1lLm93bmVyRG9jdW1lbnQsdGhpcy53aW49dGhpcy5kb2MuZGVmYXVsdFZpZXd8fHRoaXMuZG9jLnBhcmVudFdpbmRvdyx0aGlzLnBhcnNlcj1uZXcga1siZGVmYXVsdCJdKCIiLHthdXRvRml4Om4uYXV0b0ZpeH0pLHRoaXMuYWN0dWFscz1bZV0sdGhpcy5wcm94eUhpc3Rvcnk9IiIsdGhpcy5wcm94eVJvb3Q9dGhpcy5kb2MuY3JlYXRlRWxlbWVudChlLm5vZGVOYW1lKSx0aGlzLnNjcmlwdFN0YWNrPVtdLHRoaXMud3JpdGVRdWV1ZT1bXSxDKHRoaXMucHJveHlSb290LCJwcm94eW9mIiwwKX1yZXR1cm4gci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24gbigpe3ZhciBlO2ZvcigoZT10aGlzLndyaXRlUXVldWUpLnB1c2guYXBwbHkoZSxhcmd1bWVudHMpOyF0aGlzLmRlZmVycmVkUmVtb3RlJiZ0aGlzLndyaXRlUXVldWUubGVuZ3RoOyl7dmFyIHQ9dGhpcy53cml0ZVF1ZXVlLnNoaWZ0KCk7RS5pc0Z1bmN0aW9uKHQpP3RoaXMuX2NhbGxGdW5jdGlvbih0KTp0aGlzLl93cml0ZUltcGwodCl9fSxyLnByb3RvdHlwZS5fY2FsbEZ1bmN0aW9uPWZ1bmN0aW9uIGkoZSl7dmFyIHQ9e3R5cGU6ImZ1bmN0aW9uIix2YWx1ZTplLm5hbWV8fGUudG9TdHJpbmcoKX07dGhpcy5fb25TY3JpcHRTdGFydCh0KSxlLmNhbGwodGhpcy53aW4sdGhpcy5kb2MpLHRoaXMuX29uU2NyaXB0RG9uZSh0KX0sci5wcm90b3R5cGUuX3dyaXRlSW1wbD1mdW5jdGlvbiBhKGUpe3RoaXMucGFyc2VyLmFwcGVuZChlKTtmb3IodmFyIHQ9dm9pZCAwLG49dm9pZCAwLHI9dm9pZCAwLGk9W107KHQ9dGhpcy5wYXJzZXIucmVhZFRva2VuKCkpJiYhKG49RS5pc1NjcmlwdCh0KSkmJiEocj1FLmlzU3R5bGUodCkpOykodD10aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbih0KSkmJmkucHVzaCh0KTswPGkubGVuZ3RoJiZ0aGlzLl93cml0ZVN0YXRpY1Rva2VucyhpKSxuJiZ0aGlzLl9oYW5kbGVTY3JpcHRUb2tlbih0KSxyJiZ0aGlzLl9oYW5kbGVTdHlsZVRva2VuKHQpfSxyLnByb3RvdHlwZS5fd3JpdGVTdGF0aWNUb2tlbnM9ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLl9idWlsZENodW5rKGUpO3JldHVybiB0LmFjdHVhbD8odC5odG1sPXRoaXMucHJveHlIaXN0b3J5K3QuYWN0dWFsLHRoaXMucHJveHlIaXN0b3J5Kz10LnByb3h5LHRoaXMucHJveHlSb290LmlubmVySFRNTD10Lmh0bWwsSSYmKHQucHJveHlJbm5lckhUTUw9dGhpcy5wcm94eVJvb3QuaW5uZXJIVE1MKSx0aGlzLl93YWxrQ2h1bmsoKSxJJiYodC5hY3R1YWxJbm5lckhUTUw9dGhpcy5yb290LmlubmVySFRNTCksdCk6bnVsbH0sci5wcm90b3R5cGUuX2J1aWxkQ2h1bms9ZnVuY3Rpb24gbChlKXtmb3IodmFyIHQ9dGhpcy5hY3R1YWxzLmxlbmd0aCxuPVtdLHI9W10saT1bXSxhPWUubGVuZ3RoLG89MDtvPGE7bysrKXt2YXIgcz1lW29dLGM9cy50b1N0cmluZygpO2lmKG4ucHVzaChjKSxzLmF0dHJzKXtpZighL15ub3NjcmlwdCQvaS50ZXN0KHMudGFnTmFtZSkpe3ZhciB1PXQrKztyLnB1c2goYy5yZXBsYWNlKC8oXC8/PikvLCIgIit3KyJpZD0iK3UrIiAkMSIpKSxzLmF0dHJzLmlkIT09QSYmcy5hdHRycy5pZCE9PUQmJmkucHVzaCgiYXRvbWljVGFnIj09PXMudHlwZT8iIjoiPCIrcy50YWdOYW1lKyIgIit3KyJwcm94eW9mPSIrdSsocy51bmFyeT8iIC8+IjoiPiIpKX19ZWxzZSByLnB1c2goYyksaS5wdXNoKCJlbmRUYWciPT09cy50eXBlP2M6IiIpfXJldHVybnt0b2tlbnM6ZSxyYXc6bi5qb2luKCIiKSxhY3R1YWw6ci5qb2luKCIiKSxwcm94eTppLmpvaW4oIiIpfX0sci5wcm90b3R5cGUuX3dhbGtDaHVuaz1mdW5jdGlvbiBzKCl7Zm9yKHZhciBlPXZvaWQgMCx0PVt0aGlzLnByb3h5Um9vdF07RS5leGlzdHkoZT10LnNoaWZ0KCkpOyl7dmFyIG49MT09PWUubm9kZVR5cGU7aWYoIW58fCFfKGUsInByb3h5b2YiKSl7biYmQyh0aGlzLmFjdHVhbHNbXyhlLCJpZCIpXT1lLCJpZCIpO3ZhciByPWUucGFyZW50Tm9kZSYmXyhlLnBhcmVudE5vZGUsInByb3h5b2YiKTtyJiZ0aGlzLmFjdHVhbHNbcl0uYXBwZW5kQ2hpbGQoZSl9dC51bnNoaWZ0LmFwcGx5KHQsRS50b0FycmF5KGUuY2hpbGROb2RlcykpfX0sci5wcm90b3R5cGUuX2hhbmRsZVNjcmlwdFRva2VuPWZ1bmN0aW9uIGMoZSl7dmFyIHQ9dGhpcyxuPXRoaXMucGFyc2VyLmNsZWFyKCk7biYmdGhpcy53cml0ZVF1ZXVlLnVuc2hpZnQobiksZS5zcmM9ZS5hdHRycy5zcmN8fGUuYXR0cnMuU1JDLChlPXRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKGUpKSYmKGUuc3JjJiZ0aGlzLnNjcmlwdFN0YWNrLmxlbmd0aD90aGlzLmRlZmVycmVkUmVtb3RlPWU6dGhpcy5fb25TY3JpcHRTdGFydChlKSx0aGlzLl93cml0ZVNjcmlwdFRva2VuKGUsZnVuY3Rpb24oKXt0Ll9vblNjcmlwdERvbmUoZSl9KSl9LHIucHJvdG90eXBlLl9oYW5kbGVTdHlsZVRva2VuPWZ1bmN0aW9uIHUoZSl7dmFyIHQ9dGhpcy5wYXJzZXIuY2xlYXIoKTt0JiZ0aGlzLndyaXRlUXVldWUudW5zaGlmdCh0KSxlLnR5cGU9ZS5hdHRycy50eXBlfHxlLmF0dHJzLlRZUEV8fCJ0ZXh0L2NzcyIsKGU9dGhpcy5vcHRpb25zLmJlZm9yZVdyaXRlVG9rZW4oZSkpJiZ0aGlzLl93cml0ZVN0eWxlVG9rZW4oZSksdCYmdGhpcy53cml0ZSgpfSxyLnByb3RvdHlwZS5fd3JpdGVTdHlsZVRva2VuPWZ1bmN0aW9uIGQoZSl7dmFyIHQ9dGhpcy5fYnVpbGRTdHlsZShlKTt0aGlzLl9pbnNlcnRDdXJzb3IodCxEKSxlLmNvbnRlbnQmJih0LnN0eWxlU2hlZXQmJiF0LnNoZWV0P3Quc3R5bGVTaGVldC5jc3NUZXh0PWUuY29udGVudDp0LmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKGUuY29udGVudCkpKX0sci5wcm90b3R5cGUuX2J1aWxkU3R5bGU9ZnVuY3Rpb24gdChlKXt2YXIgbj10aGlzLmRvYy5jcmVhdGVFbGVtZW50KGUudGFnTmFtZSk7cmV0dXJuIG4uc2V0QXR0cmlidXRlKCJ0eXBlIixlLnR5cGUpLEUuZWFjaEtleShlLmF0dHJzLGZ1bmN0aW9uKGUsdCl7bi5zZXRBdHRyaWJ1dGUoZSx0KX0pLG59LHIucHJvdG90eXBlLl9pbnNlcnRDdXJzb3I9ZnVuY3Rpb24gZihlLHQpe3RoaXMuX3dyaXRlSW1wbCgnPHNwYW4gaWQ9IicrdCsnIi8+Jyk7dmFyIG49dGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQodCk7biYmbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLG4pfSxyLnByb3RvdHlwZS5fb25TY3JpcHRTdGFydD1mdW5jdGlvbiBwKGUpe2Uub3V0ZXJXcml0ZXM9dGhpcy53cml0ZVF1ZXVlLHRoaXMud3JpdGVRdWV1ZT1bXSx0aGlzLnNjcmlwdFN0YWNrLnVuc2hpZnQoZSl9LHIucHJvdG90eXBlLl9vblNjcmlwdERvbmU9ZnVuY3Rpb24gZyhlKXtlPT09dGhpcy5zY3JpcHRTdGFja1swXT8odGhpcy5zY3JpcHRTdGFjay5zaGlmdCgpLHRoaXMud3JpdGUuYXBwbHkodGhpcyxlLm91dGVyV3JpdGVzKSwhdGhpcy5zY3JpcHRTdGFjay5sZW5ndGgmJnRoaXMuZGVmZXJyZWRSZW1vdGUmJih0aGlzLl9vblNjcmlwdFN0YXJ0KHRoaXMuZGVmZXJyZWRSZW1vdGUpLHRoaXMuZGVmZXJyZWRSZW1vdGU9bnVsbCkpOnRoaXMub3B0aW9ucy5lcnJvcih7bXNnOiJCYWQgc2NyaXB0IG5lc3Rpbmcgb3Igc2NyaXB0IGZpbmlzaGVkIHR3aWNlIn0pfSxyLnByb3RvdHlwZS5fd3JpdGVTY3JpcHRUb2tlbj1mdW5jdGlvbiBtKGUsdCl7dmFyIG49dGhpcy5fYnVpbGRTY3JpcHQoZSkscj10aGlzLl9zaG91bGRSZWxlYXNlKG4pLGk9dGhpcy5vcHRpb25zLmFmdGVyQXN5bmM7ZS5zcmMmJihuLnNyYz1lLnNyYyx0aGlzLl9zY3JpcHRMb2FkSGFuZGxlcihuLHI/aTpmdW5jdGlvbigpe3QoKSxpKCl9KSk7dHJ5e3RoaXMuX2luc2VydEN1cnNvcihuLEEpLG4uc3JjJiYhcnx8dCgpfWNhdGNoKGEpe3RoaXMub3B0aW9ucy5lcnJvcihhKSx0KCl9fSxyLnByb3RvdHlwZS5fYnVpbGRTY3JpcHQ9ZnVuY3Rpb24gaChlKXt2YXIgbj10aGlzLmRvYy5jcmVhdGVFbGVtZW50KGUudGFnTmFtZSk7cmV0dXJuIEUuZWFjaEtleShlLmF0dHJzLGZ1bmN0aW9uKGUsdCl7bi5zZXRBdHRyaWJ1dGUoZSx0KX0pLGUuY29udGVudCYmKG4udGV4dD1lLmNvbnRlbnQpLG59LHIucHJvdG90eXBlLl9zY3JpcHRMb2FkSGFuZGxlcj1mdW5jdGlvbiB2KHQsbil7ZnVuY3Rpb24gcigpe3Q9dC5vbmxvYWQ9dC5vbnJlYWR5c3RhdGVjaGFuZ2U9dC5vbmVycm9yPW51bGx9ZnVuY3Rpb24gaSgpe3IoKSxudWxsIT1uJiZuKCksbj1udWxsfWZ1bmN0aW9uIGEoZSl7cigpLG8oZSksbnVsbCE9biYmbigpLG49bnVsbH1mdW5jdGlvbiBlKGUsdCl7dmFyIG49ZVsib24iK3RdO251bGwhPW4mJihlWyJfb24iK3RdPW4pfXZhciBvPXRoaXMub3B0aW9ucy5lcnJvcjtlKHQsImxvYWQiKSxlKHQsImVycm9yIikseCh0LHtvbmxvYWQ6ZnVuY3Rpb24gcygpe2lmKHQuX29ubG9hZCl0cnl7dC5fb25sb2FkLmFwcGx5KHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX1jYXRjaChlKXthKHttc2c6Im9ubG9hZCBoYW5kbGVyIGZhaWxlZCAiK2UrIiBAICIrdC5zcmN9KX1pKCl9LG9uZXJyb3I6ZnVuY3Rpb24gYygpe2lmKHQuX29uZXJyb3IpdHJ5e3QuX29uZXJyb3IuYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfWNhdGNoKGUpe3JldHVybiB2b2lkIGEoe21zZzoib25lcnJvciBoYW5kbGVyIGZhaWxlZCAiK2UrIiBAICIrdC5zcmN9KX1hKHttc2c6InJlbW90ZSBzY3JpcHQgZmFpbGVkICIrdC5zcmN9KX0sb25yZWFkeXN0YXRlY2hhbmdlOmZ1bmN0aW9uIHUoKXsvXihsb2FkZWR8Y29tcGxldGUpJC8udGVzdCh0LnJlYWR5U3RhdGUpJiZpKCl9fSl9LHIucHJvdG90eXBlLl9zaG91bGRSZWxlYXNlPWZ1bmN0aW9uIGIoZSl7cmV0dXJuIS9ec2NyaXB0JC9pLnRlc3QoZS5ub2RlTmFtZSl8fCEhKHRoaXMub3B0aW9ucy5yZWxlYXNlQXN5bmMmJmUuc3JjJiZlLmhhc0F0dHJpYnV0ZSgiYXN5bmMiKSl9LHJ9KCk7dFsiZGVmYXVsdCJdPWF9LGZ1bmN0aW9uKG4peyFmdW5jdGlvbiByKGUsdCl7bi5leHBvcnRzPXQoKX0oMCxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUpe2lmKGlbZV0pcmV0dXJuIGlbZV0uZXhwb3J0czt2YXIgdD1pW2VdPXtleHBvcnRzOnt9LGlkOmUsbG9hZGVkOiExfTtyZXR1cm4gbltlXS5jYWxsKHQuZXhwb3J0cyx0LHQuZXhwb3J0cyxyKSx0LmxvYWRlZD0hMCx0LmV4cG9ydHN9dmFyIGk9e307cmV0dXJuIHIubT1uLHIuYz1pLHIucD0iIixyKDApfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgaT1yKG4oMSkpO2UuZXhwb3J0cz1pWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19ZnVuY3Rpb24gaShlKXtpZihlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9e307aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSk7cmV0dXJuIHRbImRlZmF1bHQiXT1lLHR9ZnVuY3Rpb24gbChlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfXQuX19lc01vZHVsZT0hMDt2YXIgZD1pKG4oMikpLGY9aShuKDMpKSxwPXIobig2KSksYT1uKDUpLGc9e2NvbW1lbnQ6L148IS0tLyxlbmRUYWc6L148XC8vLGF0b21pY1RhZzovXjxccyooc2NyaXB0fHN0eWxlfG5vc2NyaXB0fGlmcmFtZXx0ZXh0YXJlYSlbXHNcLz5dL2ksc3RhcnRUYWc6L148LyxjaGFyczovXltePF0vfSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXRoaXMscj0wPGFyZ3VtZW50cy5sZW5ndGgmJmUhPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOiIiLGk9MTxhcmd1bWVudHMubGVuZ3RoJiZ0IT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTp7fTtsKHRoaXMsYyksdGhpcy5zdHJlYW09cjt2YXIgYT0hMSxvPXt9O2Zvcih2YXIgcyBpbiBkKWQuaGFzT3duUHJvcGVydHkocykmJihpLmF1dG9GaXgmJihvW3MrIkZpeCJdPSEwKSxhPWF8fG9bcysiRml4Il0pO2E/KHRoaXMuX3JlYWRUb2tlbj0oMCxwWyJkZWZhdWx0Il0pKHRoaXMsbyxmdW5jdGlvbigpe3JldHVybiBuLl9yZWFkVG9rZW5JbXBsKCl9KSx0aGlzLl9wZWVrVG9rZW49KDAscFsiZGVmYXVsdCJdKSh0aGlzLG8sZnVuY3Rpb24oKXtyZXR1cm4gbi5fcGVla1Rva2VuSW1wbCgpfSkpOih0aGlzLl9yZWFkVG9rZW49dGhpcy5fcmVhZFRva2VuSW1wbCx0aGlzLl9wZWVrVG9rZW49dGhpcy5fcGVla1Rva2VuSW1wbCl9cmV0dXJuIGMucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbiB0KGUpe3RoaXMuc3RyZWFtKz1lfSxjLnByb3RvdHlwZS5wcmVwZW5kPWZ1bmN0aW9uIG4oZSl7dGhpcy5zdHJlYW09ZSt0aGlzLnN0cmVhbX0sYy5wcm90b3R5cGUuX3JlYWRUb2tlbkltcGw9ZnVuY3Rpb24gcigpe3ZhciBlPXRoaXMuX3BlZWtUb2tlbkltcGwoKTtpZihlKXJldHVybiB0aGlzLnN0cmVhbT10aGlzLnN0cmVhbS5zbGljZShlLmxlbmd0aCksZX0sYy5wcm90b3R5cGUuX3BlZWtUb2tlbkltcGw9ZnVuY3Rpb24gaSgpe2Zvcih2YXIgZSBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkoZSkmJmdbZV0udGVzdCh0aGlzLnN0cmVhbSkpe3ZhciB0PWZbZV0odGhpcy5zdHJlYW0pO2lmKHQpcmV0dXJuInN0YXJ0VGFnIj09PXQudHlwZSYmL3NjcmlwdHxzdHlsZS9pLnRlc3QodC50YWdOYW1lKT9udWxsOih0LnRleHQ9dGhpcy5zdHJlYW0uc3Vic3RyKDAsdC5sZW5ndGgpLHQpfX0sYy5wcm90b3R5cGUucGVla1Rva2VuPWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5fcGVla1Rva2VuKCl9LGMucHJvdG90eXBlLnJlYWRUb2tlbj1mdW5jdGlvbiBhKCl7cmV0dXJuIHRoaXMuX3JlYWRUb2tlbigpfSxjLnByb3RvdHlwZS5yZWFkVG9rZW5zPWZ1bmN0aW9uIG8oZSl7Zm9yKHZhciB0PXZvaWQgMDt0PXRoaXMucmVhZFRva2VuKCk7KWlmKGVbdC50eXBlXSYmITE9PT1lW3QudHlwZV0odCkpcmV0dXJufSxjLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBzKCl7dmFyIGU9dGhpcy5zdHJlYW07cmV0dXJuIHRoaXMuc3RyZWFtPSIiLGV9LGMucHJvdG90eXBlLnJlc3Q9ZnVuY3Rpb24gdSgpe3JldHVybiB0aGlzLnN0cmVhbX0sY30oKTtmb3IodmFyIHMgaW4odFsiZGVmYXVsdCJdPW8pLnRva2VuVG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0sby5lc2NhcGVBdHRyaWJ1dGVzPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPSgwLGEuZXNjYXBlUXVvdGVzKShlW25dLG51bGwpKTtyZXR1cm4gdH0sby5zdXBwb3J0cz1kKWQuaGFzT3duUHJvcGVydHkocykmJihvLmJyb3dzZXJIYXNGbGF3PW8uYnJvd3Nlckhhc0ZsYXd8fCFkW3NdJiZzKX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49ISh0Ll9fZXNNb2R1bGU9ITApLHI9ITEsaT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3ZhciBhPSI8UD48ST48L1A+PC9JPiI7aS5pbm5lckhUTUw9YSx0LnRhZ1NvdXA9bj1pLmlubmVySFRNTCE9PWF9Y2F0Y2gobyl7dC50YWdTb3VwPW49ITF9dHJ5e2kuaW5uZXJIVE1MPSI8UD48aT48UD48L1A+PC9pPjwvUD4iLHQuc2VsZkNsb3NlPXI9Mj09PWkuY2hpbGROb2Rlcy5sZW5ndGh9Y2F0Y2gobyl7dC5zZWxmQ2xvc2U9cj0hMX1pPW51bGwsdC50YWdTb3VwPW4sdC5zZWxmQ2xvc2U9cn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUuaW5kZXhPZigiLS1ceDNlIik7aWYoMDw9dClyZXR1cm4gbmV3IGwuQ29tbWVudFRva2VuKGUuc3Vic3RyKDQsdC0xKSx0KzMpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5pbmRleE9mKCI8Iik7cmV0dXJuIG5ldyBsLkNoYXJzVG9rZW4oMDw9dD90OmUubGVuZ3RoKX1mdW5jdGlvbiBhKGUpe3ZhciBvLHMsYztpZigtMSE9PWUuaW5kZXhPZigiPiIpKXt2YXIgdD1lLm1hdGNoKGQuc3RhcnRUYWcpO2lmKHQpe3ZhciBuPShvPXt9LHM9e30sYz10WzJdLHRbMl0ucmVwbGFjZShkLmF0dHIsZnVuY3Rpb24oZSx0LG4scixpLGEpe258fHJ8fGl8fGE/YXJndW1lbnRzWzVdPyhvW2FyZ3VtZW50c1s1XV09IiIsc1thcmd1bWVudHNbNV1dPSEwKTpvW3RdPWFyZ3VtZW50c1syXXx8YXJndW1lbnRzWzNdfHxhcmd1bWVudHNbNF18fGQuZmlsbEF0dHIudGVzdCh0KSYmdHx8IiI6b1t0XT0iIixjPWMucmVwbGFjZShlLCIiKX0pLHt2Om5ldyBsLlN0YXJ0VGFnVG9rZW4odFsxXSx0WzBdLmxlbmd0aCxvLHMsISF0WzNdLGMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpKX0pO2lmKCJvYmplY3QiPT09KHZvaWQgMD09PW4/InVuZGVmaW5lZCI6dShuKSkpcmV0dXJuIG4udn19fWZ1bmN0aW9uIG8oZSl7dmFyIHQ9YShlKTtpZih0KXt2YXIgbj1lLnNsaWNlKHQubGVuZ3RoKTtpZihuLm1hdGNoKG5ldyBSZWdFeHAoIjwvXFxzKiIrdC50YWdOYW1lKyJcXHMqPiIsImkiKSkpe3ZhciByPW4ubWF0Y2gobmV3IFJlZ0V4cCgiKFtcXHNcXFNdKj8pPC9cXHMqIit0LnRhZ05hbWUrIlxccyo+IiwiaSIpKTtpZihyKXJldHVybiBuZXcgbC5BdG9taWNUYWdUb2tlbih0LnRhZ05hbWUsclswXS5sZW5ndGgrdC5sZW5ndGgsdC5hdHRycyx0LmJvb2xlYW5BdHRycyxyWzFdKX19fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5tYXRjaChkLmVuZFRhZyk7aWYodClyZXR1cm4gbmV3IGwuRW5kVGFnVG9rZW4odFsxXSx0WzBdLmxlbmd0aCl9dC5fX2VzTW9kdWxlPSEwO3ZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTt0LmNvbW1lbnQ9cix0LmNoYXJzPWksdC5zdGFydFRhZz1hLHQuYXRvbWljVGFnPW8sdC5lbmRUYWc9czt2YXIgbD1uKDQpLGQ9e3N0YXJ0VGFnOi9ePChbXC1BLVphLXowLTlfXSspKCg/OlxzK1tcd1wtXSsoPzpccyo9P1xzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyooXC8/KT4vLGVuZFRhZzovXjxcLyhbXC1BLVphLXowLTlfXSspW14+XSo+LyxhdHRyOi8oPzooW1wtQS1aYS16MC05X10rKVxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpfCg/OihbXC1BLVphLXowLTlfXSspKFxzfCQpKykvZyxmaWxsQXR0cjovXihjaGVja2VkfGNvbXBhY3R8ZGVjbGFyZXxkZWZlcnxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxub2hyZWZ8bm9yZXNpemV8bm9zaGFkZXxub3dyYXB8cmVhZG9ubHl8c2VsZWN0ZWQpJC9pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dC5fX2VzTW9kdWxlPSEwLHQuRW5kVGFnVG9rZW49dC5BdG9taWNUYWdUb2tlbj10LlN0YXJ0VGFnVG9rZW49dC5UYWdUb2tlbj10LkNoYXJzVG9rZW49dC5Db21tZW50VG9rZW49dC5Ub2tlbj11bmRlZmluZWQ7dmFyIGM9big1KSxyPXQuVG9rZW49ZnVuY3Rpb24gcihlLHQpe3ModGhpcyxyKSx0aGlzLnR5cGU9ZSx0aGlzLmxlbmd0aD10LHRoaXMudGV4dD0iIn0saT0odC5Db21tZW50VG9rZW49ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUsdCl7cyh0aGlzLG4pLHRoaXMudHlwZT0iY29tbWVudCIsdGhpcy5sZW5ndGg9dHx8KGU/ZS5sZW5ndGg6MCksdGhpcy50ZXh0PSIiLHRoaXMuY29udGVudD1lfXJldHVybiBuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiBlKCl7cmV0dXJuIlx4M2MhLS0iK3RoaXMuY29udGVudH0sbn0oKSx0LkNoYXJzVG9rZW49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ModGhpcyx0KSx0aGlzLnR5cGU9ImNoYXJzIix0aGlzLmxlbmd0aD1lLHRoaXMudGV4dD0iIn1yZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24gZSgpe3JldHVybiB0aGlzLnRleHR9LHR9KCksdC5UYWdUb2tlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSx0LG4scixpKXtzKHRoaXMsYSksdGhpcy50eXBlPWUsdGhpcy5sZW5ndGg9bix0aGlzLnRleHQ9IiIsdGhpcy50YWdOYW1lPXQsdGhpcy5hdHRycz1yLHRoaXMuYm9vbGVhbkF0dHJzPWksdGhpcy51bmFyeT0hMSx0aGlzLmh0bWw1VW5hcnk9ITF9cmV0dXJuIGEuZm9ybWF0VGFnPWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOm51bGwscj0iPCIrZS50YWdOYW1lO2Zvcih2YXIgaSBpbiBlLmF0dHJzKWlmKGUuYXR0cnMuaGFzT3duUHJvcGVydHkoaSkpe3IrPSIgIitpO3ZhciBhPWUuYXR0cnNbaV07InVuZGVmaW5lZCIhPXR5cGVvZiBlLmJvb2xlYW5BdHRycyYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmJvb2xlYW5BdHRyc1tpXXx8KHIrPSc9IicrKDAsYy5lc2NhcGVRdW90ZXMpKGEpKyciJyl9cmV0dXJuIGUucmVzdCYmKHIrPSIgIitlLnJlc3QpLGUudW5hcnkmJiFlLmh0bWw1VW5hcnk/cis9Ii8+IjpyKz0iPiIsbiE9PXVuZGVmaW5lZCYmbnVsbCE9PW4mJihyKz1uKyI8LyIrZS50YWdOYW1lKyI+Iikscn0sYX0oKSk7dC5TdGFydFRhZ1Rva2VuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhlLHQsbixyLGksYSl7cyh0aGlzLG8pLHRoaXMudHlwZT0ic3RhcnRUYWciLHRoaXMubGVuZ3RoPXQsdGhpcy50ZXh0PSIiLHRoaXMudGFnTmFtZT1lLHRoaXMuYXR0cnM9bix0aGlzLmJvb2xlYW5BdHRycz1yLHRoaXMuaHRtbDVVbmFyeT0hMSx0aGlzLnVuYXJ5PWksdGhpcy5yZXN0PWF9cmV0dXJuIG8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIGUoKXtyZXR1cm4gaS5mb3JtYXRUYWcodGhpcyl9LG99KCksdC5BdG9taWNUYWdUb2tlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSx0LG4scixpKXtzKHRoaXMsYSksdGhpcy50eXBlPSJhdG9taWNUYWciLHRoaXMubGVuZ3RoPXQsdGhpcy50ZXh0PSIiLHRoaXMudGFnTmFtZT1lLHRoaXMuYXR0cnM9bix0aGlzLmJvb2xlYW5BdHRycz1yLHRoaXMudW5hcnk9ITEsdGhpcy5odG1sNVVuYXJ5PSExLHRoaXMuY29udGVudD1pfXJldHVybiBhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiBlKCl7cmV0dXJuIGkuZm9ybWF0VGFnKHRoaXMsdGhpcy5jb250ZW50KX0sYX0oKSx0LkVuZFRhZ1Rva2VuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlLHQpe3ModGhpcyxuKSx0aGlzLnR5cGU9ImVuZFRhZyIsdGhpcy5sZW5ndGg9dCx0aGlzLnRleHQ9IiIsdGhpcy50YWdOYW1lPWV9cmV0dXJuIG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIGUoKXtyZXR1cm4iPC8iK3RoaXMudGFnTmFtZSsiPiJ9LG59KCl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOiIiO3JldHVybiBlP2UucmVwbGFjZSgvKFteIl0qKSIvZyxmdW5jdGlvbihlLHQpe3JldHVybi9cXC8udGVzdCh0KT90KyciJzp0KydcXCInfSk6bn10Ll9fZXNNb2R1bGU9ITAsdC5lc2NhcGVRdW90ZXM9bn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlKXtyZXR1cm4gZSYmInN0YXJ0VGFnIj09PWUudHlwZSYmKGUudW5hcnk9ci50ZXN0KGUudGFnTmFtZSl8fGUudW5hcnksZS5odG1sNVVuYXJ5PSEvXC8+JC8udGVzdChlLnRleHQpKSxlfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbj1lLnN0cmVhbSxyPXUodCgpKTtyZXR1cm4gZS5zdHJlYW09bixyfWZ1bmN0aW9uIGQoZSx0KXt2YXIgbj10LnBvcCgpO2UucHJlcGVuZCgiPC8iK24udGFnTmFtZSsiPiIpfWZ1bmN0aW9uIGYoKXt2YXIgZT1bXTtyZXR1cm4gZS5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV19LGUubGFzdFRhZ05hbWVFcT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmxhc3QoKTtyZXR1cm4gdCYmdC50YWdOYW1lJiZ0LnRhZ05hbWUudG9VcHBlckNhc2UoKT09PWUudG9VcHBlckNhc2UoKX0sZS5jb250YWluc1RhZ05hbWU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MDt0PXRoaXNbbl07bisrKWlmKHQudGFnTmFtZT09PWUpcmV0dXJuITA7cmV0dXJuITF9LGV9ZnVuY3Rpb24gbihuLHIsdCl7ZnVuY3Rpb24gaSgpe3ZhciBlPWwobix0KTtlJiZvW2UudHlwZV0mJm9bZS50eXBlXShlKX12YXIgYT1mKCksbz17c3RhcnRUYWc6ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnRhZ05hbWU7IlRSIj09PXQudG9VcHBlckNhc2UoKSYmYS5sYXN0VGFnTmFtZUVxKCJUQUJMRSIpPyhuLnByZXBlbmQoIjxUQk9EWT4iKSxpKCkpOnIuc2VsZkNsb3NlRml4JiZwLnRlc3QodCkmJmEuY29udGFpbnNUYWdOYW1lKHQpP2EubGFzdFRhZ05hbWVFcSh0KT9kKG4sYSk6KG4ucHJlcGVuZCgiPC8iK2UudGFnTmFtZSsiPiIpLGkoKSk6ZS51bmFyeXx8YS5wdXNoKGUpfSxlbmRUYWc6ZnVuY3Rpb24gYyhlKXthLmxhc3QoKT9yLnRhZ1NvdXBGaXgmJiFhLmxhc3RUYWdOYW1lRXEoZS50YWdOYW1lKT9kKG4sYSk6YS5wb3AoKTpyLnRhZ1NvdXBGaXgmJih0KCksaSgpKX19O3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuIGkoKSx1KHQoKSl9fXQuX19lc01vZHVsZT0hMCx0WyJkZWZhdWx0Il09bjt2YXIgcj0vXihBUkVBfEJBU0V8QkFTRUZPTlR8QlJ8Q09MfEZSQU1FfEhSfElNR3xJTlBVVHxJU0lOREVYfExJTkt8TUVUQXxQQVJBTXxFTUJFRCkkL2kscD0vXihDT0xHUk9VUHxERHxEVHxMSXxPUFRJT05TfFB8VER8VEZPT1R8VEh8VEhFQUR8VFIpJC9pfV0pfSl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgcj12b2lkIDAsaT1lJiZlLmxlbmd0aHx8MDtmb3Iocj0wO3I8aTtyKyspdC5jYWxsKG4sZVtyXSxyKX1mdW5jdGlvbiBhKGUsdCxuKXtmb3IodmFyIHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZ0LmNhbGwobixyLGVbcl0pfWZ1bmN0aW9uIG8obixlKXtyZXR1cm4gbj1ufHx7fSxhKGUsZnVuY3Rpb24oZSx0KXtyKG5bZV0pfHwobltlXT10KX0pLG59ZnVuY3Rpb24gcyhlKXt0cnl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKHIpe3ZhciB0PShuPVtdLGkoZSxmdW5jdGlvbihlKXtuLnB1c2goZSl9KSx7djpufSk7aWYoIm9iamVjdCI9PT0odm9pZCAwPT09dD8idW5kZWZpbmVkIjpmKHQpKSlyZXR1cm4gdC52fXZhciBufWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGVbZS5sZW5ndGgtMV19ZnVuY3Rpb24gdShlLHQpe3JldHVybiEoIWV8fCJzdGFydFRhZyIhPT1lLnR5cGUmJiJhdG9taWNUYWciIT09ZS50eXBlfHwhKCJ0YWdOYW1lImluIGUpfHwhfmUudGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodCkpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIHUoZSwic2NyaXB0Iil9ZnVuY3Rpb24gZChlKXtyZXR1cm4gdShlLCJzdHlsZSIpfXQuX19lc01vZHVsZT0hMDt2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX07dC5leGlzdHk9cix0LmlzRnVuY3Rpb249bix0LmVhY2g9aSx0LmVhY2hLZXk9YSx0LmRlZmF1bHRzPW8sdC50b0FycmF5PXMsdC5sYXN0PWMsdC5pc1RhZz11LHQuaXNTY3JpcHQ9bCx0LmlzU3R5bGU9ZH1dKX0pfX0sImNvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZ2V0U291cmNlQnlVcmwuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJAYWRvYmUvcmVhY3Rvci1sb2FkLXNjcmlwdCIpLGk9bigiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLGE9e30sbz17fSxzPWZ1bmN0aW9uKGUpe3JldHVybiBvW2VdfHwob1tlXT1yKGUpKSxvW2VdfTtfc2F0ZWxsaXRlLl9fcmVnaXN0ZXJTY3JpcHQ9ZnVuY3Rpb24oZSx0KXthW2VdPXR9LGUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gYVt0XT9pLnJlc29sdmUoYVt0XSk6bmV3IGkoZnVuY3Rpb24oZSl7cyh0KS50aGVuKGZ1bmN0aW9uKCl7ZShhW3RdKX0sZnVuY3Rpb24oKXtlKCl9KX0pfX19LCJjb3JlL3NyYy9saWIvZXZlbnRzL2hlbHBlcnMvY3JlYXRlQnViYmx5LmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiLi93ZWFrTWFwIikscD1uKCIuL21hdGNoZXNQcm9wZXJ0aWVzIiksZz1uKCIuL21hdGNoZXNTZWxlY3RvciIpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBkPVtdLGY9bmV3IHIsZT17YWRkTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtkLnB1c2goe3NldHRpbmdzOmUsY2FsbGJhY2s6dH0pfSxldmFsdWF0ZUV2ZW50OmZ1bmN0aW9uKHQsZSl7aWYoZC5sZW5ndGgmJiFmLmhhcyh0KSl7Zm9yKHZhciBuPXQudGFyZ2V0LHI9ITE7bjspe2Zvcih2YXIgaT0hMSxhPSExLG89MDtvPGQubGVuZ3RoO28rKyl7dmFyIHM9ZFtvXSxjPXMuc2V0dGluZ3MuZWxlbWVudFNlbGVjdG9yLHU9cy5zZXR0aW5ncy5lbGVtZW50UHJvcGVydGllcztpZigoITEhPT1zLnNldHRpbmdzLmJ1YmJsZUZpcmVJZkNoaWxkRmlyZWR8fCFyKSYmKG49PT10LnRhcmdldHx8ITEhPT1zLnNldHRpbmdzLmJ1YmJsZUZpcmVJZlBhcmVudCkmJihuPT09dC50YXJnZXR8fGN8fHUmJk9iamVjdC5rZXlzKHUpLmxlbmd0aCkmJighY3x8ZyhuLGMpKSYmKCF1fHxwKG4sdSkpKXt2YXIgbD17fTtlP09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7bFtlXT10W2VdfSk6bC5uYXRpdmVFdmVudD10LGwuZWxlbWVudD1uLGwudGFyZ2V0PXQudGFyZ2V0LCExIT09cy5jYWxsYmFjayhsKSYmKGE9ITAscy5zZXR0aW5ncy5idWJibGVTdG9wJiYoaT0hMCkpfX1pZihpKWJyZWFrO2EmJihyPSEwKSxuPW4ucGFyZW50Tm9kZX1mLnNldCh0LCEwKX19LF9fcmVzZXQ6ZnVuY3Rpb24oKXtkPVtdfX07cmV0dXJuIGV9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy93ZWFrTWFwLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiQGFkb2JlL3JlYWN0b3Itd2luZG93IikuV2Vha01hcDtpZih2b2lkIDA9PT1yKXt2YXIgaT1PYmplY3QuZGVmaW5lUHJvcGVydHksYT1EYXRlLm5vdygpJTFlOTsocj1mdW5jdGlvbigpe3RoaXMubmFtZT0iX19zdCIrKDFlOSpNYXRoLnJhbmRvbSgpPj4+MCkrYSsrKyJfXyJ9KS5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQpe3ZhciBuPWVbdGhpcy5uYW1lXTtyZXR1cm4gbiYmblswXT09PWU/blsxXT10OmkoZSx0aGlzLm5hbWUse3ZhbHVlOltlLHRdLHdyaXRhYmxlOiEwfSksdGhpc30sZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybih0PWVbdGhpcy5uYW1lXSkmJnRbMF09PT1lP3RbMV06dW5kZWZpbmVkfSxkZWxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLm5hbWVdO3JldHVybiEoIXR8fHRbMF0hPT1lfHwodFswXT10WzFdPXVuZGVmaW5lZCwwKSl9LGhhczpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMubmFtZV07cmV0dXJuISF0JiZ0WzBdPT09ZX19fWUuZXhwb3J0cz1yfX0sImNvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9tYXRjaGVzUHJvcGVydGllcy5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBpPW4oIi4vLi4vLi4vaGVscGVycy90ZXh0TWF0Y2giKSxhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIkB0ZXh0Ij09PXR8fCJpbm5lclRleHQiPT09dD9lLnRleHRDb250ZW50fHxlLmlubmVyVGV4dDp0IGluIGU/ZVt0XTplLmdldEF0dHJpYnV0ZT9lLmdldEF0dHJpYnV0ZSh0KTp2b2lkIDB9O2UuZXhwb3J0cz1mdW5jdGlvbihyLGUpe3JldHVybiFlfHxlLmV2ZXJ5KGZ1bmN0aW9uKGUpe3ZhciB0PWEocixlLm5hbWUpLG49ZS52YWx1ZUlzUmVnZXg/bmV3IFJlZ0V4cChlLnZhbHVlLCJpIik6ZS52YWx1ZTtyZXR1cm4gaSh0LG4pfSl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9tYXRjaGVzU2VsZWN0b3IuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4saSl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWUubWF0Y2hlc3x8ZS5tc01hdGNoZXNTZWxlY3RvcjtpZihuKXRyeXtyZXR1cm4gbi5jYWxsKGUsdCl9Y2F0Y2gocil7cmV0dXJuIGkubG9nZ2VyLndhcm4oIk1hdGNoaW5nIGVsZW1lbnQgZmFpbGVkLiAiK3QrIiBpcyBub3QgYSB2YWxpZCBzZWxlY3Rvci4iKSwhMX1yZXR1cm4hMX19fSwiY29yZS9zcmMvbGliL2hlbHBlcnMvdGV4dE1hdGNoLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBBcmd1bWVudDogUGF0dGVybiBpcyBub3QgcHJlc2VudCIpO3JldHVybiBudWxsIT1lJiYoInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQgaW5zdGFuY2VvZiBSZWdFeHAmJnQudGVzdChlKSl9fX19LGhvc3RlZExpYkZpbGVzQmFzZVVybDoiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVAwZmU2YjFiMzE3MGI0MTRlOTJlOGY3YWQ0Zjc0Zjg1Ny8ifSwiYWRvYmUtdGFyZ2V0LXYyIjp7ZGlzcGxheU5hbWU6IkFkb2JlIFRhcmdldCB2MiIsbW9kdWxlczp7ImFkb2JlLXRhcmdldC12Mi9saWIvbG9hZFRhcmdldC5qcyI6e25hbWU6ImxvYWQtdGFyZ2V0IixkaXNwbGF5TmFtZToiTG9hZCBUYXJnZXQiLHNjcmlwdDpmdW5jdGlvbihlLHQsbixyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShuLGUpe3JldHVybiBuZXcgYyhmdW5jdGlvbih0KXtuP2UudGhlbihmdW5jdGlvbihlKXtlJiYobi5hYm9ydD0hMCksdCgpfSk6dCgpfSl9ZnVuY3Rpb24gYShlKXtpZihlKXt2YXIgdD1uZXcgYyhmdW5jdGlvbih0KXt2YXIgbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dCghMSl9LGIudGFyZ2V0U2V0dGluZ3MudGltZW91dCkscj1mdW5jdGlvbiByKGUpe2UuZGV0YWlsJiYhMD09PWUuZGV0YWlsLnJlZGlyZWN0P3QoITApOnQoITEpLGNsZWFyVGltZW91dChuKSxnKHMsZSxyKX0saT1mdW5jdGlvbiBpKGUpe3QoITEpLGNsZWFyVGltZW91dChuKSxnKHMsZSxpKX07cChzLF8scikscChzLEMsaSl9KTtlKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUsdCl9KX19dmFyIG89bigiQGFkb2JlL3JlYWN0b3Itd2luZG93Iikscz1uKCJAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCIpLGM9bigiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLHU9bigiLi9tb2R1bGVzL2xvYWQtdGFyZ2V0IiksbD11LmluaXRMaWJyYXJ5U2V0dGluZ3MsZD11Lm92ZXJyaWRlUHVibGljQXBpLGY9bigiLi9tb2R1bGVzL2V2ZW50LXV0aWwiKSxwPWYuYWRkRXZlbnRMaXN0ZW5lcixnPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcixtPW4oIi4vbW9kdWxlcy9vcHRpbiIpLGg9bS5zaG91bGRVc2VPcHRJbix2PW0uaXNUYXJnZXRBcHByb3ZlZCxiPW4oIi4vdGFyZ2V0U2V0dGluZ3MiKS5leHRlbnNpb25TZXR0aW5ncyx5PXIuZ2V0U2hhcmVkTW9kdWxlKCJhZG9iZS1hbmFseXRpY3MiLCJhdWdtZW50LXRyYWNrZXIiKSxfPSJhdC1yZXF1ZXN0LXN1Y2NlZWRlZCIsQz0iYXQtcmVxdWVzdC1mYWlsZWQiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPWwoKTtlJiZlLmVuYWJsZWQ/KCgwLG4oIi4vbW9kdWxlcy9saWJzL2F0LWxhdW5jaCIpLmluaXQpKG8scyxlKSxoKCkmJiF2KCl8fGEoeSkpOmQobyl9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvZmlyZVBhZ2VMb2FkLmpzIjp7bmFtZToiZmlyZS1wYWdlLWxvYWQiLGRpc3BsYXlOYW1lOiJGaXJlIFBhZ2UgTG9hZCBSZXF1ZXN0IixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoKXtyZXR1cm4gYS5hZG9iZSYmYS5hZG9iZS50YXJnZXQmJmEuYWRvYmUudGFyZ2V0LlZFUlNJT059dmFyIGE9bigiQGFkb2JlL3JlYWN0b3Itd2luZG93Iiksbz1uKCIuL21vZHVsZXMvbGlicy9hdC1sYXVuY2giKSxzPW8uaW5pdENvbmZpZyxjPW8uaW5pdERlbGl2ZXJ5LHU9bigiLi9tb2R1bGVzL3BhZ2UtbG9hZCIpLGw9bigiLi9tZXNzYWdlcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD11KGUpO2koKT8ocyh0KSxjKCkpOmEuY29uc29sZSYmci5sb2dnZXIud2FybihsLk5PX1JFUVVFU1QpfX19LCJhZG9iZS10YXJnZXQtdjIvbGliL2FkZFBhZ2VMb2FkUGFyYW1zLmpzIjp7bmFtZToiYWRkLXBhZ2UtbG9hZC1wYXJhbXMiLGRpc3BsYXlOYW1lOiJBZGQgUGFyYW1zIHRvIFBhZ2UgTG9hZCBSZXF1ZXN0IixzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCIuL21vZHVsZXMvcGFyYW1zLXN0b3JlIikubWVyZ2VQYWdlTG9hZFBhcmFtcztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cihlLnBhcmFtcyl9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbW9kdWxlcy9sb2FkLXRhcmdldC5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbixyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXt2YXIgdD1lLmNvbXBhdE1vZGUsbj1lLmRvY3VtZW50TW9kZTtyZXR1cm4gdCYmIkNTUzFDb21wYXQiPT09dCYmKCFufHw5PD1uKX1mdW5jdGlvbiBhKGUpe3ZhciB0PWZ1bmN0aW9uIHQoKXt9LG49ZnVuY3Rpb24gbigpe3JldHVybiBsLnJlc29sdmUoKX07ZS5hZG9iZT1lLmFkb2JlfHx7fSxlLmFkb2JlLnRhcmdldD17VkVSU0lPTjoiIixldmVudDp7fSxnZXRPZmZlcjp0LGdldE9mZmVyczpuLGFwcGx5T2ZmZXI6dCxhcHBseU9mZmVyczpuLHNlbmROb3RpZmljYXRpb25zOnQsdHJhY2tFdmVudDp0LHRyaWdnZXJWaWV3OnQscmVnaXN0ZXJFeHRlbnNpb246dCxpbml0OnR9LGUubWJveENyZWF0ZT10LGUubWJveERlZmluZT10LGUubWJveFVwZGF0ZT10fWZ1bmN0aW9uIG8oKXtyZXR1cm4gYy5hZG9iZSYmYy5hZG9iZS50YXJnZXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgYy5hZG9iZS50YXJnZXQuZ2V0T2ZmZXJ9ZnVuY3Rpb24gcygpe3JldHVybiBvKCk/KHIubG9nZ2VyLndhcm4oZC5BTFJFQURZX0lOSVRJQUxJWkVEKSxudWxsKToobS5tYm94UGFyYW1zPXAoKSxtLmdsb2JhbE1ib3hQYXJhbXM9ZygpLGgobSxjLnRhcmdldEdsb2JhbFNldHRpbmdzfHx7fSxiKSxoKG0sdnx8e30sWyJ2ZXJzaW9uIl0pLGkodSl8fChtLmVuYWJsZWQ9ITEsci5sb2dnZXIud2FybihkLkRFTElWRVJZX0RJU0FCTEVEKSksbSl9dmFyIGM9bigiQGFkb2JlL3JlYWN0b3Itd2luZG93IiksdT1uKCJAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCIpLGw9bigiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLGQ9bigiLi4vbWVzc2FnZXMiKSxmPW4oIi4vcGFyYW1zLXN0b3JlIikscD1mLmdldFBhcmFtcyxnPWYuZ2V0UGFnZUxvYWRQYXJhbXMsbT1uKCIuLi90YXJnZXRTZXR0aW5ncyIpLnRhcmdldFNldHRpbmdzLGg9bigiLi9vYmplY3Qtb3ZlcnJpZGUiKSx2PW4oIi4uL2xpYnJhcnlTZXR0aW5ncyIpLlRBUkdFVF9ERUZBVUxUX1NFVFRJTkdTLGI9WyJlbmFibGVkIiwiY2xpZW50Q29kZSIsImltc09yZ0lkIiwic2VydmVyRG9tYWluIiwiY29va2llRG9tYWluIiwidGltZW91dCIsImRlZmF1bHRDb250ZW50SGlkZGVuU3R5bGUiLCJkZWZhdWx0Q29udGVudFZpc2libGVTdHlsZSIsImJvZHlIaWRkZW5TdHlsZSIsImJvZHlIaWRpbmdFbmFibGVkIiwic2VsZWN0b3JzUG9sbGluZ1RpbWVvdXQiLCJ2aXNpdG9yQXBpVGltZW91dCIsIm92ZXJyaWRlTWJveEVkZ2VTZXJ2ZXIiLCJvdmVycmlkZU1ib3hFZGdlU2VydmVyVGltZW91dCIsIm9wdG91dEVuYWJsZWQiLCJvcHRpbkVuYWJsZWQiLCJzZWN1cmVPbmx5Iiwic3VwcGxlbWVudGFsRGF0YUlkUGFyYW1UaW1lb3V0IiwiYXV0aG9yaW5nU2NyaXB0VXJsIiwidXJsU2l6ZUxpbWl0IiwiZW5kcG9pbnQiLCJwYWdlTG9hZEVuYWJsZWQiLCJ2aWV3c0VuYWJsZWQiLCJhbmFseXRpY3NMb2dnaW5nIiwic2VydmVyU3RhdGUiLCJnbG9iYWxNYm94TmFtZSJdO2UuZXhwb3J0cz17aW5pdExpYnJhcnlTZXR0aW5nczpzLG92ZXJyaWRlUHVibGljQXBpOmF9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbW9kdWxlcy9ldmVudC11dGlsLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxuKXtlLmFkZEV2ZW50TGlzdGVuZXIodCxuKX1mdW5jdGlvbiBuKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX1lLmV4cG9ydHM9e2FkZEV2ZW50TGlzdGVuZXI6dCxyZW1vdmVFdmVudExpc3RlbmVyOm59fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbW9kdWxlcy9vcHRpbi5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuInVuZGVmaW5lZCI9PT0odm9pZCAwPT09ZT8idW5kZWZpbmVkIjpsKGUpKXx8bnVsbD09PWV9ZnVuY3Rpb24gaShlKXt2YXIgdD12b2lkIDA9PT1lPyJ1bmRlZmluZWQiOmwoZSk7cmV0dXJuIG51bGwhPT1lJiYoIm9iamVjdCI9PT10fHwiZnVuY3Rpb24iPT09dCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gaShlW21dKSYmaShlW2ZdKX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuISF0JiYhcihlKSYmIXIoZVtnXSkmJmEoZVtnXSl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlW2ZdKHQpfWZ1bmN0aW9uIGMoKXt2YXIgZT1kW2ddO3JldHVybiBzKGUsZVtoXVt2XSl9ZnVuY3Rpb24gdSgpe3ZhciBlPWJbcF07cmV0dXJuIG8oZCxlKX12YXIgbD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0sZD1uKCJAYWRvYmUvcmVhY3Rvci13aW5kb3ciKS5hZG9iZSxmPSJpc0FwcHJvdmVkIixwPSJvcHRpbkVuYWJsZWQiLGc9Im9wdEluIixtPSJmZXRjaFBlcm1pc3Npb25zIixoPSJDYXRlZ29yaWVzIix2PSJUQVJHRVQiLGI9bigiLi4vdGFyZ2V0U2V0dGluZ3MiKS50YXJnZXRTZXR0aW5ncztlLmV4cG9ydHM9e3Nob3VsZFVzZU9wdEluOnUsaXNUYXJnZXRBcHByb3ZlZDpjfX19LCJhZG9iZS10YXJnZXQtdjIvbGliL3RhcmdldFNldHRpbmdzLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT1yLmdldEV4dGVuc2lvblNldHRpbmdzKCksYT1pLnRhcmdldFNldHRpbmdzfHx7fTtlLmV4cG9ydHM9e2V4dGVuc2lvblNldHRpbmdzOmksdGFyZ2V0U2V0dGluZ3M6YX19fSwiYWRvYmUtdGFyZ2V0LXYyL2xpYi9tb2R1bGVzL2xpYnMvYXQtbGF1bmNoLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiZGVmYXVsdCJpbiBlP2VbImRlZmF1bHQiXTplfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHNldFRpbWVvdXQoZSxOdW1iZXIobil8fDApfWZ1bmN0aW9uIGEoZSl7Y2xlYXJUaW1lb3V0KGUpfWZ1bmN0aW9uIGcoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4gaGwuY2FsbChlKX1mdW5jdGlvbiBzKGUpe3JldHVybiBpKGUpfWZ1bmN0aW9uIHR0KGUpe3JldHVybih0dD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIGMoZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGQoZSl7dmFyIHQ9dHQoZSk7cmV0dXJuIG51bGwhPWUmJigib2JqZWN0Ij09PXR8fCJmdW5jdGlvbiI9PT10KX1mdW5jdGlvbiB1KGUpe3JldHVybiEhZChlKSYmcyhlKT09PXZsfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gZihlKXtyZXR1cm4gdShlKT9lOmx9ZnVuY3Rpb24gcChlKXtyZXR1cm4gZyhlKT9bXTpPYmplY3Qua2V5cyhlKX1mdW5jdGlvbiBtKGUsdCl7cmV0dXJuIGcodCk/W106KG1sKHQpP19sOkNsKShmKGUpLHQpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP2VbMF06dW5kZWZpbmVkfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGcoZSk/W106W10uY29uY2F0LmFwcGx5KFtdLGUpfWZ1bmN0aW9uIGIoYSl7Zm9yKHZhciBvPXRoaXMscz1hP2EubGVuZ3RoOjAsZT1zO2UtPTE7KWlmKCF1KGFbZV0pKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCx0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspbltyXT1hcmd1bWVudHNbcl07Zm9yKHZhciBpPXM/YVtlXS5hcHBseShvLG4pOm5bMF07KGUrPTEpPHM7KWk9YVtlXS5jYWxsKG8saSk7cmV0dXJuIGl9fWZ1bmN0aW9uIHkoZSx0KXtnKHQpfHwobWwodCk/Ymw6eWwpKGYoZSksdCl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PT10dChlKX1mdW5jdGlvbiBDKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IW1sKGUpJiZfKGUpJiZzKGUpPT09eGx9ZnVuY3Rpb24geChlKXtpZighQyhlKSlyZXR1cm4tMTtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9MDtyPG47cis9MSl0PSh0PDw1KS10K2UuY2hhckNvZGVBdChyKSY0Mjk0OTY3Mjk1O3JldHVybiB0fWZ1bmN0aW9uIGsoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYtMTxlJiZlJTE9PTAmJmU8PWtsfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIG51bGwhPWUmJmsoZS5sZW5ndGgpJiYhdShlKX1mdW5jdGlvbiBJKGUsdCl7cmV0dXJuIEVsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSxlKX1mdW5jdGlvbiB3KGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj1BcnJheShuKTt0PG47KXJbdF09ZVt0XSx0Kz0xO3JldHVybiByfWZ1bmN0aW9uIEQoZSl7cmV0dXJuIGUuc3BsaXQoIiIpfWZ1bmN0aW9uIEEoZSl7cmV0dXJuIGcoZSk/W106RShlKT9DKGUpP0QoZSk6dyhlKTpJKHAoZSksZSl9ZnVuY3Rpb24gUyhlKXtpZihudWxsPT1lKXJldHVybiEwO2lmKEUoZSkmJihtbChlKXx8QyhlKXx8dShlLnNwbGljZSkpKXJldHVybiFlLmxlbmd0aDtmb3IodmFyIHQgaW4gZSlpZihJbC5jYWxsKGUsdCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gVChlKXtyZXR1cm4gZyhlKT8iIjp3bC5jYWxsKGUpfWZ1bmN0aW9uIFAoZSl7cmV0dXJuIEMoZSk/IVQoZSk6UyhlKX1mdW5jdGlvbiBPKGUpe3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0KGUpKX1mdW5jdGlvbiBqKGUpe2lmKCFfKGUpfHxzKGUpIT09RGwpcmV0dXJuITE7dmFyIHQ9TyhlKTtpZihudWxsPT09dClyZXR1cm4hMDt2YXIgbj1QbC5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4gaW5zdGFuY2VvZiBuJiZUbC5jYWxsKG4pPT09T2x9ZnVuY3Rpb24gTChlKXtyZXR1cm4gXyhlKSYmMT09PWUubm9kZVR5cGUmJiFqKGUpfWZ1bmN0aW9uIE0oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfHxfKGUpJiZzKGUpPT09TGx9ZnVuY3Rpb24gVihlLHQpe3JldHVybiBtbCh0KT90LmpvaW4oZXx8IiIpOiIifWZ1bmN0aW9uIFIoZSx0KXtyZXR1cm4gZyh0KT9bXToobWwodCk/RWw6TWwpKGYoZSksdCl9ZnVuY3Rpb24gRigpe31mdW5jdGlvbiBOKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gQihlLHQsbil7cmV0dXJuIGcobik/dDoobWwobik/Vmw6UmwpKGYoZSksdCxuKX1mdW5jdGlvbiBVKGUpe3JldHVybiBudWxsPT1lP2U6RmwuY2FsbChlKX1mdW5jdGlvbiBxKGUsdCl7cmV0dXJuIFAodCk/W106dC5zcGxpdChlfHwiIil9ZnVuY3Rpb24geihlLHQpe3JldHVybiBlK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1lKzEpKX1mdW5jdGlvbiBIKCl7dmFyIG49TigpO3JldHVybiJ4eHh4eHh4eHh4eHg0eHh4eXh4eHh4eHh4eHh4eHh4eCIucmVwbGFjZSgvW3h5XS9nLGZ1bmN0aW9uKGUpe3ZhciB0PShuK3ooMCwxNikpJTE2fDA7cmV0dXJuIG49TWF0aC5mbG9vcihuLzE2KSwoIngiPT09ZT90OjMmdHw4KS50b1N0cmluZygxNil9KX1mdW5jdGlvbiBXKHQsbil7dFtxZl0mJihnKG5bWGZdKXx8KHRbRHBdPW5bWGZdKSx5KGZ1bmN0aW9uKGUpe2cobltlXSl8fCh0W2VdPW5bZV0pfSxkZykpfWZ1bmN0aW9uIEcoZSl7dmFyIHQ9ZS5kb2N1bWVudE1vZGU7cmV0dXJuIXR8fDEwPD10fWZ1bmN0aW9uIFkoZSl7dmFyIHQ9ZS5jb21wYXRNb2RlO3JldHVybiB0JiYiQ1NTMUNvbXBhdCI9PT10fWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGNnLnRlc3QoZSl9ZnVuY3Rpb24gSyhlKXtpZihYKGUpKXJldHVybiBlO3ZhciB0PVUocSgiLiIsZSkpLG49dC5sZW5ndGg7cmV0dXJuIDM8PW4mJnVnLnRlc3QodFsxXSk/dFsyXSsiLiIrdFsxXSsiLiIrdFswXToxPT09bj90WzBdOnRbMV0rIi4iK3RbMF19ZnVuY3Rpb24gUShlLHQsbil7dmFyIHI9IiI7ZS5sb2NhdGlvbi5wcm90b2NvbD09PXNnfHwocj1LKGUubG9jYXRpb24uaG9zdG5hbWUpKSxuW2xwXT1yLG5bcWZdPVkodCkmJkcodCksVyhuLGVbeHBdfHx7fSl9ZnVuY3Rpb24gJChlKXtRKGNsLHVsLGUpO3ZhciB0PWNsLmxvY2F0aW9uLnByb3RvY29sPT09c2c7KGxnPWxsKHt9LGUpKVtaZl09ZVtaZl0vMWUzLGxnW2VwXT1lW2VwXS8xZTMsbGdbdXBdPWxnW29wXXx8dD8iaHR0cHM6IjoiIn1mdW5jdGlvbiBudCgpe3JldHVybiBsZ31mdW5jdGlvbiBKKGUpe3RyeXtyZXR1cm4gcGcoZSl9Y2F0Y2godCl7cmV0dXJue319fWZ1bmN0aW9uIFooZSl7dHJ5e3JldHVybiBnZyhlKX1jYXRjaCh0KXtyZXR1cm4iIn19ZnVuY3Rpb24gZWUoZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7cmV0dXJuIGV9fWZ1bmN0aW9uIHRlKGUpe3RyeXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpfWNhdGNoKHQpe3JldHVybiBlfX1mdW5jdGlvbiBuZShlKXtpZihoZ1tlXSlyZXR1cm4gaGdbZV07bWcuaHJlZj1lO3ZhciB0PWZnKG1nLmhyZWYpO3JldHVybiB0LnF1ZXJ5S2V5PUoodC5xdWVyeSksaGdbZV09dCxoZ1tlXX1mdW5jdGlvbiByZShlLHQsbil7cmV0dXJue25hbWU6ZSx2YWx1ZTp0LGV4cGlyZXM6bn19ZnVuY3Rpb24gaWUoZSl7dmFyIHQ9cSgiIyIsZSk7cmV0dXJuIFModCl8fHQubGVuZ3RoPDM/bnVsbDppc05hTihwYXJzZUludCh0WzJdLDEwKSk/bnVsbDpyZShlZSh0WzBdKSxlZSh0WzFdKSxOdW1iZXIodFsyXSkpfWZ1bmN0aW9uIGFlKGUpe3JldHVybiBQKGUpP1tdOnEoInwiLGUpfWZ1bmN0aW9uIG9lKCl7dmFyIGU9UihpZSxhZSh2ZyhfZykpKSx0PU1hdGguY2VpbChOKCkvMWUzKSxuPWZ1bmN0aW9uIG4oZSl7cmV0dXJuIGQoZSkmJnQ8PWUuZXhwaXJlc307cmV0dXJuIEIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0Lm5hbWVdPXQsZX0se30sbShuLGUpKX1mdW5jdGlvbiBzZShlKXt2YXIgdD1vZSgpW2VdO3JldHVybiBkKHQpP3QudmFsdWU6IiJ9ZnVuY3Rpb24gY2UoZSl7cmV0dXJuIFYoIiMiLFt0ZShlLm5hbWUpLHRlKGUudmFsdWUpLGUuZXhwaXJlc10pfWZ1bmN0aW9uIHVlKGUpe3JldHVybiBlLmV4cGlyZXN9ZnVuY3Rpb24gbGUoZSl7dmFyIHQ9Uih1ZSxlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0KX1mdW5jdGlvbiBkZShlLHQpe3ZhciBuPUEoZSkscj1NYXRoLmFicygxZTMqbGUobiktTigpKSxpPVYoInwiLFIoY2UsbikpLGE9bmV3IERhdGUoTigpK3IpO2JnKF9nLGkse2RvbWFpbjp0LGV4cGlyZXM6YX0pfWZ1bmN0aW9uIGZlKGUpe3ZhciB0PWUubmFtZSxuPWUudmFsdWUscj1lLmV4cGlyZXMsaT1lLmRvbWFpbixhPW9lKCk7YVt0XT1yZSh0LG4sTWF0aC5jZWlsKHIrTigpLzFlMykpLGRlKGEsaSl9ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGpsKHZnKGUpKX1mdW5jdGlvbiBnZShlLHQpe3ZhciBuPUooZS5sb2NhdGlvbi5zZWFyY2gpO3JldHVybiBqbChuW3RdKX1mdW5jdGlvbiBtZShlLHQpe3ZhciBuPW5lKGUucmVmZXJyZXIpLnF1ZXJ5S2V5O3JldHVybiFnKG4pJiZqbChuW3RdKX1mdW5jdGlvbiBoZShlLHQsbil7cmV0dXJuIHBlKG4pfHxnZShlLG4pfHxtZSh0LG4pfWZ1bmN0aW9uIHZlKCl7dmFyIGU9bnQoKVtscF07YmcoeGQsa2Qse2RvbWFpbjplfSk7dmFyIHQ9dmcoeGQpPT09a2Q7cmV0dXJuIHlnKHhkKSx0fWZ1bmN0aW9uIGJlKCl7cmV0dXJuIGhlKGNsLHVsLF9kKX1mdW5jdGlvbiB5ZSgpe3JldHVybiBudCgpW3FmXSYmdmUoKSYmIWJlKCl9ZnVuY3Rpb24gX2UoKXtyZXR1cm4gaGUoY2wsdWwseWQpfWZ1bmN0aW9uIENlKCl7cmV0dXJuIGhlKGNsLHVsLENkKX1mdW5jdGlvbiB4ZShlLHQpe3ZhciBuPWUuY29uc29sZTtyZXR1cm4hZyhuKSYmdShuW3RdKX1mdW5jdGlvbiBrZShlLHQpe3ZhciBuPWUuY29uc29sZTt4ZShlLCJ3YXJuIikmJm4ud2Fybi5hcHBseShuLFtDZ10uY29uY2F0KHQpKX1mdW5jdGlvbiBFZShlLHQpe3ZhciBuPWUuY29uc29sZTt4ZShlLCJkZWJ1ZyIpJiZfZSgpJiZuLmRlYnVnLmFwcGx5KG4sW0NnXS5jb25jYXQodCkpfWZ1bmN0aW9uIEllKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07a2UoY2wsdCl9ZnVuY3Rpb24gd2UoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtFZShjbCx0KX1mdW5jdGlvbiBEZShuKXtyZXR1cm4gQihmdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPW5bdF0sZX0se30sZGcpfWZ1bmN0aW9uIEFlKGUsdCxuKXt2YXIgcj1lW0NwXXx8W107aWYoZVtDcF09cixuKXt2YXIgaT1yLnB1c2g7cltLZl09eGcsclticF09RGUodCksclt5cF09W10scltfcF09W10sci5wdXNoPWZ1bmN0aW9uIGEoZSl7cltfcF0ucHVzaChsbCh7dGltZXN0YW1wOk4oKX0sZSkpLGkuY2FsbCh0aGlzLGUpfX19ZnVuY3Rpb24gU2UoZSx0LG4scil7dD09PV9wJiZlW0NwXS5wdXNoKG4pLHImJnQhPT1fcCYmZVtDcF1bdF0ucHVzaChsbCh7dGltZXN0YW1wOk4oKX0sbikpfWZ1bmN0aW9uIFRlKCl7QWUoY2wsbnQoKSxfZSgpKX1mdW5jdGlvbiBQZShlKXtTZShjbCxfcCxlLF9lKCkpfWZ1bmN0aW9uIE9lKGUpe1NlKGNsLHlwLGUsX2UoKSl9ZnVuY3Rpb24gamUoKXtyZXR1cm4gdShFZyl9ZnVuY3Rpb24gTGUoZSl7cmV0dXJuIG5ldyBFZyhlKX1mdW5jdGlvbiBNZSgpe3ZhciBlPXVsLmNyZWF0ZVRleHROb2RlKCIiKSx0PWZ1bmN0aW9uIHQoKXtlLnRleHRDb250ZW50PTA8ZS50ZXh0Q29udGVudC5sZW5ndGg/IiI6ImEifSxuPVtdO3JldHVybiBMZShmdW5jdGlvbigpe2Zvcih2YXIgZT1uLmxlbmd0aCx0PTA7dDxlO3QrPTEpblt0XSgpO24uc3BsaWNlKDAsZSl9KS5vYnNlcnZlKGUse2NoYXJhY3RlckRhdGE6ITB9KSxmdW5jdGlvbihlKXtuLnB1c2goZSksdCgpfX1mdW5jdGlvbiBWZSgpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1rZygiPHNjcmlwdD4iKTt0Lm9uKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe3Qub24oInJlYWR5c3RhdGVjaGFuZ2UiLG51bGwpLHQucmVtb3ZlKCksdD1udWxsLGUoKX0pLGtnKHVsLmRvY3VtZW50RWxlbWVudCkuYXBwZW5kKHQpfX1mdW5jdGlvbiBSZSgpe2plKCk/cGwuX3NldEltbWVkaWF0ZUZuKE1lKCkpOi0xIT09Y2wubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDEwIikmJnBsLl9zZXRJbW1lZGlhdGVGbihWZSgpKX1mdW5jdGlvbiBGZShlKXtyZXR1cm4gbmV3IHBsKGUpfWZ1bmN0aW9uIE5lKGUpe3JldHVybiBwbC5yZXNvbHZlKGUpfWZ1bmN0aW9uIEJlKGUpe3JldHVybiBwbC5yZWplY3QoZSl9ZnVuY3Rpb24gVWUoZSl7cmV0dXJuIG1sKGUpP3BsLnJhY2UoZSk6QmUobmV3IFR5cGVFcnJvcihJZykpfWZ1bmN0aW9uIHFlKGUpe3JldHVybiBtbChlKT9wbC5hbGwoZSk6QmUobmV3IFR5cGVFcnJvcihJZykpfWZ1bmN0aW9uIHplKGUsbixyKXt2YXIgaT0tMTtyZXR1cm4gVWUoW2UsRmUoZnVuY3Rpb24oZSx0KXtpPW8oZnVuY3Rpb24oKXtyZXR1cm4gdChuZXcgRXJyb3IocikpfSxuKX0pXSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gYShpKSxlfSxmdW5jdGlvbihlKXt0aHJvdyBhKGkpLGV9KX1mdW5jdGlvbiBIZShlKXtpZihnKGVbV3BdKSlyZXR1cm4hMTt2YXIgdD1lW1dwXTtpZihnKHRbR3BdKSlyZXR1cm4hMTt2YXIgbj10W0dwXTtyZXR1cm4gdShuW1hwXSkmJnUobltZcF0pfWZ1bmN0aW9uIFdlKGUsdCl7cmV0dXJuISF0JiZIZShlKX1mdW5jdGlvbiBHZShlLHQpe2lmKCFIZShlKSlyZXR1cm4hMDt2YXIgbj1lW1dwXVtHcF0scj0oZVtXcF1bR3BdW0twXXx8e30pW3RdO3JldHVybiBuW1lwXShyKX1mdW5jdGlvbiBZZShlLHQpe2lmKCFIZShlKSlyZXR1cm4gTmUoITApO3ZhciBuPWVbV3BdW0dwXSxyPShlW1dwXVtHcF1bS3BdfHx7fSlbdF07cmV0dXJuIEZlKGZ1bmN0aW9uKGUsdCl7bltYcF0oZnVuY3Rpb24oKXtuW1lwXShyKT9lKCEwKTp0KFpwKX0sITApfSl9ZnVuY3Rpb24gWGUoKXt2YXIgZT1udCgpW0pwXTtyZXR1cm4gV2UoY2wsZSl9ZnVuY3Rpb24gS2UoKXtyZXR1cm4gR2UoY2wsUXApfWZ1bmN0aW9uIFFlKCl7cmV0dXJuIEdlKGNsLCRwKX1mdW5jdGlvbiAkZSgpe3JldHVybiBZZShjbCxRcCl9ZnVuY3Rpb24gSmUoKXtyZXR1cm4gSihjbC5sb2NhdGlvbi5zZWFyY2gpW3BwXX1mdW5jdGlvbiBaZShlLHQpe2ZlKHtuYW1lOmhwLHZhbHVlOmUsZXhwaXJlczp0W2VwXSxkb21haW46dFtscF19KX1mdW5jdGlvbiBldCgpe2lmKFhlKCkmJiFLZSgpKXJldHVybiB3Zzt2YXIgZT1udCgpLHQ9SmUoKTtyZXR1cm4gamwodCk/WmUodCxlKTpQKHNlKGhwKSkmJlplKHdnLGUpLHNlKGhwKX1mdW5jdGlvbiBydChlKXt2YXIgdD1udCgpO2ZlKHtuYW1lOmdwLHZhbHVlOmUsZXhwaXJlczp0W1pmXSxkb21haW46dFtscF19KX1mdW5jdGlvbiBpdCgpe3JldHVybiBzZShncCl9ZnVuY3Rpb24gYXQoZSl7aWYoUChlKSlyZXR1cm4iIjt2YXIgdD1EZy5leGVjKGUpO3JldHVybiBTKHQpfHwyIT09dC5sZW5ndGg/IiI6dFsxXX1mdW5jdGlvbiBvdCgpe2lmKCFudCgpW3JwXSlyZXR1cm4iIjt2YXIgZT12ZyhtcCk7cmV0dXJuIFAoZSk/IiI6ZX1mdW5jdGlvbiBzdChlKXt2YXIgdD1udCgpO2lmKHRbcnBdKXt2YXIgbj10W2xwXSxyPW5ldyBEYXRlKE4oKSt0W2lwXSksaT12ZyhtcCksYT17ZG9tYWluOm4sZXhwaXJlczpyfTtpZihqbChpKSliZyhtcCxpLGEpO2Vsc2V7dmFyIG89YXQoZSk7UChvKXx8YmcobXAsbyxhKX19fWZ1bmN0aW9uIGN0KGUscil7ZnVuY3Rpb24gdChlLHQpe3ZhciBuPXIuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7cmV0dXJuIHQ9dHx8e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMSxkZXRhaWw6dW5kZWZpbmVkfSxuLmluaXRDdXN0b21FdmVudChlLHQuYnViYmxlcyx0LmNhbmNlbGFibGUsdC5kZXRhaWwpLG59dShlLkN1c3RvbUV2ZW50KXx8KHQucHJvdG90eXBlPWUuRXZlbnQucHJvdG90eXBlLGUuQ3VzdG9tRXZlbnQ9dCl9ZnVuY3Rpb24gdXQoZSx0KXt2YXIgbj1lKCkscj10KCksaT17fTtyZXR1cm4gaS5zZXNzaW9uSWQ9bixqbChyKSYmKGkuZGV2aWNlSWQ9ciksaX1mdW5jdGlvbiBsdChlLHQsbixyKXt2YXIgaT1uZXcgZS5DdXN0b21FdmVudChuLHtkZXRhaWw6cn0pO3QuZGlzcGF0Y2hFdmVudChpKX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPXQubWJveCxyPXQuZXJyb3IsaT10LnVybCxhPXQuYW5hbHl0aWNzRGV0YWlscyxvPXQucmVzcG9uc2VUb2tlbnMscz10LmV4ZWN1dGlvbixjPXt0eXBlOmUsdHJhY2tpbmc6dXQoZXQsaXQpfTtyZXR1cm4gZyhuKXx8KGMubWJveD1uKSxnKHIpfHwoYy5lcnJvcj1yKSxnKGkpfHwoYy51cmw9aSksUyhhKXx8KGMuYW5hbHl0aWNzRGV0YWlscz1hKSxTKG8pfHwoYy5yZXNwb25zZVRva2Vucz1vKSxTKHMpfHwoYy5leGVjdXRpb249cyksY31mdW5jdGlvbiBmdCgpe3ZhciBlPWR0KEFnLHt9KTtsdChjbCx1bCxBZyxlKX1mdW5jdGlvbiBwdChlKXt2YXIgdD1kdChTZyxlKTtsdChjbCx1bCxTZyx0KX1mdW5jdGlvbiBndChlLHQpe3ZhciBuPWR0KFRnLGUpO24ucmVkaXJlY3Q9dCxsdChjbCx1bCxUZyxuKX1mdW5jdGlvbiBtdChlKXt2YXIgdD1kdChQZyxlKTtsdChjbCx1bCxQZyx0KX1mdW5jdGlvbiBodChlKXt2YXIgdD1kdChPZyxlKTtsdChjbCx1bCxPZyx0KX1mdW5jdGlvbiB2dChlKXt2YXIgdD1kdChqZyxlKTtsdChjbCx1bCxqZyx0KX1mdW5jdGlvbiBidChlKXt2YXIgdD1kdChMZyxlKTtsdChjbCx1bCxMZyx0KX1mdW5jdGlvbiB5dChlKXt2YXIgdD1kdChNZyxlKTtsdChjbCx1bCxNZyx0KX1mdW5jdGlvbiBfdChlKXt2YXIgdD1kdChWZyxlKTtsdChjbCx1bCxWZyx0KX1mdW5jdGlvbiBDdChlKXt2YXIgdD1lLmNoYXJBdCgwKSxuPWUuY2hhckF0KDEpLHI9ZS5jaGFyQXQoMiksaT17a2V5OmV9O3JldHVybiBpLnZhbD0iLSI9PT1uPyIiK3QrbisiXFwzIityKyIgIjp0KyJcXDMiK24rIiAiLGl9ZnVuY3Rpb24geHQoZSl7dmFyIHQ9ZS5tYXRjaChCZyk7cmV0dXJuIFModCk/ZTpCKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSh0LmtleSx0LnZhbCl9LGUsUihDdCx0KSl9ZnVuY3Rpb24ga3QoZSl7Zm9yKHZhciB0LG4scixpLGE9W10sbz1UKGUpLHM9by5pbmRleE9mKFJnKTstMSE9PXM7KXQ9VChvLnN1YnN0cmluZygwLHMpKSxpPShuPVQoby5zdWJzdHJpbmcocykpKS5pbmRleE9mKEZnKSxyPVQobi5zdWJzdHJpbmcoTmcsaSkpLHM9KG89VChuLnN1YnN0cmluZyhpKzEpKSkuaW5kZXhPZihSZyksdCYmciYmYS5wdXNoKHtzZWw6dCxlcTpOdW1iZXIocil9KTtyZXR1cm4gbyYmYS5wdXNoKHtzZWw6b30pLGF9ZnVuY3Rpb24gRXQoZSl7aWYoTChlKSlyZXR1cm4ga2coZSk7aWYoIUMoZSkpcmV0dXJuIGtnKGUpO3ZhciB0PXh0KGUpO2lmKC0xPT09dC5pbmRleE9mKFJnKSlyZXR1cm4ga2codCk7dmFyIG49a3QodCk7cmV0dXJuIEIoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNlbCxyPXQuZXE7cmV0dXJuIGU9ZS5maW5kKG4pLE0ocikmJihlPWUuZXEocikpLGV9LGtnKHVsKSxuKX1mdW5jdGlvbiBJdChlKXtyZXR1cm4gMDxFdChlKS5sZW5ndGh9ZnVuY3Rpb24gd3QoZSl7cmV0dXJuIGtnKCI8IitOZCsiLz4iKS5hcHBlbmQoZSl9ZnVuY3Rpb24gRHQoZSl7cmV0dXJuIGtnKGUpfWZ1bmN0aW9uIEF0KGUpe3JldHVybiBFdChlKS5wcmV2KCl9ZnVuY3Rpb24gU3QoZSl7cmV0dXJuIEV0KGUpLm5leHQoKX1mdW5jdGlvbiBUdChlKXtyZXR1cm4gRXQoZSkucGFyZW50KCl9ZnVuY3Rpb24gUHQoZSx0KXtyZXR1cm4gRXQodCkuaXMoZSl9ZnVuY3Rpb24gT3QoZSx0KXtyZXR1cm4gRXQodCkuZmluZChlKX1mdW5jdGlvbiBqdChlKXtyZXR1cm4gRXQoZSkuY2hpbGRyZW4oKX1mdW5jdGlvbiBMdCgpe2NsW3pnXT1jbFt6Z118fHt9LGNsW3pnXS5xdWVyeVNlbGVjdG9yQWxsPUV0fWZ1bmN0aW9uIE10KGUpe2lmKENlKCkpe3ZhciB0PWVbVnBdO2NsW3pnXVtXZ109dH19ZnVuY3Rpb24gVnQoKXt1bC5hZGRFdmVudExpc3RlbmVyKGpkLGZ1bmN0aW9uKGUpe3UoY2xbemddW0hnXSkmJmNsW3pnXVtIZ10oZSl9LCEwKX1mdW5jdGlvbiBSdCgpe2lmKENlKCkpe0x0KCk7dmFyIGU9bnQoKVtjcF0sdD1mdW5jdGlvbiB0KCl7cmV0dXJuIFZ0KCl9LG49ZnVuY3Rpb24gbigpe3JldHVybiBJZShVZyl9O3dlKHFnKSxnbChlKS50aGVuKHQpWyJjYXRjaCJdKG4pfX1mdW5jdGlvbiBGdChlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZnVuY3Rpb24gTnQoZSl7dmFyIHQ9RnQoZSk7cmV0dXJuIGlzTmFOKHQpP251bGw6dH1mdW5jdGlvbiBCdChlKXtyZXR1cm4gcShKZyxlKX1mdW5jdGlvbiBVdChlKXt2YXIgdD1xKEpnLGUpLG49TnQodFswXSk7aWYoZyhuKSlyZXR1cm4gbnVsbDt2YXIgcj17fTtyLmFjdGl2aXR5SW5kZXg9bjt2YXIgaT1OdCh0WzFdKTtyZXR1cm4gZyhpKXx8KHIuZXhwZXJpZW5jZUluZGV4PWkpLHJ9ZnVuY3Rpb24gcXQoZSl7cmV0dXJuIG0oWmcsUihVdCxlKSl9ZnVuY3Rpb24genQoZSl7cmV0dXJuIG1sKGUpP3F0KGUpOnF0KFtlXSl9ZnVuY3Rpb24gSHQoZSl7dmFyIHQ9SihlKSxuPXRbWWddO2lmKFAobikpcmV0dXJuIG51bGw7dmFyIHI9e307ci50b2tlbj1uO3ZhciBpPXRbS2ddO2psKGkpJiZpPT09a2QmJihyLmxpc3RlZEFjdGl2aXRpZXNPbmx5PSEwKTt2YXIgYT10W1FnXTtqbChhKSYmKHIuZXZhbHVhdGVBc1RydWVBdWRpZW5jZUlkcz1CdChhKSk7dmFyIG89dFskZ107amwobykmJihyLmV2YWx1YXRlQXNGYWxzZUF1ZGllbmNlSWRzPUJ0KG8pKTt2YXIgcz10W1hnXTtyZXR1cm4gUyhzKXx8KHIucHJldmlld0luZGV4ZXM9enQocykpLHJ9ZnVuY3Rpb24gV3QoZSl7dmFyIHQ9SHQoZS5sb2NhdGlvbi5zZWFyY2gpO2lmKCFnKHQpKXt2YXIgbj1uZXcgRGF0ZShOKCkrMTg2ZTQpO2JnKEdnLEpTT04uc3RyaW5naWZ5KHQpLHtleHBpcmVzOm59KX19ZnVuY3Rpb24gR3QoKXt2YXIgZT12ZyhHZyk7aWYoUChlKSlyZXR1cm57fTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2godCl7cmV0dXJue319fWZ1bmN0aW9uIFl0KGUpe3JldHVybiBFdChlKS5lbXB0eSgpLnJlbW92ZSgpfWZ1bmN0aW9uIFh0KGUsdCl7cmV0dXJuIEV0KHQpLmFmdGVyKGUpfWZ1bmN0aW9uIEt0KGUsdCl7cmV0dXJuIEV0KHQpLmJlZm9yZShlKX1mdW5jdGlvbiBRdChlLHQpe3JldHVybiBFdCh0KS5hcHBlbmQoZSl9ZnVuY3Rpb24gJHQoZSx0KXtyZXR1cm4gRXQodCkucHJlcGVuZChlKX1mdW5jdGlvbiBKdChlLHQpe3JldHVybiBFdCh0KS5odG1sKGUpfWZ1bmN0aW9uIFp0KGUpe3JldHVybiBFdChlKS5odG1sKCl9ZnVuY3Rpb24gZW4oZSx0KXtyZXR1cm4gRXQodCkudGV4dChlKX1mdW5jdGlvbiB0bihlLHQpe3JldHVybiI8IitWZCsiICIrUGQrJz0iJytlKyciICcrT2QrJz0iJytOZisnIj4nK3QrIjwvIitWZCsiPiJ9ZnVuY3Rpb24gbm4oZSx0KXtyZXR1cm4gdG4oZW0reCh0KSx0KyIgeyIrZSsifSIpfWZ1bmN0aW9uIHJuKGUsdCl7cmV0dXJuIHRuKHJtLHQrIiB7IitlKyJ9Iil9ZnVuY3Rpb24gYW4oZSl7aWYoITA9PT1lW0pmXSYmIUl0KG5tKSl7dmFyIHQ9ZVskZl07UXQodG4odG0sdCksTGQpfX1mdW5jdGlvbiBvbihlKXshMD09PWVbSmZdJiZJdChubSkmJll0KG5tKX1mdW5jdGlvbiBzbihlLHQpe2lmKCFTKHQpKXt2YXIgbj1mdW5jdGlvbiBuKGUpe3JldHVybiFJdCgiIyIrKGVtK3goZSkpKX0scj1tKG4sdCk7aWYoIVMocikpe3ZhciBpPWVbUWZdLGE9ZnVuY3Rpb24gYShlKXtyZXR1cm4gbm4oaSxlKX07UXQoVigiXG4iLFIoYSxyKSksTGQpfX19ZnVuY3Rpb24gY24oZSx0KXtTKHQpfHxJdCgiIyIrcm0pfHxRdChybihlW1FmXSxWKCIsICIsdCkpLExkKX1mdW5jdGlvbiB1bigpe2FuKG50KCkpfWZ1bmN0aW9uIGxuKCl7b24obnQoKSl9ZnVuY3Rpb24gZG4oZSl7c24obnQoKSxlKX1mdW5jdGlvbiBmbihlKXtjbihudCgpLGUpfWZ1bmN0aW9uIHBuKGUpe1l0KCIjIisoZW0reChlKSkpfWZ1bmN0aW9uIGduKCl7dmFyIGU9IiMiK3JtO0l0KGUpJiZZdChlKX1mdW5jdGlvbiBtbihlKXtyZXR1cm4hZyhlW1BkXSl9ZnVuY3Rpb24gaG4oZSl7cmV0dXJuIWcoZVtBcF0pfWZ1bmN0aW9uIHZuKGUpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuInVua25vd24iO2Nhc2UgMTpyZXR1cm4iYXV0aGVudGljYXRlZCI7Y2FzZSAyOnJldHVybiJsb2dnZWRfb3V0IjtkZWZhdWx0OnJldHVybiJ1bmtub3duIn19ZnVuY3Rpb24gYm4oZSl7cmV0dXJuIG1uKGUpfHxobihlKX1mdW5jdGlvbiB5bihlKXtpZihnKGUpKXJldHVybltdO2lmKCF1KGVbbG1dKSlyZXR1cm5bXTt2YXIgdD1lW2xtXSgpO3JldHVybiBkKHQpP0IoZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW1RwXT1uLG1uKHQpJiYocltQZF09dFtQZF0pLGhuKHQpJiYocltTcF09dm4odFtBcF0pKSxlLnB1c2gociksZX0sW10sbShibix0KSk6W119ZnVuY3Rpb24gX24oZSx0KXtyZXR1cm4gZyhlKT9udWxsOnUoZVt1bV0pP2VbdW1dKHQpOm51bGx9ZnVuY3Rpb24gQ24oZSx0KXtpZihnKGUpKXJldHVybiBudWxsO3ZhciBuPWVbdF07cmV0dXJuIGcobik/bnVsbDpufWZ1bmN0aW9uIHhuKGUsdCxuKXtpZihQKHQpKXJldHVybiBudWxsO2lmKGcoZVtwbV0pKXJldHVybiBudWxsO2lmKCF1KGVbcG1dW2dtXSkpcmV0dXJuIG51bGw7dmFyIHI9ZVtwbV1bZ21dKHQse3NkaWRQYXJhbUV4cGlyeTpufSk7cmV0dXJuIGQocikmJnUoclttbV0pJiZyW21tXSgpP3I6bnVsbH1mdW5jdGlvbiBrbihlLHQpe2lmKCF1KGUuZ2V0VmlzaXRvclZhbHVlcykpcmV0dXJuIE5lKHt9KTt2YXIgbj1bc20sYW0sb21dO3JldHVybiB0JiZuLnB1c2goY20pLEZlKGZ1bmN0aW9uKHQpe2UuZ2V0VmlzaXRvclZhbHVlcyhmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sbil9KX1mdW5jdGlvbiBFbihlKXtyZXR1cm4gd2Uodm0sZSkse319ZnVuY3Rpb24gSW4oZSx0LG4pe3JldHVybiBnKGUpP05lKHt9KTp6ZShrbihlLG4pLHQsaG0pWyJjYXRjaCJdKEVuKX1mdW5jdGlvbiB3bihlLHQpe2lmKCF1KGUuZ2V0VmlzaXRvclZhbHVlcykpcmV0dXJue307dmFyIG49W3NtLGFtLG9tXTt0JiZuLnB1c2goY20pO3ZhciByPXt9O3JldHVybiBlLmdldFZpc2l0b3JWYWx1ZXMoZnVuY3Rpb24oZSl7cmV0dXJuIGxsKHIsZSl9LG4pLHJ9ZnVuY3Rpb24gRG4oZSx0KXtyZXR1cm4gZyhlKT97fTp3bihlLHQpfWZ1bmN0aW9uIEFuKCl7dmFyIGU9bnQoKSx0PWVbSGZdLG49ZVtzcF07cmV0dXJuIHhuKGNsLHQsbil9ZnVuY3Rpb24gU24oKXt2YXIgZT1BbigpLHQ9bnQoKTtyZXR1cm4gSW4oZSx0W25wXSx0W2FwXSl9ZnVuY3Rpb24gVG4oKXtyZXR1cm4gRG4oQW4oKSxudCgpW2FwXSl9ZnVuY3Rpb24gUG4oKXtyZXR1cm4geW4oQW4oKSl9ZnVuY3Rpb24gT24oZSl7cmV0dXJuIF9uKEFuKCksZSl9ZnVuY3Rpb24gam4oZSl7cmV0dXJuIENuKEFuKCksZSl9ZnVuY3Rpb24gTG4oZSx0KXtibVtlXT10fWZ1bmN0aW9uIE1uKGUpe3JldHVybiBibVtlXX1mdW5jdGlvbiBWbihlKXt2YXIgdD1lW3hwXTtpZihnKHQpKXJldHVybiExO3ZhciBuPXRbRXBdO3JldHVybiEoIW1sKG4pfHxTKG4pKX1mdW5jdGlvbiBSbihlKXt2YXIgdD1lW1NmXTtpZighQyh0KXx8Uyh0KSlyZXR1cm4hMTt2YXIgbj1lW0tmXTtpZighQyhuKXx8UyhuKSlyZXR1cm4hMTt2YXIgcj1lW0dmXTtyZXR1cm4hKCFnKHIpJiYhTShyKXx8IXUoZVtSZl0pKX1mdW5jdGlvbiBGbihlKXtyZXR1cm4gRmUoZnVuY3Rpb24obixyKXtlKGZ1bmN0aW9uKGUsdCl7ZyhlKT9uKHQpOnIoZSl9KX0pfWZ1bmN0aW9uIE5uKGUsdCxuLHIsaSxhKXt2YXIgbz17fTtvW2VdPXQsb1tuXT1yLG9baV09YTt2YXIgcz17fTtyZXR1cm4gc1trcF09byxzfWZ1bmN0aW9uIEJuKGUpe3ZhciBuPWVbU2ZdLHI9ZVtLZl0sdD1lW0dmXXx8Q207cmV0dXJuIHplKEZuKGVbUmZdKSx0LF9tKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PU5uKFNmLG4sS2YscixQZixlKTtyZXR1cm4gd2UoeW0sRWYsdCksT2UodCksZX0pWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe3ZhciB0PU5uKFNmLG4sS2YscixfZixlKTtyZXR1cm4gd2UoeW0sX2YsdCksT2UodCkse319KX1mdW5jdGlvbiBVbihlKXt2YXIgdD1CKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGxsKGUsdCl9LHt9LGUpO3JldHVybiBMbihFcCx0KSx0fWZ1bmN0aW9uIHFuKGUpe3JldHVybiBWbihlKT9xZShSKEJuLG0oUm4sZVt4cF1bRXBdKSkpLnRoZW4oVW4pOk5lKHt9KX1mdW5jdGlvbiB6bigpe3ZhciBlPU1uKEVwKTtyZXR1cm4gZyhlKT97fTplfWZ1bmN0aW9uIEhuKCl7cmV0dXJuIHFuKGNsKX1mdW5jdGlvbiBXbigpe3JldHVybiB6bigpfWZ1bmN0aW9uIEduKGUpe3ZhciB0PUooZS5sb2NhdGlvbi5zZWFyY2gpW3htXTtyZXR1cm4gUCh0KT9udWxsOnR9ZnVuY3Rpb24gWW4oKXt2YXIgZT12ZyhrbSk7cmV0dXJuIFAoZSk/bnVsbDplfWZ1bmN0aW9uIFhuKCl7dmFyIGU9R24oY2wpLHQ9WW4oKTtyZXR1cm4gZXx8dH1mdW5jdGlvbiBLbihlKXtyZXR1cm4hUyhlKSYmMj09PWUubGVuZ3RoJiZqbChlWzBdKX1mdW5jdGlvbiBRbihlKXt2YXIgdD1lLmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PXQ/W106W2Uuc3Vic3RyKDAsdCksZS5zdWJzdHIodCsxKV19ZnVuY3Rpb24gJG4oZSxuLHIsaSl7eShmdW5jdGlvbihlLHQpe2QoZSk/KG4ucHVzaCh0KSwkbihlLG4scixpKSxuLnBvcCgpKTpTKG4pP3JbaSh0KV09ZTpyW2koVigiLiIsbi5jb25jYXQodCkpKV09ZX0sZSl9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIG0oZnVuY3Rpb24oZSx0KXtyZXR1cm4gamwodCl9LEooZSkpfWZ1bmN0aW9uIFpuKGUpe3JldHVybiBCKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbZWUoVCh0WzBdKSldPWVlKFQodFsxXSkpLGV9LHt9LG0oS24sQihmdW5jdGlvbihlLHQpe3JldHVybiBlLnB1c2goUW4odCkpLGV9LFtdLG0oamwsZSkpKSl9ZnVuY3Rpb24gZXIoZSx0KXt2YXIgbj17fTtyZXR1cm4gZyh0KT8kbihlLFtdLG4sbCk6JG4oZSxbXSxuLHQpLG59ZnVuY3Rpb24gdHIoZSl7aWYoIXUoZSkpcmV0dXJue307dmFyIHQ9bnVsbDt0cnl7dD1lKCl9Y2F0Y2gobil7cmV0dXJue319cmV0dXJuIGcodCk/e306bWwodCk/Wm4odCk6Qyh0KSYmamwodCk/Sm4odCk6ZCh0KT9lcih0KTp7fX1mdW5jdGlvbiBucihlKXtyZXR1cm4gbGwoe30sZSx0cihjbC50YXJnZXRQYWdlUGFyYW1zQWxsKSl9ZnVuY3Rpb24gcnIoZSl7cmV0dXJuIGxsKHt9LGUsdHIoY2wudGFyZ2V0UGFnZVBhcmFtcykpfWZ1bmN0aW9uIGlyKGUpe3ZhciB0PW50KCksbj10W1lmXSxyPXRbZHBdLGk9dFtmcF07cmV0dXJuIG4hPT1lP25yKHJ8fHt9KTpsbChucihyfHx7fSkscnIoaXx8e30pKX1mdW5jdGlvbiBhcigpe3ZhciBlPXVsLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHQ9ZS5nZXRDb250ZXh0KCJ3ZWJnbCIpfHxlLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIpO2lmKGcodCkpcmV0dXJuIG51bGw7dmFyIG49dC5nZXRFeHRlbnNpb24oIldFQkdMX2RlYnVnX3JlbmRlcmVyX2luZm8iKTtpZihnKG4pKXJldHVybiBudWxsO3ZhciByPXQuZ2V0UGFyYW1ldGVyKG4uVU5NQVNLRURfUkVOREVSRVJfV0VCR0wpO3JldHVybiBnKHIpP251bGw6cn1mdW5jdGlvbiBvcigpe3ZhciBlPWNsLmRldmljZVBpeGVsUmF0aW87aWYoIWcoZSkpcmV0dXJuIGU7ZT0xO3ZhciB0PWNsLnNjcmVlbixuPXQuc3lzdGVtWERQSSxyPXQubG9naWNhbFhEUEk7cmV0dXJuIWcobikmJiFnKHIpJiZyPG4mJihlPW4vciksZX1mdW5jdGlvbiBzcigpe3ZhciBlPWNsLnNjcmVlbix0PWUub3JpZW50YXRpb24sbj1lLndpZHRoLHI9ZS5oZWlnaHQ7aWYoZyh0KSlyZXR1cm4gcjxuPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCI7aWYoZyh0LnR5cGUpKXJldHVybiBudWxsO3ZhciBpPXEoIi0iLHQudHlwZSk7aWYoUyhpKSlyZXR1cm4gbnVsbDt2YXIgYT1pWzBdO3JldHVybiBnKGEpP251bGw6YX1mdW5jdGlvbiBjcigpe3JldHVybiBFbX1mdW5jdGlvbiB1cihlKXtyZXR1cm4gZT09PXdtfWZ1bmN0aW9uIGxyKGUpe3JldHVybi0xIT09ZS5pbmRleE9mKEltKX1mdW5jdGlvbiBkcihlKXtyZXR1cm4gZT09PURtfWZ1bmN0aW9uIGZyKGUpe3JldHVybiBlPT09QW19ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIGU9PT1TbX1mdW5jdGlvbiBncihlKXtyZXR1cm4gZT09PVRtfWZ1bmN0aW9uIG1yKGUpe3JldHVybiBlPT09UG19ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIGU9PT1PbX1mdW5jdGlvbiB2cihlKXtyZXR1cm4gbHIoZSl8fHVyKGUpfHxkcihlKXx8ZnIoZSl8fHByKGUpfHxncihlKXx8bXIoZSl8fGhyKGUpfWZ1bmN0aW9uIGJyKGUpe3JldHVybiBlLnN1YnN0cmluZyhJbS5sZW5ndGgpfWZ1bmN0aW9uIHlyKGUpe3JldHVybiBlW3dtXX1mdW5jdGlvbiBfcihlKXtyZXR1cm4gZVtEbV19ZnVuY3Rpb24gQ3IoZSl7cmV0dXJuIGVbQW1dfWZ1bmN0aW9uIHhyKGUpe3JldHVybiBlW1NtXX1mdW5jdGlvbiBrcihlKXt2YXIgdD1SKFQscSgiLCIsZVtUbV0pKTtyZXR1cm4gbShqbCx0KX1mdW5jdGlvbiBFcihlKXtyZXR1cm4gZVtQbV19ZnVuY3Rpb24gSXIoZSl7cmV0dXJuIGVbT21dfWZ1bmN0aW9uIHdyKGUpe3JldHVybiBCKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdnIobil8fChlW25dPWcodCk/IiI6dCksZX0se30sZSl9ZnVuY3Rpb24gRHIoZSl7cmV0dXJuIEIoZnVuY3Rpb24oZSx0LG4pe2lmKCFscihuKSlyZXR1cm4gZTt2YXIgcj1icihuKTtyZXR1cm4gUChyKXx8KGVbcl09Zyh0KT8iIjp0KSxlfSx7fSxlKX1mdW5jdGlvbiBBcihpLGEsbyl7cmV0dXJuIGkub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9MTIyMz09PWkuc3RhdHVzPzIwNDppLnN0YXR1cztpZihlPDEwMHx8NTk5PGUpbyhuZXcgRXJyb3IoTG0pKTtlbHNle3ZhciB0O3RyeXt0PUpTT04ucGFyc2UoaS5yZXNwb25zZVRleHQpfWNhdGNoKHIpe3JldHVybiB2b2lkIG8obmV3IEVycm9yKFZtKSl9dmFyIG49aS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTthKHtzdGF0dXM6ZSxoZWFkZXJzOm4scmVzcG9uc2U6dH0pfX0saX1mdW5jdGlvbiBTcihlLHQpe3JldHVybiBlLm9uZXJyb3I9ZnVuY3Rpb24oKXt0KG5ldyBFcnJvcihMbSkpfSxlfWZ1bmN0aW9uIFRyKGUsdCxuKXtyZXR1cm4gZS50aW1lb3V0PXQsZS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtuKG5ldyBFcnJvcihNbSkpfSxlfWZ1bmN0aW9uIFByKG4sZSl7cmV0dXJuIHkoZnVuY3Rpb24oZSx0KXttbChlKSYmeShmdW5jdGlvbihlKXtuLnNldFJlcXVlc3RIZWFkZXIodCxlKX0sZSl9LDE8YXJndW1lbnRzLmxlbmd0aCYmZSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06e30pLG59ZnVuY3Rpb24gT3IoZSl7dmFyIHI9ZS51cmwsaT1lLmhlYWRlcnMsYT1lLmJvZHksbz1lLnRpbWVvdXQscz1lLmFzeW5jO3JldHVybiBGZShmdW5jdGlvbihlLHQpe2NvbnN0ICRfX19vbGRfNmI5ZWQ3OGM0ODI5Y2Q5ND17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLCRfX19vbGRfMjBlNmU4NWI5MmQwNDFmZj17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpO3RyeXtpZigkX19fb2xkXzZiOWVkNzhjNDgyOWNkOTQpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KTtpZigkX19fb2xkXzIwZTZlODViOTJkMDQxZmYpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1uZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0OyhuPVNyKG49QXIobixlLHQpLHQpKS5vcGVuKGptLHIscyksbi53aXRoQ3JlZGVudGlhbHM9ITAsbj1QcihuLGkpLHMmJihuPVRyKG4sbyx0KSksbi5zZW5kKEpTT04uc3RyaW5naWZ5KGEpKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF82YjllZDc4YzQ4MjljZDk0KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX29sZF82YjllZDc4YzQ4MjljZDk0KTtpZigkX19fb2xkXzIwZTZlODViOTJkMDQxZmYpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fb2xkXzIwZTZlODViOTJkMDQxZmYpfX0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXNwb25zZSxuPXQuc3RhdHVzLHI9dC5tZXNzYWdlO2lmKCFnKG4pJiYhZyhyKSl0aHJvdyBuZXcgRXJyb3Iocik7cmV0dXJuIHR9KX1mdW5jdGlvbiBqcihlKXtpZihlW2NtXSl0aHJvdyBuZXcgRXJyb3IoaW0pO3JldHVybiBlfWZ1bmN0aW9uIExyKCl7dmFyIGU9U24oKSx0PUhuKCk7cmV0dXJuIHFlKFtlLnRoZW4oanIpLHRdKX1mdW5jdGlvbiBNcigpe3JldHVybltUbigpLFduKCldfWZ1bmN0aW9uIFZyKGUpe3ZhciB0PW50KClbWWZdO3JldHVybiBsbCh7fSxlLGlyKHQpKX1mdW5jdGlvbiBScigpe3JldHVybi0obmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gRnIoKXt2YXIgZT1jbC5zY3JlZW47cmV0dXJue3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LG9yaWVudGF0aW9uOnNyKCksY29sb3JEZXB0aDplLmNvbG9yRGVwdGgscGl4ZWxSYXRpbzpvcigpfX1mdW5jdGlvbiBOcigpe3ZhciBlPXVsLmRvY3VtZW50RWxlbWVudDtyZXR1cm57d2lkdGg6ZS5jbGllbnRXaWR0aCxoZWlnaHQ6ZS5jbGllbnRIZWlnaHR9fWZ1bmN0aW9uIEJyKCl7cmV0dXJue2hvc3Q6Y2wubG9jYXRpb24uaG9zdG5hbWUsd2ViR0xSZW5kZXJlcjpjcigpfX1mdW5jdGlvbiBVcigpe3JldHVybnt1cmw6Y2wubG9jYXRpb24uaHJlZixyZWZlcnJpbmdVcmw6dWwucmVmZXJyZXJ9fWZ1bmN0aW9uIHFyKGUpe2lmKCFnKGUpJiZlLmNoYW5uZWw9PT1SbSlyZXR1cm4gZTt2YXIgdD0oZXx8e30pLmJlYWNvbjtyZXR1cm57dXNlckFnZW50OmNsLm5hdmlnYXRvci51c2VyQWdlbnQsdGltZU9mZnNldEluTWludXRlczpScigpLGNoYW5uZWw6Um0sc2NyZWVuOkZyKCksd2luZG93Ok5yKCksYnJvd3NlcjpCcigpLGFkZHJlc3M6VXIoKSxiZWFjb246dH19ZnVuY3Rpb24genIoZSx0KXtpZighZyhlKSlyZXR1cm4gZTt2YXIgbj17fTtpZihTKHQpKXJldHVybiBuO3ZhciByPXRbb21dLGk9cGFyc2VJbnQociwxMCk7aXNOYU4oaSl8fChuLmxvY2F0aW9uSGludD1pKTt2YXIgYT10W2FtXTtyZXR1cm4gamwoYSkmJihuLmJsb2I9YSksbn1mdW5jdGlvbiBIcihlKXt2YXIgdD1lLmlkLG49ZS5pbnRlZ3JhdGlvbkNvZGUscj1lLmF1dGhlbnRpY2F0ZWRTdGF0ZSxpPXt9O3JldHVybiBqbCh0KSYmKGkuaWQ9dCksamwobikmJihpLmludGVncmF0aW9uQ29kZT1uKSxqbChyKSYmKGkuYXV0aGVudGljYXRlZFN0YXRlPXIpLGl9ZnVuY3Rpb24gV3IoZSl7cmV0dXJuIFIoSHIsZSl9ZnVuY3Rpb24gR3IoZSx0LG4scixpKXt2YXIgYT17fTtqbCh0KSYmKGEudG50SWQ9dCksamwobikmJihhLnRoaXJkUGFydHlJZD1uKSxqbChlLnRoaXJkUGFydHlJZCkmJihhLnRoaXJkUGFydHlJZD1lLnRoaXJkUGFydHlJZCk7dmFyIG89cltzbV07cmV0dXJuIGpsKG8pJiYoYS5tYXJrZXRpbmdDbG91ZFZpc2l0b3JJZD1vKSxqbChlLm1hcmtldGluZ0Nsb3VkVmlzaXRvcklkKSYmKGEubWFya2V0aW5nQ2xvdWRWaXNpdG9ySWQ9ZS5tYXJrZXRpbmdDbG91ZFZpc2l0b3JJZCksUyhlLmN1c3RvbWVySWRzKT9TKGkpfHwoYS5jdXN0b21lcklkcz1XcihpKSk6YS5jdXN0b21lcklkcz1lLmN1c3RvbWVySWRzLGF9ZnVuY3Rpb24gWXIoZSx0KXt2YXIgbj17fSxyPXpyKGUuYXVkaWVuY2VNYW5hZ2VyLHQpO3JldHVybiBTKHIpfHwobi5hdWRpZW5jZU1hbmFnZXI9ciksUyhlLmFuYWx5dGljcyl8fChuLmFuYWx5dGljcz1lLmFuYWx5dGljcyksbn1mdW5jdGlvbiBYcihlLHQpe2lmKCFnKGUpJiZqbChlLnRva2VuKSlyZXR1cm4gZTt2YXIgbj17fSxyPV9yKHQpO3JldHVybiBqbChyKSYmKG4udG9rZW49ciksbn1mdW5jdGlvbiBLcihlKXtpZighZyhlKSYmamwoZS5hdXRob3JpemF0aW9uVG9rZW4pKXJldHVybiBlO3ZhciB0PXt9LG49WG4oKTtyZXR1cm4gamwobikmJih0LmF1dGhvcml6YXRpb25Ub2tlbj1uKSx0fWZ1bmN0aW9uIFFyKGUpe3JldHVybiBnKGUpP0d0KCk6ZX1mdW5jdGlvbiAkcihlKXt2YXIgdD17fSxuPUNyKGUpO2cobil8fCh0LmlkPW4pO3ZhciByPXhyKGUpLGk9cGFyc2VGbG9hdChyKTtpc05hTihpKXx8KHQudG90YWw9aSk7dmFyIGE9a3IoZSk7cmV0dXJuIFMoYSl8fCh0LnB1cmNoYXNlZFByb2R1Y3RJZHM9YSksdH1mdW5jdGlvbiBKcihlKXt2YXIgdD17fSxuPUVyKGUpO2cobil8fCh0LmlkPW4pO3ZhciByPUlyKGUpO3JldHVybiBnKHIpfHwodC5jYXRlZ29yeUlkPXIpLHR9ZnVuY3Rpb24gWnIoZSx0KXt2YXIgbj17fSxyPWxsKHt9LHdyKHQpLGUucGFyYW1ldGVyc3x8e30pLGk9bGwoe30sRHIodCksZS5wcm9maWxlUGFyYW1ldGVyc3x8e30pLGE9bGwoe30sJHIodCksZS5vcmRlcnx8e30pLG89bGwoe30sSnIodCksZS5wcm9kdWN0fHx7fSk7cmV0dXJuIFMocil8fChuLnBhcmFtZXRlcnM9ciksUyhpKXx8KG4ucHJvZmlsZVBhcmFtZXRlcnM9aSksUyhhKXx8KG4ub3JkZXI9YSksUyhvKXx8KG4ucHJvZHVjdD1vKSxufWZ1bmN0aW9uIGVpKGUsdCl7dmFyIG49ZS5pbmRleCxyPWUubmFtZSxpPWUuYWRkcmVzcyxhPVpyKGUsbGwoe30sdCxpcihyKSkpO3JldHVybiBnKG4pfHwoYS5pbmRleD1uKSxqbChyKSYmKGEubmFtZT1yKSxTKGkpfHwoYS5hZGRyZXNzPWkpLGF9ZnVuY3Rpb24gdGkoZSx0KXt2YXIgbj1lLm5hbWUscj1lLmFkZHJlc3MsaT1acihlLHQpO3JldHVybiBqbChuKSYmKGkubmFtZT1uKSxTKHIpfHwoaS5hZGRyZXNzPXIpLGl9ZnVuY3Rpb24gbmkoZSx0KXt2YXIgbj1lLmV4ZWN1dGUscj12b2lkIDA9PT1uP3t9Om4saT17fTtpZihTKHIpKXJldHVybiBpO3ZhciBhPXIucGFnZUxvYWQ7ZyhhKXx8KGkucGFnZUxvYWQ9WnIoYSx0KSk7dmFyIG89ci5tYm94ZXM7aWYoIWcobykmJm1sKG8pJiYhUyhvKSl7dmFyIHM9bShCbSxSKGZ1bmN0aW9uKGUpe3JldHVybiBlaShlLHQpfSxvKSk7UyhzKXx8KGkubWJveGVzPXMpfXJldHVybiBpfWZ1bmN0aW9uIHJpKGUsdCl7dmFyIG49ZS5wcmVmZXRjaCxyPXZvaWQgMD09PW4/e306bixpPXt9O2lmKFMocikpcmV0dXJuIGk7dmFyIGE9ci5tYm94ZXM7ZyhhKXx8IW1sKGEpfHxTKGEpfHwoaS5tYm94ZXM9UihmdW5jdGlvbihlKXtyZXR1cm4gZWkoZSx0KX0sYSkpO3ZhciBvPXIudmlld3M7cmV0dXJuIGcobyl8fCFtbChvKXx8UyhvKXx8KGkudmlld3M9UihmdW5jdGlvbihlKXtyZXR1cm4gdGkoZSx0KX0sbykpLGl9ZnVuY3Rpb24gaWkoZSx0KXtpZihYZSgpJiYhUWUoKSlyZXR1cm4gbnVsbDt2YXIgbj1udCgpLHI9T24oZSksaT1qbihkbSksYT1qbihmbSksbz10LmV4cGVyaWVuY2VDbG91ZCxzPSh2b2lkIDA9PT1vP3t9Om8pLmFuYWx5dGljcyxjPXZvaWQgMD09PXM/e306cyx1PWMubG9nZ2luZyxsPWMuc3VwcGxlbWVudGFsRGF0YUlkLGQ9Yy50cmFja2luZ1NlcnZlcixmPWMudHJhY2tpbmdTZXJ2ZXJTZWN1cmUscD17fTtyZXR1cm4gZyh1KT9wLmxvZ2dpbmc9bltlZ106cC5sb2dnaW5nPXUsZyhsKXx8KHAuc3VwcGxlbWVudGFsRGF0YUlkPWwpLGpsKHIpJiYocC5zdXBwbGVtZW50YWxEYXRhSWQ9ciksZyhkKXx8KHAudHJhY2tpbmdTZXJ2ZXI9ZCksamwoaSkmJihwLnRyYWNraW5nU2VydmVyPWkpLGcoZil8fChwLnRyYWNraW5nU2VydmVyU2VjdXJlPWYpLGpsKGEpJiYocC50cmFja2luZ1NlcnZlclNlY3VyZT1hKSxTKHApP251bGw6cH1mdW5jdGlvbiBhaShlLHQsbil7dmFyIHI9VnIobiksaT1pdCgpLGE9eXIociksbz1QbigpLHM9R3IoZS5pZHx8e30saSxhLHQsbyksYz1YcihlLnByb3BlcnR5LHIpLHU9WXIoZS5leHBlcmllbmNlQ2xvdWR8fHt9LHQpLGw9S3IoZS50cmFjZSksZD1RcihlLnFhTW9kZSksZj1uaShlLHIpLHA9cmkoZSxyKSxnPWUubm90aWZpY2F0aW9ucyxtPXt9O3JldHVybiBtLnJlcXVlc3RJZD1IKCksbS5jb250ZXh0PXFyKGUuY29udGV4dCksUyhzKXx8KG0uaWQ9cyksUyhjKXx8KG0ucHJvcGVydHk9YyksUyhsKXx8KG0udHJhY2U9bCksUyh1KXx8KG0uZXhwZXJpZW5jZUNsb3VkPXUpLFMoZCl8fChtLnFhTW9kZT1kKSxTKGYpfHwobS5leGVjdXRlPWYpLFMocCl8fChtLnByZWZldGNoPXApLFMoZyl8fChtLm5vdGlmaWNhdGlvbnM9ZyksbX1mdW5jdGlvbiBvaShlLHQsbil7dmFyIHI9blswXSxpPW5bMV07cmV0dXJuIGFpKGUscixsbCh7fSxpLHQpKX1mdW5jdGlvbiBzaSh0LG4pe3JldHVybiBMcigpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIG9pKHQsbixlKX0pfWZ1bmN0aW9uIGNpKGUsdCl7cmV0dXJuIG9pKGUsdCxNcigpKX1mdW5jdGlvbiB1aShlLHQpe3JldHVybiBNKHQpP3Q8MD9lW0dmXTp0OmVbR2ZdfWZ1bmN0aW9uIGxpKGUpe3ZhciB0PWVbV2ZdO2lmKCFlW3JwXSlyZXR1cm4gdDt2YXIgbj1vdCgpO3JldHVybiBQKG4pP3Q6IiIrRm0rbitObX1mdW5jdGlvbiBkaShlKXtyZXR1cm4gZVt1cF0rIi8vIitsaShlKStlW0lwXSsiPyIrWih7Y2xpZW50OmVbemZdLHNlc3Npb25JZDpldCgpLHZlcnNpb246ZVtLZl19KX1mdW5jdGlvbiBmaSh0LGUpe3ZhciBuPW50KCkscj1kaShuKSxpPWMoe30sRnAsW05wXSksYT11aShuLGUpLG89e3VybDpyLGhlYWRlcnM6aSxib2R5OnQsdGltZW91dDphLGFzeW5jOiEwfTtyZXR1cm4gd2UoVmYsdCksT2Uoe3JlcXVlc3Q6dH0pLE9yKG8pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHdlKE1mLGUpLE9lKHtyZXNwb25zZTplfSkse3JlcXVlc3Q6dCxyZXNwb25zZTplfX0pfWZ1bmN0aW9uIHBpKGUsdCl7cmV0dXJue3N0YXR1czpFZix0eXBlOmUsZGF0YTp0fX1mdW5jdGlvbiBnaShlLHQpe3JldHVybntzdGF0dXM6X2YsdHlwZTplLGRhdGE6dH19ZnVuY3Rpb24gbWkoZSl7cmV0dXJuIGQoZSl9ZnVuY3Rpb24gaGkoZSl7cmV0dXJuISFtaShlKSYmamwoZS5ldmVudFRva2VuKX1mdW5jdGlvbiB2aShlKXtyZXR1cm4hUyhlKSYmIVAoZS50eXBlKSYmamwoZS5ldmVudFRva2VuKX1mdW5jdGlvbiBiaShlKXtyZXR1cm4hIXZpKGUpJiZqbChlLnNlbGVjdG9yKX1mdW5jdGlvbiB5aShlKXt2YXIgdD1lLmlkO3JldHVybiBkKHQpJiZqbCh0LnRudElkKX1mdW5jdGlvbiBfaShlKXt2YXIgdD1lLnJlc3BvbnNlO3JldHVybiB5aSh0KSYmcnQodC5pZC50bnRJZCksZX1mdW5jdGlvbiBDaShlKXt2YXIgdD1lLnJlc3BvbnNlO3JldHVybiB5aSh0KSYmc3QodC5pZC50bnRJZCksc3QobnVsbCksZX1mdW5jdGlvbiB4aShlKXt2YXIgdD0oMDxhcmd1bWVudHMubGVuZ3RoJiZlIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTp7fSkudHJhY2U7Uyh0KXx8UGUodCl9ZnVuY3Rpb24ga2koZSl7dmFyIHQ9ZS5yZXNwb25zZSxuPXQuZXhlY3V0ZSxyPXZvaWQgMD09PW4/e306bixpPXQucHJlZmV0Y2gsYT12b2lkIDA9PT1pP3t9Omksbz1yLnBhZ2VMb2FkLHM9dm9pZCAwPT09bz97fTpvLGM9ci5tYm94ZXMsdT12b2lkIDA9PT1jP1tdOmMsbD1hLm1ib3hlcyxkPXZvaWQgMD09PWw/W106bCxmPWEudmlld3MscD12b2lkIDA9PT1mP1tdOmY7cmV0dXJuIHhpKHMpLHkoeGksdSkseSh4aSxkKSx5KHhpLHApLGV9ZnVuY3Rpb24gRWkoZSl7dmFyIHQ9ZS5xdWVyeUtleSxuPXRbb2hdO2lmKCFDKG4pKXJldHVybiB0O2lmKFAobikpcmV0dXJuIHQ7dmFyIHI9TWF0aC5yb3VuZChOKCkvMWUzKTtyZXR1cm4gdFtvaF09bi5yZXBsYWNlKC9cfFRTPVxkKy8sInxUUz0iK3IpLHR9ZnVuY3Rpb24gSWkoZSl7cmV0dXJuIGUucXVlcnlLZXl9ZnVuY3Rpb24gd2koZSx0LG4pe3ZhciByPW5lKGUpLGk9ci5wcm90b2NvbCxhPXIuaG9zdCxvPXIucGF0aCxzPSIiPT09ci5wb3J0PyIiOiI6IityLnBvcnQsYz1QKHIuYW5jaG9yKT8iIjoiIyIrci5hbmNob3IsdT1uKHIpLGw9WihsbCh7fSx1LHQpKTtyZXR1cm4gaSsiOi8vIithK3MrbysoUChsKT8iIjoiPyIrbCkrY31mdW5jdGlvbiBEaShlLHQpe3JldHVybiB3aShlLHQsRWkpfWZ1bmN0aW9uIEFpKGUsdCl7cmV0dXJuIHdpKGUsdCxJaSl9ZnVuY3Rpb24gU2koZSl7dmFyIHQ9ZS5jb250ZW50O2lmKFAodCkpcmV0dXJuIHdlKGRmLGUpLG51bGw7dmFyIG49bGwoe30sZSk7cmV0dXJuIG4uY29udGVudD1EaSh0LHt9KSxufWZ1bmN0aW9uIFRpKGUpe3Rocm93IG5ldyBFcnJvcihlKX1mdW5jdGlvbiBQaShlKXt2YXIgdD1lW2ZoXXx8bGgsbj1lW3BoXXx8VGkodWgpLHI9ZVtnaF18fHt9LGk9ZVttaF18fG51bGwsYT1lW2hoXXx8ITEsbz1lW3ZoXXx8M2UzLHM9ISFnKGVbYmhdKXx8ITA9PT1lW2JoXSxjPXt9O3JldHVybiBjW2ZoXT10LGNbcGhdPW4sY1tnaF09cixjW21oXT1pLGNbaGhdPWEsY1t2aF09byxjW2JoXT1zLGN9ZnVuY3Rpb24gT2kocixpLGEpe3JldHVybiByLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBlPTEyMjM9PT1yLnN0YXR1cz8yMDQ6ci5zdGF0dXM7aWYoZTwxMDB8fDU5OTxlKWEobmV3IEVycm9yKHNoKSk7ZWxzZXt2YXIgdD1yLnJlc3BvbnNlVGV4dCxuPXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7aSh7c3RhdHVzOmUsaGVhZGVyczpuLHJlc3BvbnNlOnR9KX19LHJ9ZnVuY3Rpb24gamkoZSx0KXtyZXR1cm4gZS5vbmVycm9yPWZ1bmN0aW9uKCl7dChuZXcgRXJyb3Ioc2gpKX0sZX1mdW5jdGlvbiBMaShlLHQsbil7cmV0dXJuIGUudGltZW91dD10LGUub250aW1lb3V0PWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoY2gpKX0sZX1mdW5jdGlvbiBNaShlLHQpe3JldHVybiEwPT09dCYmKGUud2l0aENyZWRlbnRpYWxzPXQpLGV9ZnVuY3Rpb24gVmkobixlKXtyZXR1cm4geShmdW5jdGlvbihlLHQpe3koZnVuY3Rpb24oZSl7cmV0dXJuIG4uc2V0UmVxdWVzdEhlYWRlcih0LGUpfSxlKX0sZSksbn1mdW5jdGlvbiBSaShyLGUpe3ZhciB0PVBpKGUpLGk9dFtmaF0sYT10W3BoXSxvPXRbZ2hdLHM9dFttaF0sYz10W2hoXSx1PXRbdmhdLGw9dFtiaF07cmV0dXJuIEZlKGZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHIuWE1MSHR0cFJlcXVlc3Q7KG49amkobj1PaShuLGUsdCksdCkpLm9wZW4oaSxhLGwpLG49Vmkobj1NaShuLGMpLG8pLGwmJihuPUxpKG4sdSx0KSksbi5zZW5kKHMpfSl9ZnVuY3Rpb24gRmkoZSl7cmV0dXJuIFJpKGNsLGUpfWZ1bmN0aW9uIE5pKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gcltmaF09bGgscltwaF09QWkoZSx0KSxyW3ZoXT1uLHJ9ZnVuY3Rpb24gQmkoZSl7cmV0dXJuIDIwMDw9ZSYmZTwzMDB8fDMwND09PWV9ZnVuY3Rpb24gVWkoZSl7aWYoIUJpKGUuc3RhdHVzKSlyZXR1cm4gbnVsbDt2YXIgdD1lLnJlc3BvbnNlO2lmKFAodCkpcmV0dXJuIG51bGw7dmFyIG49e307cmV0dXJuIG4udHlwZT1EZCxuLmNvbnRlbnQ9dCxufWZ1bmN0aW9uIHFpKGUpe3JldHVybiBGaShOaShlLmNvbnRlbnQse30sbnQoKVt2aF0pKS50aGVuKFVpKVsiY2F0Y2giXShmdW5jdGlvbigpe3JldHVybiBudWxsfSl9ZnVuY3Rpb24gemkoZSl7dmFyIHQ9ZVtYbF07aWYoUCh0KSlyZXR1cm4iIjt2YXIgbj15aC5leGVjKHQpO3JldHVybiBTKG4pfHwyIT09bi5sZW5ndGg/IiI6blsxXX1mdW5jdGlvbiBIaShlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTmQpO24uaW5uZXJIVE1MPXQ7dmFyIHI9bi5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZyhyKT90OihyLmlkPWUsci5vdXRlckhUTUwpfWZ1bmN0aW9uIFdpKGUpe3ZhciB0PWVbQmxdLG49emkoZSk7aWYoUChuKXx8UCh0KSlyZXR1cm4gZTt2YXIgcj1lW1hsXTtyZXR1cm4gZVtYbF09ci5yZXBsYWNlKF9oLCIiKSxlW0JsXT1IaShuLHQpLGV9ZnVuY3Rpb24gR2koZSl7cmV0dXJuIWcoZS5zZWxlY3Rvcil9ZnVuY3Rpb24gWWkoZSl7aWYoIUdpKGUpKXJldHVybiBudWxsO3ZhciB0PVdpKGUpO3JldHVybiBDKHRbQmxdKT90Oih3ZShhZix0KSxudWxsKX1mdW5jdGlvbiBYaShlKXtpZighR2koZSkpcmV0dXJuIG51bGw7dmFyIHQ9V2koZSk7cmV0dXJuIEModFtCbF0pP3Q6KHdlKGFmLHQpLG51bGwpfWZ1bmN0aW9uIEtpKGUpe2lmKCFHaShlKSlyZXR1cm4gbnVsbDt2YXIgdD1XaShlKTtyZXR1cm4gQyh0W0JsXSk/dDood2UoYWYsdCksbnVsbCl9ZnVuY3Rpb24gUWkoZSl7aWYoIUdpKGUpKXJldHVybiBudWxsO3ZhciB0PVdpKGUpO3JldHVybiBDKHRbQmxdKT90Oih3ZShhZix0KSxudWxsKX1mdW5jdGlvbiAkaShlKXtpZighR2koZSkpcmV0dXJuIG51bGw7dmFyIHQ9V2koZSk7cmV0dXJuIEModFtCbF0pP3Q6KHdlKGFmLHQpLG51bGwpfWZ1bmN0aW9uIEppKGUpe2lmKCFHaShlKSlyZXR1cm4gbnVsbDt2YXIgdD1XaShlKTtyZXR1cm4gQyh0W0JsXSk/dDood2UoYWYsdCksbnVsbCl9ZnVuY3Rpb24gWmkoZSl7aWYoIUdpKGUpKXJldHVybiBudWxsO3ZhciB0PVdpKGUpO3JldHVybiBDKHRbQmxdKT90Oih3ZShhZix0KSxudWxsKX1mdW5jdGlvbiBlYShlKXtyZXR1cm4gR2koZSk/QyhlW0JsXSk/ZTood2UoYWYsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiB0YShlKXtyZXR1cm4gR2koZSk/ZChlW0JsXSk/ZTood2Uob2YsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiBuYShlKXtyZXR1cm4gR2koZSk/QyhlW0JsXSk/ZTood2UoZmYsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiByYShlKXtyZXR1cm4gR2koZSk/ZChlW0JsXSk/ZTood2Uoc2YsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiBpYShlKXtyZXR1cm4gR2koZSk/ZChlW0JsXSk/ZTood2UoY2YsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiBhYShlKXtyZXR1cm4gR2koZSk/ZChlW0JsXSk/ZTood2UodWYsZSksbnVsbCk6bnVsbH1mdW5jdGlvbiBvYShlKXtyZXR1cm4gR2koZSk/ZTpudWxsfWZ1bmN0aW9uIHNhKGUpe3JldHVybiBHaShlKT9kKGVbQmxdKT9lOih3ZShsZixlKSxudWxsKTpudWxsfWZ1bmN0aW9uIGNhKGUpe3ZhciB0PWUuY29udGVudDtyZXR1cm4gUCh0KT8od2UoZGYsZSksbnVsbCk6KGUuY29udGVudD1EaSh0LHt9KSxlKX1mdW5jdGlvbiB1YShlKXt2YXIgdD1lW05sXTtpZihQKHQpKXJldHVybiBudWxsO3N3aXRjaCh0KXtjYXNlIFFsOnJldHVybiBZaShlKTtjYXNlIEpsOnJldHVybiBYaShlKTtjYXNlIHBkOnJldHVybiBLaShlKTtjYXNlIG1kOnJldHVybiBRaShlKTtjYXNlIHZkOnJldHVybiAkaShlKTtjYXNlIGRkOnJldHVybiBKaShlKTtjYXNlIGZkOnJldHVybiBaaShlKTtjYXNlIHNkOnJldHVybiBlYShlKTtjYXNlIGVkOnJldHVybiB0YShlKTtjYXNlIHRkOnJldHVybiBuYShlKTtjYXNlIG5kOnJldHVybiByYShlKTtjYXNlIGlkOnJldHVybiBpYShlKTtjYXNlIGFkOnJldHVybiBhYShlKTtjYXNlIG9kOnJldHVybiBvYShlKTtjYXNlIHJkOnJldHVybiBzYShlKTtjYXNlIGNkOnJldHVybiBjYShlKTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBsYShlKXt2YXIgdD1lW0JsXTtpZighbWwodCkpcmV0dXJuIG51bGw7aWYoUyh0KSlyZXR1cm4gbnVsbDt2YXIgbj1tKENoLFIodWEsdCkpO2lmKFMobikpcmV0dXJuIG51bGw7dmFyIHI9bGwoe30sZSk7cmV0dXJuIHIuY29udGVudD1uLHJ9ZnVuY3Rpb24gZGEoZSl7dmFyIHQ9KDA8YXJndW1lbnRzLmxlbmd0aCYmZSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06e30pLm9wdGlvbnM7cmV0dXJuIG1sKHQpP1ModCk/W106WG0oUigkbSx0KSk6W119ZnVuY3Rpb24gZmEoZSl7dmFyIHQ9MDxhcmd1bWVudHMubGVuZ3RoJiZlIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTp7fSxuPXQuZXhlY3V0ZSxyPXZvaWQgMD09PW4/e306bixpPXQucHJlZmV0Y2gsYT12b2lkIDA9PT1pP3t9Omksbz1yLnBhZ2VMb2FkLHM9dm9pZCAwPT09bz97fTpvLGM9ci5tYm94ZXMsdT12b2lkIDA9PT1jP1tdOmMsbD1hLm1ib3hlcyxkPXZvaWQgMD09PWw/W106bCxmPWEudmlld3MscD12b2lkIDA9PT1mP1tdOmY7cmV0dXJuIHYoW2RhKHMpLHYoUihkYSx1KSksdihSKGRhLGQpKSx2KFIoZGEscCkpXSl9ZnVuY3Rpb24gcGEoZSl7dmFyIHQ9KDA8YXJndW1lbnRzLmxlbmd0aCYmZSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06e30pLmV4ZWN1dGUsbj12b2lkIDA9PT10P3t9OnQscj1uLnBhZ2VMb2FkLGk9dm9pZCAwPT09cj97fTpyLGE9bi5tYm94ZXMsbz12b2lkIDA9PT1hP1tdOmEscz12KFtLbShpKXx8W10sdihYbShSKEttLG8pKSldKSxjPXYoUihRbSxtKEdtLHMpKSksdT1tKFltLHMpLGw9bShZbSxjKSxkPXUuY29uY2F0KGwpLGY9e307aWYoUyhkKSlyZXR1cm4gZjt2YXIgcD1kWzBdLmNvbnRlbnQ7cmV0dXJuIFAocCl8fChmLnVybD1wKSxmfWZ1bmN0aW9uIGdhKGUpe3ZhciB0PSgwPGFyZ3VtZW50cy5sZW5ndGgmJmUhPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOnt9KS5hbmFseXRpY3M7cmV0dXJuIFModCk/W106W3RdfWZ1bmN0aW9uIG1hKGUpe3ZhciB0PTA8YXJndW1lbnRzLmxlbmd0aCYmZSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06e30sbj10LmV4ZWN1dGUscj12b2lkIDA9PT1uP3t9Om4saT10LnByZWZldGNoLGE9dm9pZCAwPT09aT97fTppLG89ci5wYWdlTG9hZCxzPXZvaWQgMD09PW8/e306byxjPXIubWJveGVzLHU9dm9pZCAwPT09Yz9bXTpjLGw9YS5tYm94ZXMsZD12b2lkIDA9PT1sP1tdOmwsZj1hLnZpZXdzLHA9dm9pZCAwPT09Zj9bXTpmO3JldHVybiB2KFtnYShzKSx2KFIoZ2EsdSkpLHYoUihnYSxkKSksdihSKGdhLHApKV0pfWZ1bmN0aW9uIGhhKGUsdCl7ZS5wYXJhbWV0ZXJzPXQucGFyYW1ldGVycyxlLnByb2ZpbGVQYXJhbWV0ZXJzPXQucHJvZmlsZVBhcmFtZXRlcnMsZS5vcmRlcj10Lm9yZGVyLGUucHJvZHVjdD10LnByb2R1Y3R9ZnVuY3Rpb24gdmEoZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxpPSFTKG4pLGE9IVMocik7cmV0dXJuKGl8fGEpJiYoaSYmKGUub3B0aW9ucz1uKSxhJiYoZS5tZXRyaWNzPXIpKSxlfWZ1bmN0aW9uIGJhKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UgY2Q6cmV0dXJuIE5lKFNpKGUpKTtjYXNlIEFkOnJldHVybiBxaShlKTtjYXNlIE9mOnJldHVybiBOZShsYShlKSk7ZGVmYXVsdDpyZXR1cm4gTmUoZSl9fWZ1bmN0aW9uIHlhKGUsdCl7aWYoIW1sKGUpKXJldHVybiBOZShbXSk7aWYoUyhlKSlyZXR1cm4gTmUoW10pO3ZhciBuPW0odCxlKTtyZXR1cm4gUyhuKT9OZShbXSk6cWUoUihmdW5jdGlvbihlKXtyZXR1cm4gYmEoZSl9LG4pKS50aGVuKFhtKX1mdW5jdGlvbiBfYShlLHQpe3JldHVybiBtbChlKT9TKGUpP05lKFtdKTpOZShtKHQsZSkpOk5lKFtdKX1mdW5jdGlvbiBDYShlKXt2YXIgdD1lLnJlc3BvbnNlLmV4ZWN1dGU7aWYoIWQodCkpcmV0dXJuIE5lKG51bGwpO3ZhciBuPXQucGFnZUxvYWQ7aWYoIWQobikpcmV0dXJuIE5lKG51bGwpO3ZhciByPW4uYW5hbHl0aWNzLGk9bi5vcHRpb25zLGE9bi5tZXRyaWNzLG89e2FuYWx5dGljczpyfTtyZXR1cm4gcWUoW3lhKGksbWkpLF9hKGEsYmkpXSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdmEobyxlKX0pfWZ1bmN0aW9uIHhhKGUpe3ZhciB0PWUubmFtZSxuPWUuYW5hbHl0aWNzLHI9ZS5vcHRpb25zLGk9ZS5tZXRyaWNzLGE9e25hbWU6dCxhbmFseXRpY3M6bn07cmV0dXJuIHFlKFt5YShyLG1pKSxfYShpLHZpKV0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHZhKGEsZSl9KX1mdW5jdGlvbiBrYShlKXt2YXIgdD1lLnJlc3BvbnNlLmV4ZWN1dGU7aWYoIWQodCkpcmV0dXJuIE5lKFtdKTt2YXIgbj10Lm1ib3hlcztyZXR1cm4hbWwobil8fFMobik/TmUoW10pOnFlKFIoeGEsbShlaCxuKSkpLnRoZW4oWG0pfWZ1bmN0aW9uIEVhKGUsdCxuKXtyZXR1cm4gZS5pbmRleD09PXQmJmUubmFtZT09PW59ZnVuY3Rpb24gSWEoZSx0LG4pe3ZhciByPWUucHJlZmV0Y2gsaT0odm9pZCAwPT09cj97fTpyKS5tYm94ZXMsYT12b2lkIDA9PT1pP1tdOmk7cmV0dXJuIFMoYSk/bnVsbDpoKG0oZnVuY3Rpb24oZSl7cmV0dXJuIEVhKGUsdCxuKX0sYSkpfWZ1bmN0aW9uIHdhKGUsdCl7dmFyIG49dC5pbmRleCxyPXQubmFtZSxpPXQuc3RhdGUsYT10LmFuYWx5dGljcyxvPXQub3B0aW9ucyxzPXQubWV0cmljcyxjPUlhKGUsbixyKSx1PXtuYW1lOnIsc3RhdGU6aSxhbmFseXRpY3M6YX07cmV0dXJuIGcoYyl8fGhhKHUsYykscWUoW3lhKG8saGkpLF9hKHMsdmkpXSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdmEodSxlKX0pfWZ1bmN0aW9uIERhKGUpe3ZhciB0PWUucmVxdWVzdCxuPWUucmVzcG9uc2UucHJlZmV0Y2g7aWYoIWQobikpcmV0dXJuIE5lKFtdKTt2YXIgcj1uLm1ib3hlcztpZighbWwocil8fFMocikpcmV0dXJuIE5lKFtdKTt2YXIgaT1tKHRoLHIpLGE9ZnVuY3Rpb24gYShlKXtyZXR1cm4gd2EodCxlKX07cmV0dXJuIHFlKFIoYSxpKSkudGhlbihYbSl9ZnVuY3Rpb24gQWEoZSl7dmFyIHQ9ZS5wcmVmZXRjaCxuPSh2b2lkIDA9PT10P3t9OnQpLnZpZXdzLHI9dm9pZCAwPT09bj9bXTpuO3JldHVybiBTKHIpP251bGw6clswXX1mdW5jdGlvbiBTYShlLHQpe3ZhciBuPXQubmFtZSxyPXQuc3RhdGUsaT10LmFuYWx5dGljcyxhPXQub3B0aW9ucyxvPXQubWV0cmljcyxzPUFhKGUpLGM9e25hbWU6bi50b0xvd2VyQ2FzZSgpLHN0YXRlOnIsYW5hbHl0aWNzOml9O3JldHVybiBnKHMpfHxoYShjLHMpLHFlKFt5YShhLGhpKSxfYShvLGJpKV0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHZhKGMsZSl9KX1mdW5jdGlvbiBUYShlKXt2YXIgdD1lLnJlcXVlc3Qsbj1lLnJlc3BvbnNlLnByZWZldGNoO2lmKCFkKG4pKXJldHVybiBOZShbXSk7dmFyIHI9bi52aWV3cztpZighbWwocil8fFMocikpcmV0dXJuIE5lKFtdKTt2YXIgaT1tKG5oLHIpLGE9ZnVuY3Rpb24gYShlKXtyZXR1cm4gU2EodCxlKX07cmV0dXJuIHFlKFIoYSxpKSkudGhlbihYbSl9ZnVuY3Rpb24gUGEoZSl7dmFyIHQ9ZS5yZXNwb25zZS5wcmVmZXRjaDtyZXR1cm4gZCh0KT9fYSh0Lm1ldHJpY3MsYmkpOk5lKFtdKX1mdW5jdGlvbiBPYShlKXt2YXIgdD1lWzBdLG49ZVsxXSxyPWVbMl0saT1lWzNdLGE9ZVs0XSxvPXt9LHM9e307ZCh0KSYmKHMucGFnZUxvYWQ9dCksUyhuKXx8KHMubWJveGVzPW4pO3ZhciBjPXt9O3JldHVybiBTKHIpfHwoYy5tYm94ZXM9ciksUyhpKXx8KGMudmlld3M9aSksUyhhKXx8KGMubWV0cmljcz1hKSxTKHMpfHwoby5leGVjdXRlPXMpLFMoYyl8fChvLnByZWZldGNoPWMpLG99ZnVuY3Rpb24gamEoZSl7dmFyIHQ9Yihba2ksX2ksQ2ldKShlKTtyZXR1cm4gcWUoW0NhKHQpLGthKHQpLERhKHQpLFRhKHQpLFBhKHQpXSkudGhlbihPYSl9ZnVuY3Rpb24gTGEoZSl7cmV0dXJuIVMocGEoZSkpfWZ1bmN0aW9uIE1hKGUpe3ZhciB0PWZhKGUpLG49e307cmV0dXJuIFModCl8fChuLnJlc3BvbnNlVG9rZW5zPXQpLG59ZnVuY3Rpb24gVmEoZSl7dmFyIHQ9TWEoZSksbj1tYShlKTtyZXR1cm4gUyhuKXx8KHQuYW5hbHl0aWNzRGV0YWlscz1uKSx3ZSh0ZixlKSxndCh0LExhKGUpKSxOZShlKX1mdW5jdGlvbiBSYShlLHQpe3ZhciBuPU1hKHQpO3JldHVybiBuLm1ib3g9ZSx3ZSh0Zix0KSxndChuLExhKHQpKSxOZSh0KX1mdW5jdGlvbiBGYShlKXtyZXR1cm4gSWUoZWYsZSksbXQoe2Vycm9yOmV9KSxCZShlKX1mdW5jdGlvbiBOYShlLHQpe3JldHVybiBJZShlZix0KSxtdCh7bWJveDplLGVycm9yOnR9KSxCZSh0KX1mdW5jdGlvbiBCYShlKXt2YXIgdD1udCgpW1lmXSxuPWUubWJveCxyPWUudGltZW91dCxpPWQoZS5wYXJhbXMpP2UucGFyYW1zOnt9LGE9ZnVuY3Rpb24gYShlKXtyZXR1cm4gUmEobixlKX0sbz1mdW5jdGlvbiBvKGUpe3JldHVybiBOYShuLGUpfSxzPXt9LGM9e307bj09PXQ/Yy5wYWdlTG9hZD17fTpjLm1ib3hlcz1be2luZGV4OjAsbmFtZTpufV0scy5leGVjdXRlPWM7dmFyIHU9aWkobixzKTtpZighUyh1KSl7dmFyIGw9e307bC5hbmFseXRpY3M9dSxzLmV4cGVyaWVuY2VDbG91ZD1sfXJldHVybiBwdCh7bWJveDpufSksc2kocyxpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBmaShlLHIpfSkudGhlbihqYSkudGhlbihhKVsiY2F0Y2giXShvKX1mdW5jdGlvbiBVYShlKXt2YXIgdD1udCgpW1lmXSxuPWUuY29uc3VtZXJJZCxyPXZvaWQgMD09PW4/dDpuLGk9ZS5yZXF1ZXN0LGE9ZS50aW1lb3V0LG89aWkocixpKSxzPWZ1bmN0aW9uIHMoZSl7cmV0dXJuIFZhKGUpfSxjPWZ1bmN0aW9uIGMoZSl7cmV0dXJuIEZhKGUpfTtpZighUyhvKSl7dmFyIHU9aS5leHBlcmllbmNlQ2xvdWR8fHt9O3UuYW5hbHl0aWNzPW8saS5leHBlcmllbmNlQ2xvdWQ9dX1yZXR1cm4gcHQoe30pLHNpKGkse30pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGZpKGUsYSl9KS50aGVuKGphKS50aGVuKHMpWyJjYXRjaCJdKGMpfWZ1bmN0aW9uIHFhKGUsdCl7cmV0dXJuIEV0KHQpLmFkZENsYXNzKGUpfWZ1bmN0aW9uIHphKGUsdCl7cmV0dXJuIEV0KHQpLmNzcyhlKX1mdW5jdGlvbiBIYShlLHQpe3JldHVybiBFdCh0KS5hdHRyKGUpfWZ1bmN0aW9uIFdhKGUsdCxuKXtyZXR1cm4gRXQobikuYXR0cihlLHQpfWZ1bmN0aW9uIEdhKGUsdCl7cmV0dXJuIEV0KHQpLnJlbW92ZUF0dHIoZSl9ZnVuY3Rpb24gWWEoZSx0LG4pe3ZhciByPUhhKGUsbik7amwocikmJihHYShlLG4pLFdhKHQscixuKSl9ZnVuY3Rpb24gWGEoZSx0KXtyZXR1cm4gamwoSGEoZSx0KSl9ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQ6ICIrZSl9ZnVuY3Rpb24gUWEocixpLGEpe3JldHVybiBGZShmdW5jdGlvbih0LGUpe3ZhciBuPUxlKGZ1bmN0aW9uKCl7dmFyIGU9YShyKTtTKGUpfHwobi5kaXNjb25uZWN0KCksdChlKSl9KTtvKGZ1bmN0aW9uKCl7bi5kaXNjb25uZWN0KCksZShLYShyKSl9LGkpLG4ub2JzZXJ2ZSh1bCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX0pfWZ1bmN0aW9uICRhKCl7cmV0dXJuIHVsW3hoXT09PWtofWZ1bmN0aW9uIEphKHIsaSxhKXtyZXR1cm4gRmUoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dmFyIGU9YShyKTtTKGUpP2NsLnJlcXVlc3RBbmltYXRpb25GcmFtZShuKTp0KGUpfW4oKSxvKGZ1bmN0aW9uKCl7ZShLYShyKSl9LGkpfSl9ZnVuY3Rpb24gWmEocixpLGEpe3JldHVybiBGZShmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgZT1hKHIpO1MoZSk/byhuLEVoKTp0KGUpfW4oKSxvKGZ1bmN0aW9uKCl7ZShLYShyKSl9LGkpfSl9ZnVuY3Rpb24gZW8oZSx0LG4pe3ZhciByPTE8YXJndW1lbnRzLmxlbmd0aCYmdCE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06bnQoKVt0cF0saT0yPGFyZ3VtZW50cy5sZW5ndGgmJm4hPT11bmRlZmluZWQ/YXJndW1lbnRzWzJdOkV0LGE9aShlKTtyZXR1cm4gUyhhKT9qZSgpP1FhKGUscixpKTokYSgpP0phKGUscixpKTpaYShlLHIsaSk6TmUoYSl9ZnVuY3Rpb24gdG8oZSl7cmV0dXJuIEhhKElkLGUpfWZ1bmN0aW9uIG5vKGUpe3JldHVybiBYYShJZCxlKX1mdW5jdGlvbiBybyhlKXtyZXR1cm4geShmdW5jdGlvbihlKXtyZXR1cm4gWWEoVGQsSWQsZSl9LEEoT3QoRmQsZSkpKSxlfWZ1bmN0aW9uIGlvKGUpe3JldHVybiB5KGZ1bmN0aW9uKGUpe3JldHVybiBZYShJZCxUZCxlKX0sQShPdChGZCxlKSkpLGV9ZnVuY3Rpb24gYW8oZSl7cmV0dXJuIHdlKGdmLGUpLEhhKFRkLFdhKFRkLGUsRHQoIjwiK0ZkKyIvPiIpKSl9ZnVuY3Rpb24gb28oZSl7dmFyIHQ9bShubyxBKE90KEZkLGUpKSk7cmV0dXJuIFModCl8fHkoYW8sUih0byx0KSksZX1mdW5jdGlvbiBzbyhlKXtyZXR1cm4gYihbcm8sb28saW9dKShlKX1mdW5jdGlvbiBjbyhlKXt2YXIgdD1IYShUZCxlKTtyZXR1cm4gamwodCk/dDpudWxsfWZ1bmN0aW9uIHVvKGUpe3JldHVybiBtKGpsLFIoY28sQShPdChTZCxlKSkpKX1mdW5jdGlvbiBsbyhlKXtyZXR1cm4gQihmdW5jdGlvbihlLHQpe3JldHVybiBlLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd2UoeWYsdCksT2Uoe3JlbW90ZVNjcmlwdDp0fSksZ2wodCl9KX0sTmUoKSxlKX1mdW5jdGlvbiBmbyhlKXtyZXR1cm4gZX1mdW5jdGlvbiBwbyhlLHQpe3JldHVybiBJZShaZCx0KSxPZSh7YWN0aW9uOmUsZXJyb3I6dH0pLGV9ZnVuY3Rpb24gZ28oZSx0KXt2YXIgbixyPUV0KHRbWGxdKSxpPXNvKHd0KHRbQmxdKSksYT11byhpKTt0cnl7bj1OZShlKHIsaSkpfWNhdGNoKG8pe3JldHVybiBCZShwbyh0LG8pKX1yZXR1cm4gUyhhKT9uLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZm8odCl9KVsiY2F0Y2giXShmdW5jdGlvbihlKXtyZXR1cm4gcG8odCxlKX0pOm4udGhlbihmdW5jdGlvbigpe3JldHVybiBsbyhhKX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZm8odCl9KVsiY2F0Y2giXShmdW5jdGlvbihlKXtyZXR1cm4gcG8odCxlKX0pfWZ1bmN0aW9uIG1vKGUpe3ZhciB0PXd0KGUpO3JldHVybiBWKCIiLEIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5wdXNoKFp0KHd0KHQpKSksZX0sW10sQShPdChJaCx0KSkpKX1mdW5jdGlvbiBobyhlKXt2YXIgdD1sbCh7fSxlKSxuPXRbQmxdO2lmKFAobikpcmV0dXJuIHQ7dmFyIHI9RXQodFtYbF0pO3JldHVybiBQdChMZCxyKSYmKHRbTmxdPXBkLHRbQmxdPW1vKG4pKSx0fWZ1bmN0aW9uIHZvKGUpe3JldHVybiBlLmluZGV4T2YoInB4Iik9PT1lLmxlbmd0aC0yP2U6ZSsicHgifWZ1bmN0aW9uIGJvKGUsdCl7cmV0dXJuIEp0KFp0KHQpLGUpfWZ1bmN0aW9uIHlvKGUpe3JldHVybiB3ZShyZixlKSxnbyhibyxlKX1mdW5jdGlvbiBfbyhlKXt2YXIgdD1FdChlW1hsXSksbj1lW0JsXTtyZXR1cm4gd2UocmYsZSksT2Uoe2FjdGlvbjplfSksZW4obix0KSxOZShlKX1mdW5jdGlvbiBDbyhlLHQpe3JldHVybiBRdChadCh0KSxlKX1mdW5jdGlvbiB4byhlKXtyZXR1cm4gd2UocmYsZSksZ28oQ28sZSl9ZnVuY3Rpb24ga28oZSx0KXtyZXR1cm4gJHQoWnQodCksZSl9ZnVuY3Rpb24gRW8oZSl7cmV0dXJuIHdlKHJmLGUpLGdvKGtvLGUpfWZ1bmN0aW9uIElvKGUsdCl7dmFyIG49VHQoZSk7cmV0dXJuIFl0KEt0KFp0KHQpLGUpKSxufWZ1bmN0aW9uIHdvKGUpe3JldHVybiB3ZShyZixlKSxnbyhJbyxlKX1mdW5jdGlvbiBEbyhlLHQpe3JldHVybiBBdChLdChadCh0KSxlKSl9ZnVuY3Rpb24gQW8oZSl7cmV0dXJuIHdlKHJmLGUpLGdvKERvLGUpfWZ1bmN0aW9uIFNvKGUsdCl7cmV0dXJuIFN0KFh0KFp0KHQpLGUpKX1mdW5jdGlvbiBUbyhlKXtyZXR1cm4gd2UocmYsZSksZ28oU28sZSl9ZnVuY3Rpb24gUG8oZSx0KXtyZXR1cm4gVHQoS3QoWnQodCksZSkpfWZ1bmN0aW9uIE9vKGUpe3JldHVybiB3ZShyZixlKSxnbyhQbyxlKX1mdW5jdGlvbiBqbyhlKXt2YXIgdD1lW0JsXSxuPUV0KGVbWGxdKTtyZXR1cm4gd2UocmYsZSksT2Uoe2FjdGlvbjplfSksR2EoVGQsbiksV2EoVGQsYW8odCksbiksTmUoZSl9ZnVuY3Rpb24gTG8oZSl7dmFyIHQ9ZVtCbF0sbj1FdChlW1hsXSk7cmV0dXJuIHdlKHJmLGUpLE9lKHthY3Rpb246ZX0pLHkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gV2EodCxlLG4pfSx0KSxOZShlKX1mdW5jdGlvbiBNbyhlLHQscil7eShmdW5jdGlvbihuKXt5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uc3R5bGUuc2V0UHJvcGVydHkodCxlLHIpfSx0KX0sQShlKSl9ZnVuY3Rpb24gVm8oZSl7dmFyIHQ9RXQoZVtYbF0pLG49ZVtCbF0scj1uW1lsXTtyZXR1cm4gd2UocmYsZSksT2Uoe2FjdGlvbjplfSksUChyKT96YShuLHQpOk1vKHQsbixyKSxOZShlKX1mdW5jdGlvbiBSbyhlKXt2YXIgdD1FdChlW1hsXSksbj1lW0JsXTtyZXR1cm4gbltxbF09dm8obltxbF0pLG5bVWxdPXZvKG5bVWxdKSx3ZShyZixlKSxPZSh7YWN0aW9uOmV9KSx6YShuLHQpLE5lKGUpfWZ1bmN0aW9uIEZvKGUpe3ZhciB0PUV0KGVbWGxdKSxuPWVbQmxdO3JldHVybiBuW3psXT12byhuW3psXSksbltIbF09dm8obltIbF0pLHdlKHJmLGUpLE9lKHthY3Rpb246ZX0pLHphKG4sdCksTmUoZSl9ZnVuY3Rpb24gTm8oZSl7dmFyIHQ9RXQoZVtYbF0pO3JldHVybiB3ZShyZixlKSxPZSh7YWN0aW9uOmV9KSxZdCh0KSxOZShlKX1mdW5jdGlvbiBCbyhlKXt2YXIgdD1FdChlW1hsXSksbj1lW0JsXSxyPW5bV2xdLGk9bltHbF0sYT1BKGp0KHQpKSxvPWFbcl0scz1hW2ldO3JldHVybiBJdChvKSYmSXQocyk/KHdlKHJmLGUpLE9lKHthY3Rpb246ZX0pLHI8aT9YdChvLHMpOkt0KG8scyksTmUoZSkpOih3ZShwZixlKSxCZShlKSl9ZnVuY3Rpb24gVW8oZSl7dmFyIHQ9aG8oZSk7c3dpdGNoKHRbTmxdKXtjYXNlIFFsOnJldHVybiB5byh0KTtjYXNlIEpsOnJldHVybiBfbyh0KTtjYXNlIHBkOnJldHVybiB4byh0KTtjYXNlIG1kOnJldHVybiBFbyh0KTtjYXNlIHZkOnJldHVybiB3byh0KTtjYXNlIGRkOnJldHVybiBBbyh0KTtjYXNlIGZkOnJldHVybiBUbyh0KTtjYXNlIHNkOnJldHVybiBPbyh0KTtjYXNlIGVkOnJldHVybiBMbyh0KTtjYXNlIHRkOnJldHVybiBqbyh0KTtjYXNlIG5kOnJldHVybiBWbyh0KTtjYXNlIGlkOnJldHVybiBSbyh0KTtjYXNlIGFkOnJldHVybiBGbyh0KTtjYXNlIG9kOnJldHVybiBObyh0KTtjYXNlIHJkOnJldHVybiBCbyh0KTtkZWZhdWx0OnJldHVybiBOZSh0KX19ZnVuY3Rpb24gcW8oZSl7cmV0dXJuIGVbTmxdPT09dWR8fGVbTmxdPT09bGR9ZnVuY3Rpb24gem8oZSl7dmFyIHQ9ZVtYbF07cmV0dXJuIGpsKHQpfHxMKHQpfWZ1bmN0aW9uIEhvKGUpe3ZhciB0PWUua2V5O2lmKCFQKHQpJiZ6byhlKSl7dmFyIG49ZVtYbF07V2Eod2gsdCxuKX19ZnVuY3Rpb24gV28oZSl7dmFyIHQ9ZVtLbF07UCh0KXx8cG4odCl9ZnVuY3Rpb24gR28oZSl7aWYoem8oZSkpe3ZhciB0PWVbWGxdO3FvKGUpP3FhKFVmLHQpOihxYShCZix0KSxXbyhlKSl9ZWxzZSBXbyhlKX1mdW5jdGlvbiBZbyhlKXt5KEdvLGUpfWZ1bmN0aW9uIFhvKGUpe3ZhciB0PWUua2V5O2lmKFAodCkpcmV0dXJuITA7aWYoZVtObF09PT1zZClyZXR1cm4gZVtQcF07dmFyIG49ZVtYbF0scj1IYSh3aCxuKTtyZXR1cm4gciE9PXR8fHI9PT10JiYhZVtQcF19ZnVuY3Rpb24gS28obil7cmV0dXJuIFhvKG4pP1VvKG4pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd2UobmYsbiksT2Uoe2FjdGlvbjpufSksSG8obiksR28obiksbn0pWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe0llKFpkLGUpLE9lKHthY3Rpb246bixlcnJvcjplfSksR28obik7dmFyIHQ9bGwoe30sbik7cmV0dXJuIHRbX2ZdPSEwLHR9KTooR28obiksbil9ZnVuY3Rpb24gUW8oZSl7dmFyIHQ9bShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWVbX2ZdfSxlKTtyZXR1cm4gUyh0KT9OZSgpOihZbyh0KSxCZShlKSl9ZnVuY3Rpb24gJG8odCl7cmV0dXJuIGVvKHRbWGxdKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KVsiY2F0Y2giXShmdW5jdGlvbigpe3ZhciBlPWxsKHt9LHQpO3JldHVybiBlW19mXT0hMCxlfSl9ZnVuY3Rpb24gSm8oZSl7cmV0dXJuICRvKGUpLnRoZW4oS28pfWZ1bmN0aW9uIFpvKGUpe3JldHVybiBxZShSKEpvLGUpKS50aGVuKFFvKX1mdW5jdGlvbiBlcyhlLHQsbil7cmV0dXJuIEV0KG4pLm9uKGUsdCl9ZnVuY3Rpb24gdHMoZSx0LG4pe3JldHVybiBFdChuKS5vZmYoZSx0KX1mdW5jdGlvbiBucyhlKXtyZXR1cm4gZW8oZVtYbF0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gT2Uoe21ldHJpYzplfSksbGwoe2ZvdW5kOiEwfSxlKX0pWyJjYXRjaCJdKGZ1bmN0aW9uKCl7cmV0dXJuIEllKERoLGUpLE9lKHttZXRyaWM6ZSxtZXNzYWdlOkRofSksZX0pfWZ1bmN0aW9uIHJzKGUsdCxuKXtyZXR1cm4gZVtBaF1bU2hdKHQsbil9ZnVuY3Rpb24gaXMoZSx0LG4pe3ZhciByPXt9O3JbRnBdPVtOcF07dmFyIGk9e307aVtmaF09ZGgsaVtwaF09dCxpW21oXT1uLGlbaGhdPSEwLGlbYmhdPSExLGlbZ2hdPXI7dHJ5e2UoaSl9Y2F0Y2goYSl7cmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gYXMoZSl7cmV0dXJuIEFoIGluIGUmJlNoIGluIGVbQWhdfWZ1bmN0aW9uIG9zKGUsdCl7cmV0dXJuIGFzKGNsKT9ycyhjbCxlLHQpOmlzKEZpLGUsdCl9ZnVuY3Rpb24gc3MoZSl7dmFyIHQ9ZS5uYW1lLG49TW4oanApfHx7fTtuW3RdPWUsTG4oanAsbil9ZnVuY3Rpb24gY3MoZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnt9LHI9bi5wYWdlLGk9dm9pZCAwPT09cnx8cixhPShNbihqcCl8fHt9KVtlXTtpZihnKGEpKXJldHVybiBhO3ZhciBvPW4uaW1wcmVzc2lvbklkO3JldHVybiBnKG8pP2E6bGwoe3BhZ2U6aSxpbXByZXNzaW9uSWQ6b30sYSl9ZnVuY3Rpb24gdXMoZSl7eShzcyxlKX1mdW5jdGlvbiBscyhlKXt2YXIgdD1paShlLHt9KSxuPXtjb250ZXh0OntiZWFjb246ITB9fTtpZighUyh0KSl7dmFyIHI9e307ci5hbmFseXRpY3M9dCxuLmV4cGVyaWVuY2VDbG91ZD1yfXJldHVybiBufWZ1bmN0aW9uIGRzKGUsdCxuKXt2YXIgcj1jaShscyhlKSx0KTtyZXR1cm4gci5ub3RpZmljYXRpb25zPW4scn1mdW5jdGlvbiBmcyhlLHQsbil7cmV0dXJuIHNpKGxzKGUpLHQpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUubm90aWZpY2F0aW9ucz1uLGV9KX1mdW5jdGlvbiBwcyhlLHQsbil7dmFyIHI9e2lkOkgoKSx0eXBlOnQsdGltZXN0YW1wOk4oKSxwYXJhbWV0ZXJzOmUucGFyYW1ldGVycyxwcm9maWxlUGFyYW1ldGVyczplLnByb2ZpbGVQYXJhbWV0ZXJzLG9yZGVyOmUub3JkZXIscHJvZHVjdDplLnByb2R1Y3R9O3JldHVybiBTKG4pfHwoci50b2tlbnM9bikscn1mdW5jdGlvbiBncyhlLHQsbil7dmFyIHI9ZS5uYW1lLGk9ZS5zdGF0ZSxhPXBzKGUsdCxuKTtyZXR1cm4gYS5tYm94PXtuYW1lOnIsc3RhdGU6aX0sYX1mdW5jdGlvbiBtcyhlLHQsbil7dmFyIHI9ZS5uYW1lLGk9ZS5zdGF0ZSxhPXBzKGUsdCxuKTtyZXR1cm4gYS52aWV3PXtuYW1lOnIsc3RhdGU6aX0sYX1mdW5jdGlvbiBocyhlKXt2YXIgdD1kaShudCgpKTtyZXR1cm4gb3ModCxKU09OLnN0cmluZ2lmeShlKSk/KHdlKFRoLHQsZSksITApOihJZShQaCx0LGUpLCExKX1mdW5jdGlvbiB2cyhlLHQsbil7dmFyIHI9aXIobnQoKVtZZl0pLGk9cHMoWnIoe30sciksdCxbbl0pLGE9ZHMoSCgpLHIsW2ldKTt3ZShNaCxlLGkpLE9lKHtzb3VyY2U6ZSxldmVudDp0LHJlcXVlc3Q6YX0pLGhzKGEpfWZ1bmN0aW9uIGJzKGUsdCxuKXt2YXIgcj1pcihlKSxpPXBzKFpyKHt9LHIpLHQsW25dKTtpLm1ib3g9e25hbWU6ZX07dmFyIGE9ZHMoZSxyLFtpXSk7d2UoVmgsZSxpKSxPZSh7bWJveDplLGV2ZW50OnQscmVxdWVzdDphfSksaHMoYSl9ZnVuY3Rpb24geXMoZSl7dmFyIHQ9bnQoKVtZZl0sYT1bXSxvPVJwO2lmKHkoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYm94LG49ZS5kYXRhO2lmKCFnKG4pKXt2YXIgcj1uLmV2ZW50VG9rZW5zLGk9dm9pZCAwPT09cj9bXTpyO1MoaSl8fGEucHVzaChncyh0LG8saSkpfX0sZSksIVMoYSkpe3ZhciBuPWRzKHQse30sYSk7d2UoTGgsYSksT2Uoe3NvdXJjZTpGaCxldmVudDpOaCxyZXF1ZXN0Om59KSxocyhuKX19ZnVuY3Rpb24gX3MoZSx0LG4pe3ZhciByPWlyKG50KClbWWZdKSxpPXBzKFpyKHt9LHIpLHQsW25dKTtpLnZpZXc9e25hbWU6ZX07dmFyIGE9ZHMoSCgpLHIsW2ldKTt3ZShSaCxlLGkpLE9lKHt2aWV3OmUsZXZlbnQ6dCxyZXF1ZXN0OmF9KSxocyhhKX1mdW5jdGlvbiBDcyhlKXt2YXIgdD1lLnZpZXdOYW1lLG49ZS5pbXByZXNzaW9uSWQscj1pcihudCgpW1lmXSksaT1wcyhacih7fSxyKSxScCxbXSk7aS52aWV3PXtuYW1lOnR9LHdlKE9oLHQpLGZzKHQscixbaV0pLnRoZW4oZnVuY3Rpb24oZSl7ZS5pbXByZXNzaW9uSWQ9bixPZSh7dmlldzp0LGV2ZW50OkJoLHJlcXVlc3Q6ZX0pLGhzKGUpfSl9ZnVuY3Rpb24geHMoZSl7aWYoIWcoZSkpe3ZhciB0PWUudmlldyxuPWUuZGF0YSxyPSh2b2lkIDA9PT1uP3t9Om4pLmV2ZW50VG9rZW5zLGk9dm9pZCAwPT09cj9bXTpyO2lmKCFTKGkpKXt2YXIgYT10Lm5hbWUsbz10LmltcHJlc3Npb25JZCxzPWNzKGEpO2lmKCFnKHMpKXt2YXIgYz1kcyhhLHt9LFttcyhzLFJwLGkpXSk7Yy5pbXByZXNzaW9uSWQ9byx3ZShqaCxhLGkpLE9lKHt2aWV3OmEsZXZlbnQ6TmgscmVxdWVzdDpjfSksaHMoYyl9fX19ZnVuY3Rpb24ga3MoZSx0KXtlPT09amQmJnFhKFVmLHQpfWZ1bmN0aW9uIEVzKGUsdCl7cmV0dXJuIWcoVWhbZV0pJiYhZyhVaFtlXVt0XSl9ZnVuY3Rpb24gSXMoZSxyLGkpe2lmKGcoVWhbZV0pKXt2YXIgdD1wKFVoKTtTKHQpfHx5KGZ1bmN0aW9uKG4pe3koZnVuY3Rpb24oZSl7dmFyIHQ9VWhbbl1bZV07dHMocix0LGkpfSxwKFVoW25dKSksZGVsZXRlIFVoW25dfSx0KX19ZnVuY3Rpb24gd3MoZSx0LG4pe1VoW2VdPVVoW2VdfHx7fSxVaFtlXVt0XT1ufWZ1bmN0aW9uIERzKGUsdCxuLHIpe3ZhciBpPW4udHlwZSxhPW4uc2VsZWN0b3Isbz1uLmV2ZW50VG9rZW4scz14KGkrIjoiK2ErIjoiK28pLGM9ZnVuY3Rpb24gYygpe3JldHVybiByKGUsaSxvKX07a3MoaSxhKSx0P0VzKGUscyl8fChJcyhlLGksYSksd3MoZSxzLGMpLGVzKGksYyxhKSk6ZXMoaSxjLGEpfWZ1bmN0aW9uIEFzKHQsbixlLHIpe3JldHVybiBxZShSKG5zLGUpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiB5KGZ1bmN0aW9uKGUpe3JldHVybiBEcyh0LG4sZSxyKX0sbShmdW5jdGlvbihlKXtyZXR1cm4gZS5mb3VuZH0sZSkpLFdoKCl9KVsiY2F0Y2giXShHaCl9ZnVuY3Rpb24gU3MoZSl7cmV0dXJuIEFzKGUubmFtZSwhMSxIaChlKSxicyl9ZnVuY3Rpb24gVHMoZSl7cmV0dXJuIEFzKGUubmFtZSwhMCxIaChlKSxfcyl9ZnVuY3Rpb24gUHMoZSl7cmV0dXJuIEFzKHFoLCExLEhoKGUpLHZzKX1mdW5jdGlvbiBPcyhlKXtyZXR1cm4gQXMoemgsITEsSGgoZSksdnMpfWZ1bmN0aW9uIGpzKGUpe3ZhciB0PVIoWGgsZSk7ZG4oWG0odCkpfWZ1bmN0aW9uIExzKGUpe3ZhciB0PVIoWGgsZSk7Zm4oWG0odCkpfWZ1bmN0aW9uIE1zKGUpe3ZhciB0PW0oR20sS20oZSkpO3JldHVybiB2KFIoWWgsdCkpfWZ1bmN0aW9uIFZzKGUpe3JldHVybiBkKGUpJiZlLnR5cGUhPT1abH1mdW5jdGlvbiBScyhlLHQsbil7cmV0dXJuIFIoZnVuY3Rpb24oZSl7cmV0dXJuIGxsKHtrZXk6dCxwYWdlOm59LGUpfSxtKFZzLGUpKX1mdW5jdGlvbiBGcyhlLHQsbil7dmFyIHI9ZS5ldmVudFRva2VuO3JldHVybiBabyhScyhlLmNvbnRlbnQsdCxuKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBLaChyKX0pWyJjYXRjaCJdKFFoKX1mdW5jdGlvbiBOcyhlKXtyZXR1cm4gZChlKSYmZS50eXBlIT09d2R9ZnVuY3Rpb24gQnMoZSx0KXtyZXR1cm4gUihlLG0oTnMsS20odCkpKX1mdW5jdGlvbiBVcyhlLHQsbil7dmFyIHI9Yyh7c3RhdHVzOkVmfSxlLHQpLGk9UihpaCxtKFdtLG4pKSxhPXt9O3JldHVybiBTKGkpfHwoci5zdGF0dXM9X2YsYS5lcnJvcnM9aSksUyhhKXx8KHIuZGF0YT1hKSxyfWZ1bmN0aW9uIHFzKGUsdCxuKXt2YXIgcj1jKHtzdGF0dXM6RWZ9LGUsdCksaT1SKGloLG0oV20sbikpLGE9UihpaCxtKCRoLG4pKSxvPXt9O3JldHVybiBTKGkpfHwoci5zdGF0dXM9X2Ysby5lcnJvcnM9aSksUyhhKXx8KG8uZXZlbnRUb2tlbnM9YSksUyhvKXx8KHIuZGF0YT1vKSxyfWZ1bmN0aW9uIHpzKHQsZSxuKXt2YXIgcj1mdW5jdGlvbiByKGUpe3JldHVybiBGcyhlLCEwKX07cmV0dXJuIHFlKEJzKHIsdCkpLnRoZW4oZSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbih0KSxlfSl9ZnVuY3Rpb24gSHModCxuLHIsaSl7dmFyIGE9bi5uYW1lLG89ZnVuY3Rpb24gbyhlKXtyZXR1cm4gRnMoZSxhLHIpfTtyZXR1cm4gcWUoQnMobyxuKSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gcXModCxuLGUpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gaShuKSxlfSl9ZnVuY3Rpb24gV3ModCl7dmFyIG49ZnVuY3Rpb24gbihlKXtyZXR1cm4gVXMoRGYsdCxlKX07cmV0dXJuIHpzKHQsbixTcyl9ZnVuY3Rpb24gR3MoZSl7cmV0dXJuIEhzKERmLGUsITAsU3MpfWZ1bmN0aW9uIFlzKGUpe2pzKE1zKGUpKX1mdW5jdGlvbiBYcyhlLHQpe2lmKCEoMTxhcmd1bWVudHMubGVuZ3RoJiZ0IT09dW5kZWZpbmVkJiZhcmd1bWVudHNbMV0pKXt2YXIgbj1lLmV4ZWN1dGUscj0odm9pZCAwPT09bj97fTpuKS5wYWdlTG9hZCxpPXZvaWQgMD09PXI/e306cjtTKGkpfHxZcyhpKX19ZnVuY3Rpb24gS3MoZSl7dmFyIHQ9ZS5wcmVmZXRjaCxuPSh2b2lkIDA9PT10P3t9OnQpLnZpZXdzLHI9dm9pZCAwPT09bj9bXTpuO1Mocil8fExzKHYoUihNcyxyKSkpfWZ1bmN0aW9uIFFzKGUpe2pzKE1zKGUpKSxnbigpfWZ1bmN0aW9uICRzKHQpe3ZhciBuPWZ1bmN0aW9uIG4oZSl7cmV0dXJuIFVzKEZmLHQsZSl9O3JldHVybiB6cyh0LG4sUHMpfWZ1bmN0aW9uIEpzKGUpe3JldHVybiBxZShSKFdzLGUpKX1mdW5jdGlvbiBacyhlKXtyZXR1cm4gcWUoUihHcyxlKSl9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIHFlKFtPcyhlKV0pLnRoZW4oVXMpfWZ1bmN0aW9uIHRjKGUpe3ZhciB0PWUucGFnZTtyZXR1cm4gSHMoT3AsZSx0LFRzKX1mdW5jdGlvbiBuYygpe31mdW5jdGlvbiByYygpe3JldHVybiBuZXcgSmh9ZnVuY3Rpb24gaWMoZSx0LG4pe2UuZW1pdCh0LG4pfWZ1bmN0aW9uIGFjKGUsdCxuKXtlLm9uKHQsbil9ZnVuY3Rpb24gb2MoZSx0KXtpYyhldixlLHQpfWZ1bmN0aW9uIHNjKGUsdCl7YWMoZXYsZSx0KX1mdW5jdGlvbiBjYyhlKXtyZXR1cm57dHlwZTpjZCxjb250ZW50OmUudXJsfX1mdW5jdGlvbiB1YyhlKXt2YXIgdD17fTtyZXR1cm4gdC50eXBlPVFsLHQuY29udGVudD1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIGxjKGUpe3ZhciB0PXt9O3JldHVybiB0LnR5cGU9SmwsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gZGMoZSl7dmFyIHQ9e307cmV0dXJuIHQudHlwZT1wZCx0LmNvbnRlbnQ9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBmYyhlKXt2YXIgdD17fTtyZXR1cm4gdC50eXBlPW1kLHQuY29udGVudD1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIHBjKGUpe3ZhciB0PXt9O3JldHVybiB0LnR5cGU9dmQsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gZ2MoZSl7dmFyIHQ9e307cmV0dXJuIHQudHlwZT1kZCx0LmNvbnRlbnQ9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBtYyhlKXt2YXIgdD17fTtyZXR1cm4gdC50eXBlPWZkLHQuY29udGVudD1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIGhjKGUpe3ZhciB0PXt9O3JldHVybiB0LnR5cGU9c2QsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gdmMoZSl7dmFyIHQ9e307aWYodC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3RvcixlLmF0dHJpYnV0ZT09PVRkKXJldHVybiB0LnR5cGU9dGQsdC5jb250ZW50PWUudmFsdWUsdDt0LnR5cGU9ZWQ7dmFyIG49e307cmV0dXJuIG5bZS5hdHRyaWJ1dGVdPWUudmFsdWUsdC5jb250ZW50PW4sdH1mdW5jdGlvbiBiYyhlKXt2YXIgdD1lLnN0eWxlLG49dm9pZCAwPT09dD97fTp0LHI9e307cmV0dXJuIHIuc2VsZWN0b3I9ZS5zZWxlY3RvcixyLmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsZyhuLmxlZnQpfHxnKG4udG9wKT9nKG4ud2lkdGgpfHxnKG4uaGVpZ2h0KT9yLnR5cGU9bmQ6ci50eXBlPWlkOnIudHlwZT1hZCxyLmNvbnRlbnQ9bixyfWZ1bmN0aW9uIHljKGUpe3ZhciB0PXt9O3JldHVybiB0LnR5cGU9b2QsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIF9jKGUpe3ZhciB0PXt9O3QuZnJvbT1lLmZyb20sdC50bz1lLnRvO3ZhciBuPXt9O3JldHVybiBuLnR5cGU9cmQsbi5zZWxlY3Rvcj1lLnNlbGVjdG9yLG4uY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3RvcixuLmNvbnRlbnQ9dCxufWZ1bmN0aW9uIENjKGUpe3JldHVybiBqbChlLnNlbGVjdG9yKSYmamwoZS5jc3NTZWxlY3Rvcil9ZnVuY3Rpb24geGMoZSl7dmFyIHQ9e307aWYoUyhlKSlyZXR1cm4gdDt2YXIgbj1bXSxyPVtdLGk9W107eShmdW5jdGlvbihlKXtzd2l0Y2goZS5hY3Rpb24pe2Nhc2UgJGw6Q2MoZSk/aS5wdXNoKHVjKGUpKTpuLnB1c2goe3R5cGU6RGQsY29udGVudDplLmNvbnRlbnR9KTticmVhaztjYXNlIFpsOlMoZS5jb250ZW50KXx8eShmdW5jdGlvbihlKXtyZXR1cm4gbi5wdXNoKHt0eXBlOndkLGNvbnRlbnQ6ZX0pfSxlLmNvbnRlbnQpO2JyZWFrO2Nhc2UgSmw6aS5wdXNoKGxjKGUpKTticmVhaztjYXNlIGdkOmkucHVzaChkYyhlKSk7YnJlYWs7Y2FzZSBoZDppLnB1c2goZmMoZSkpO2JyZWFrO2Nhc2UgYmQ6aS5wdXNoKHBjKGUpKTticmVhaztjYXNlIGRkOmkucHVzaChnYyhlKSk7YnJlYWs7Y2FzZSBmZDppLnB1c2gobWMoZSkpO2JyZWFrO2Nhc2Ugc2Q6aS5wdXNoKGhjKGUpKTticmVhaztjYXNlIGVkOmkucHVzaCh2YyhlKSk7YnJlYWs7Y2FzZSBuZDppLnB1c2goYmMoZSkpO2JyZWFrO2Nhc2Ugb2Q6aS5wdXNoKHljKGUpKTticmVhaztjYXNlIHJkOmkucHVzaChfYyhlKSk7YnJlYWs7Y2FzZSBjZDpuLnB1c2goY2MoZSkpO2JyZWFrO2Nhc2UgdWQ6ci5wdXNoKHt0eXBlOmpkLHNlbGVjdG9yOmUuc2VsZWN0b3IsZXZlbnRUb2tlbjplLmNsaWNrVHJhY2tJZH0pfX0sZSk7dmFyIGE9e307aWYoIVMoaSkmJm4ucHVzaCh7dHlwZTpPZixjb250ZW50Oml9KSwhUyhuKSYmKGEub3B0aW9ucz1uKSwhUyhyKSYmKGEubWV0cmljcz1yKSxTKGEpKXJldHVybiB0O3ZhciBvPXt9O3JldHVybiBvLnBhZ2VMb2FkPWEsdC5leGVjdXRlPW8sdH1mdW5jdGlvbiBrYyhlLHQpe3ZhciBuPXt9O2lmKFModCkpcmV0dXJuIG47dmFyIHI9W10saT1bXTt5KGZ1bmN0aW9uKGUpe3N3aXRjaChlLmFjdGlvbil7Y2FzZSAkbDpyLnB1c2goe3R5cGU6RGQsY29udGVudDplLmNvbnRlbnR9KTticmVhaztjYXNlIFpsOlMoZS5jb250ZW50KXx8eShmdW5jdGlvbihlKXtyZXR1cm4gci5wdXNoKHt0eXBlOndkLGNvbnRlbnQ6ZX0pfSxlLmNvbnRlbnQpO2JyZWFrO2Nhc2UgY2Q6ci5wdXNoKGNjKGUpKTticmVhaztjYXNlIGxkOmkucHVzaCh7dHlwZTpqZCxldmVudFRva2VuOmUuY2xpY2tUcmFja0lkfSl9fSx0KTt2YXIgYT17bmFtZTplfTtpZighUyhyKSYmKGEub3B0aW9ucz1yKSwhUyhpKSYmKGEubWV0cmljcz1pKSxTKGEpKXJldHVybiBuO3ZhciBvPXt9LHM9W2FdO3JldHVybiBvLm1ib3hlcz1zLG4uZXhlY3V0ZT1vLG59ZnVuY3Rpb24gRWMoZSx0LG4pe3JldHVybiBuP3hjKHQpOmtjKGUsdCl9ZnVuY3Rpb24gSWMoZSl7dmFyIHQ9ZS5zdGF0dXMsbj1lLmRhdGEscj17c3RhdHVzOnQscGFnZUxvYWQ6ITB9O3JldHVybiBnKG4pfHwoci5kYXRhPW4pLHJ9ZnVuY3Rpb24gd2MoZSl7dmFyIHQ9ZS5zdGF0dXMsbj1lLm1ib3gscj1lLmRhdGEsaT17c3RhdHVzOnQsbWJveDpuLm5hbWV9O3JldHVybiBnKHIpfHwoaS5kYXRhPXIpLGl9ZnVuY3Rpb24gRGMoZSl7dmFyIHQ9ZS5zdGF0dXMsbj1lLnZpZXcscj1lLmRhdGEsaT17c3RhdHVzOnQsdmlldzpuLm5hbWV9O3JldHVybiBnKHIpfHwoaS5kYXRhPXIpLGl9ZnVuY3Rpb24gQWMoZSl7dmFyIHQ9ZS5zdGF0dXMsbj1lLmRhdGEscj17c3RhdHVzOnQscHJlZmV0Y2hNZXRyaWNzOiEwfTtyZXR1cm4gZyhuKXx8KHIuZGF0YT1uKSxyfWZ1bmN0aW9uIFNjKGUpe2lmKGcoZSkpcmV0dXJuW251bGxdO3ZhciB0PVIoSWMsW2VdKTtyZXR1cm4gYXYodCkmJkllKHR2LGUpLHR9ZnVuY3Rpb24gVGMoZSl7aWYoZyhlKSlyZXR1cm5bbnVsbF07dmFyIHQ9Uih3YyxlKTtyZXR1cm4gYXYodCkmJkllKG52LGUpLHR9ZnVuY3Rpb24gUGMoZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnlzO2lmKGcoZSkpcmV0dXJuW251bGxdO3ZhciByPVIod2MsZSk7cmV0dXJuIGF2KHIpJiZJZShudixlKSxuKGUpLHJ9ZnVuY3Rpb24gT2MoZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnQhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnhzO2lmKGcoZSkpcmV0dXJuW251bGxdO3ZhciByPVIoRGMsW2VdKTtyZXR1cm4gYXYocikmJkllKHJ2LGUpLGUudmlldy5wYWdlJiZuKGUpLHJ9ZnVuY3Rpb24gamMoZSl7aWYoZyhlKSlyZXR1cm5bbnVsbF07dmFyIHQ9UihBYyxbZV0pO3JldHVybiBhdih0KSYmSWUoaXYsZSksdH1mdW5jdGlvbiBMYyhlKXt2YXIgdD12KFtTYyhlWzBdKSxUYyhlWzFdKSxQYyhlWzJdKSxqYyhlWzNdKV0pLG49bSh6bSx0KSxyPW0oV20sbik7cmV0dXJuIFMocik/TmUobik6QmUocil9ZnVuY3Rpb24gTWMoZSl7cmV0dXJuIEJlKGUpfWZ1bmN0aW9uIFZjKHIsZSl7aWYoIVMoZSkpe3ZhciB0PWUub3B0aW9ucztTKHQpfHx5KGZ1bmN0aW9uKGUpe2lmKGUudHlwZT09PURkKXt2YXIgdD1RbCxuPWUuY29udGVudDtlLnR5cGU9T2YsZS5jb250ZW50PVt7dHlwZTp0LHNlbGVjdG9yOnIsY29udGVudDpufV19fSx0KX19ZnVuY3Rpb24gUmModCxlKXt2YXIgbj1lLm1ldHJpY3M7aWYoIVMobikpe3ZhciByPWUubmFtZTt5KGZ1bmN0aW9uKGUpe2UubmFtZT1yLGUuc2VsZWN0b3I9ZS5zZWxlY3Rvcnx8dH0sbil9fWZ1bmN0aW9uIEZjKHQsZSl7dmFyIG49bGwoe30sZSkscj1uLmV4ZWN1dGUsaT12b2lkIDA9PT1yP3t9OnIsYT1uLnByZWZldGNoLG89dm9pZCAwPT09YT97fTphLHM9aS5wYWdlTG9hZCxjPXZvaWQgMD09PXM/e306cyx1PWkubWJveGVzLGw9dm9pZCAwPT09dT9bXTp1LGQ9by5tYm94ZXMsZj12b2lkIDA9PT1kP1tdOmQ7cmV0dXJuIFZjKHQsYykseShmdW5jdGlvbihlKXtyZXR1cm4gVmModCxlKX0sbCkseShmdW5jdGlvbihlKXtyZXR1cm4gUmModCxlKX0sbCkseShmdW5jdGlvbihlKXtyZXR1cm4gVmModCxlKX0sZikseShmdW5jdGlvbihlKXtyZXR1cm4gUmModCxlKX0sZiksbn1mdW5jdGlvbiBOYyhlKXt2YXIgdD1lLnByZWZldGNoLG49KHZvaWQgMD09PXQ/e306dCkudmlld3Mscj12b2lkIDA9PT1uP1tdOm47UyhyKXx8dXMocil9ZnVuY3Rpb24gQmMoZSl7dmFyIHQ9W10sbj1lLmV4ZWN1dGUscj12b2lkIDA9PT1uP3t9Om4saT1yLnBhZ2VMb2FkLGE9dm9pZCAwPT09aT97fTppLG89ci5tYm94ZXMscz12b2lkIDA9PT1vP1tdOm87UyhhKT90LnB1c2goTmUobnVsbCkpOnQucHVzaCgkcyhhKSksUyhzKT90LnB1c2goTmUobnVsbCkpOnQucHVzaChKcyhzKSk7dmFyIGM9ZS5wcmVmZXRjaCx1PXZvaWQgMD09PWM/e306YyxsPXUubWJveGVzLGQ9dm9pZCAwPT09bD9bXTpsLGY9dS5tZXRyaWNzLHA9dm9pZCAwPT09Zj9bXTpmO3JldHVybiBTKGQpP3QucHVzaChOZShudWxsKSk6dC5wdXNoKFpzKGQpKSxtbChwKSYmIVMocCk/dC5wdXNoKGVjKHUpKTp0LnB1c2goTmUobnVsbCkpLGxuKCkscWUodCkudGhlbihMYylbImNhdGNoIl0oTWMpfWZ1bmN0aW9uIFVjKGUsdCl7byhmdW5jdGlvbigpe3JldHVybiBlLmxvY2F0aW9uLnJlcGxhY2UodCl9KX1mdW5jdGlvbiBxYyhlKXtyZXR1cm4gamwoZSk/ZTpMKGUpP2U6TGR9ZnVuY3Rpb24gemMoZSl7cWEoQmYsZSl9ZnVuY3Rpb24gSGMoZSl7dmFyIHQ9ZS5tYm94LG49ZS5zZWxlY3RvcixyPWUub2ZmZXIsaT1udCgpLGE9dD09PWlbWWZdO2lmKFMocikpcmV0dXJuIHdlKHZmKSx6YyhuKSxsbigpLHZvaWQgeXQoe21ib3g6dH0pO3ZhciBvPUZjKG4sRWModCxyLGEpKSxzPXBhKG8pO2lmKCFTKHMpKXt2YXIgYz1zLnVybDtyZXR1cm4gd2UoYmYscyksX3Qoe3VybDpjfSksdm9pZCBVYyhjbCxjKX1odCh7bWJveDp0fSksWHMobyksQmMobykudGhlbihmdW5jdGlvbihlKXtTKGUpfHx2dCh7bWJveDp0LGV4ZWN1dGlvbjplfSl9KVsiY2F0Y2giXShmdW5jdGlvbihlKXtyZXR1cm4gYnQoe2Vycm9yOmV9KX0pfWZ1bmN0aW9uIFdjKGUsdCl7dmFyIG49MTxhcmd1bWVudHMubGVuZ3RoJiZ0IT09dW5kZWZpbmVkJiZhcmd1bWVudHNbMV0scj1lLnNlbGVjdG9yLGk9ZS5yZXNwb25zZTtpZihTKGkpKXJldHVybiB3ZSh2ZiksemMociksbG4oKSx5dCh7fSksb2MoYWcpLE5lKCk7dmFyIGE9RmMocixpKSxvPXBhKGEpO2lmKFMobykpcmV0dXJuIGh0KHt9KSxOYyhhKSxvYyhpZyksWHMoYSxuKSxCYyhhKS50aGVuKGZ1bmN0aW9uKGUpe1MoZSl8fHZ0KHtleGVjdXRpb246ZX0pfSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7cmV0dXJuIGJ0KHtlcnJvcjplfSl9KTt2YXIgcz1vLnVybDtyZXR1cm4gd2UoYmYsbyksX3Qoe3VybDpzfSksb2Mob2cpLFVjKGNsLHMpLE5lKCl9ZnVuY3Rpb24gR2MoZSl7dmFyIHQ9ZVt0Z107aWYoUyh0KSlyZXR1cm4hMTt2YXIgbj10LnJlcXVlc3Qscj10LnJlc3BvbnNlO3JldHVybiFTKG4pJiYhUyhyKX1mdW5jdGlvbiBZYyhlKXtyZXR1cm4gZVt0Z119ZnVuY3Rpb24gWGMoZSl7SWUob3YsVXAsZSksT2Uoe3NvdXJjZTpvdixlcnJvcjplfSksbG4oKX1mdW5jdGlvbiBLYyhlLHQpe3ZhciBuPTE8YXJndW1lbnRzLmxlbmd0aCYmdCE9PXVuZGVmaW5lZCYmYXJndW1lbnRzWzFdLHI9e3NlbGVjdG9yOkxkLHJlc3BvbnNlOmV9O3dlKG92LE1mLGUpLE9lKHtzb3VyY2U6b3YscmVzcG9uc2U6ZX0pLFdjKHIsbilbImNhdGNoIl0oWGMpfWZ1bmN0aW9uIFFjKGUsdCl7dmFyIG49bGwoe30sdCkscj1uLmV4ZWN1dGUsaT1uLnByZWZldGNoLGE9ZVtEcF0sbz1lW3dwXTtyZXR1cm4gciYmKG4uZXhlY3V0ZS5tYm94ZXM9bnVsbCksciYmIWEmJihuLmV4ZWN1dGUucGFnZUxvYWQ9bnVsbCksaSYmKG4ucHJlZmV0Y2gubWJveGVzPW51bGwpLGkmJiFvJiYobi5wcmVmZXRjaC52aWV3cz1udWxsKSxufWZ1bmN0aW9uICRjKGUpe3ZhciB0PVljKGUpLG49dC5yZXF1ZXN0LHI9dC5yZXNwb25zZSxpPSEwO3dlKG92LEhwKSxPZSh7c291cmNlOm92LHNlcnZlclN0YXRlOnR9KTt2YXIgYT1RYyhlLHIpO1hzKGEpLEtzKGEpLGphKHtyZXF1ZXN0Om4scmVzcG9uc2U6YX0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEtjKGUsaSl9KVsiY2F0Y2giXShYYyl9ZnVuY3Rpb24gSmMoKXtpZigheWUoKSlyZXR1cm4gSWUob3YsQmQpLHZvaWQgT2Uoe3NvdXJjZTpvdixlcnJvcjpCZH0pO3ZhciBlPW50KCk7aWYoR2MoZSkpJGMoZSk7ZWxzZXt2YXIgdD1lW0RwXSxuPWVbd3BdO2lmKCF0JiYhbilyZXR1cm4gd2Uob3YsenApLHZvaWQgT2Uoe3NvdXJjZTpvdixlcnJvcjp6cH0pO3VuKCk7dmFyIHI9e307aWYodCl7dmFyIGk9e3BhZ2VMb2FkOnt9fTtyLmV4ZWN1dGU9aX1pZihuKXt2YXIgYT17dmlld3M6W3t9XX07ci5wcmVmZXRjaD1hfXZhciBvPWVbR2ZdO3dlKG92LFZmLHIpLE9lKHtzb3VyY2U6b3YscmVxdWVzdDpyfSk7dmFyIHM9e3JlcXVlc3Q6cix0aW1lb3V0Om99O1hlKCkmJiFLZSgpPyRlKCkudGhlbihmdW5jdGlvbigpe1VhKHMpLnRoZW4oS2MpWyJjYXRjaCJdKFhjKX0pWyJjYXRjaCJdKFhjKTpVYShzKS50aGVuKEtjKVsiY2F0Y2giXShYYyl9fWZ1bmN0aW9uIFpjKCl7dmFyIGU9e307cmV0dXJuIGVba2ZdPSEwLGV9ZnVuY3Rpb24gZXUoZSl7dmFyIHQ9e307cmV0dXJuIHRba2ZdPSExLHRbX2ZdPWUsdH1mdW5jdGlvbiB0dShlKXtyZXR1cm4gUChlKT9ldShYZCk6ZS5sZW5ndGg+RWQ/ZXUoS2QpOlpjKCl9ZnVuY3Rpb24gbnUoZSl7aWYoIWQoZSkpcmV0dXJuIGV1KHFkKTt2YXIgdD10dShlW0RmXSk7cmV0dXJuIHRba2ZdP3UoZVtFZl0pP3UoZVtfZl0pP1pjKCk6ZXUoJGQpOmV1KFFkKTp0fWZ1bmN0aW9uIHJ1KGUpe2lmKCFkKGUpKXJldHVybiBldShxZCk7dmFyIHQ9ZS5yZXF1ZXN0O2lmKCFkKHQpKXJldHVybiBldSh6ZCk7dmFyIG49dC5leGVjdXRlLHI9dC5wcmVmZXRjaDtyZXR1cm4gZChuKXx8ZChyKT9aYygpOmV1KFdkKX1mdW5jdGlvbiBpdShlKXtpZighZChlKSlyZXR1cm4gZXUocWQpO3ZhciB0PWUucmVxdWVzdDtpZighZCh0KSlyZXR1cm4gZXUoemQpO3ZhciBuPXQuZXhlY3V0ZSxyPXQucHJlZmV0Y2gsaT10Lm5vdGlmaWNhdGlvbnM7cmV0dXJuIGQobil8fGQocik/ZXUoR2QpOm1sKGkpP1pjKCk6ZXUoWWQpfWZ1bmN0aW9uIGF1KGUpe2lmKCFkKGUpKXJldHVybiBldShxZCk7dmFyIHQ9dHUoZVtEZl0pO2lmKCF0W2tmXSlyZXR1cm4gdDt2YXIgbj1lW0FmXTtyZXR1cm4gbWwobik/WmMoKTpldShKZCl9ZnVuY3Rpb24gb3UoZSl7cmV0dXJuIGQoZSk/ZChlLnJlc3BvbnNlKT9aYygpOmV1KEhkKTpldShxZCl9ZnVuY3Rpb24gc3UoZSl7aWYoIWQoZSkpcmV0dXJuIGV1KHFkKTt2YXIgdD10dShlW0RmXSk7cmV0dXJuIHRba2ZdP1pjKCk6dH1mdW5jdGlvbiBjdShlKXtyZXR1cm57YWN0aW9uOmNkLHVybDplLmNvbnRlbnR9fWZ1bmN0aW9uIHV1KGUpe3ZhciB0PXt9O3JldHVybiB0LmFjdGlvbj0kbCx0LmNvbnRlbnQ9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBsdShlKXt2YXIgdD17fTtyZXR1cm4gdC5hY3Rpb249SmwsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gZHUoZSl7dmFyIHQ9e307cmV0dXJuIHQuYWN0aW9uPWdkLHQuY29udGVudD1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIGZ1KGUpe3ZhciB0PXt9O3JldHVybiB0LmFjdGlvbj1oZCx0LmNvbnRlbnQ9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBwdShlKXt2YXIgdD17fTtyZXR1cm4gdC5hY3Rpb249YmQsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gZ3UoZSl7dmFyIHQ9e307cmV0dXJuIHQuYWN0aW9uPWRkLHQuY29udGVudD1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIG11KGUpe3ZhciB0PXt9O3JldHVybiB0LmFjdGlvbj1mZCx0LmNvbnRlbnQ9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBodShlKXt2YXIgdD17fTtyZXR1cm4gdC5hY3Rpb249c2QsdC5jb250ZW50PWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24gdnUoZSl7dmFyIHQ9cChlLmNvbnRlbnQpWzBdLG49e307cmV0dXJuIG4uYWN0aW9uPWVkLG4uYXR0cmlidXRlPXQsbi52YWx1ZT1lLmNvbnRlbnRbdF0sbi5zZWxlY3Rvcj1lLnNlbGVjdG9yLG4uY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3RvcixufWZ1bmN0aW9uIGJ1KGUpe3ZhciB0PXt9O3JldHVybiB0LmFjdGlvbj1lZCx0LmF0dHJpYnV0ZT1UZCx0LnZhbHVlPWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24geXUoZSl7dmFyIHQ9e307cmV0dXJuIHQuYWN0aW9uPW5kLHQuc3R5bGU9ZS5jb250ZW50LHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBfdShlKXt2YXIgdD17fTtyZXR1cm4gdC5hY3Rpb249bmQsdC5zdHlsZT1lLmNvbnRlbnQsdC5zZWxlY3Rvcj1lLnNlbGVjdG9yLHQuY3NzU2VsZWN0b3I9ZS5jc3NTZWxlY3Rvcix0fWZ1bmN0aW9uIEN1KGUpe3ZhciB0PXt9O3JldHVybiB0LmFjdGlvbj1uZCx0LnN0eWxlPWUuY29udGVudCx0LnNlbGVjdG9yPWUuc2VsZWN0b3IsdC5jc3NTZWxlY3Rvcj1lLmNzc1NlbGVjdG9yLHR9ZnVuY3Rpb24geHUoZSl7dmFyIHQ9e307cmV0dXJuIHQuYWN0aW9uPW9kLHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBrdShlKXt2YXIgdD17fTtyZXR1cm4gdC5hY3Rpb249cmQsdC5mcm9tPWUuY29udGVudC5mcm9tLHQudG89ZS5jb250ZW50LnRvLHQuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0LmNzc1NlbGVjdG9yPWUuY3NzU2VsZWN0b3IsdH1mdW5jdGlvbiBFdShlKXt2YXIgdD1bXTtyZXR1cm4geShmdW5jdGlvbihlKXtzd2l0Y2goZS50eXBlKXtjYXNlIFFsOnQucHVzaCh1dShlKSk7YnJlYWs7Y2FzZSBKbDp0LnB1c2gobHUoZSkpO2JyZWFrO2Nhc2UgcGQ6dC5wdXNoKGR1KGUpKTticmVhaztjYXNlIG1kOnQucHVzaChmdShlKSk7YnJlYWs7Y2FzZSB2ZDp0LnB1c2gocHUoZSkpO2JyZWFrO2Nhc2UgZGQ6dC5wdXNoKGd1KGUpKTticmVhaztjYXNlIGZkOnQucHVzaChtdShlKSk7YnJlYWs7Y2FzZSBzZDp0LnB1c2goaHUoZSkpO2JyZWFrO2Nhc2UgZWQ6dC5wdXNoKHZ1KGUpKTticmVhaztjYXNlIHRkOnQucHVzaChidShlKSk7YnJlYWs7Y2FzZSBuZDp0LnB1c2goeXUoZSkpO2JyZWFrO2Nhc2UgaWQ6dC5wdXNoKF91KGUpKTticmVhaztjYXNlIGFkOnQucHVzaChDdShlKSk7YnJlYWs7Y2FzZSBvZDp0LnB1c2goeHUoZSkpO2JyZWFrO2Nhc2UgcmQ6dC5wdXNoKGt1KGUpKTticmVhaztjYXNlIGNkOnQucHVzaChjdShlKSl9fSxlKSx0fWZ1bmN0aW9uIEl1KGUpe2lmKFMoZSkpcmV0dXJuW107dmFyIHQ9W107cmV0dXJuIHkoZnVuY3Rpb24oZSl7ZS50eXBlPT09amQmJihyaChlKT90LnB1c2goe2FjdGlvbjp1ZCxzZWxlY3RvcjplLnNlbGVjdG9yLGNsaWNrVHJhY2tJZDplLmV2ZW50VG9rZW59KTp0LnB1c2goe2FjdGlvbjpsZCxjbGlja1RyYWNrSWQ6ZS5ldmVudFRva2VufSkpfSxlKSx0fWZ1bmN0aW9uIHd1KGUpe2lmKFMoZSkpcmV0dXJuW107dmFyIHQ9W10sbj1bXSxyPVtdLGk9ZS5vcHRpb25zLGE9dm9pZCAwPT09aT9bXTppLG89ZS5tZXRyaWNzLHM9dm9pZCAwPT09bz9bXTpvO3koZnVuY3Rpb24oZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBEZDp0LnB1c2goZS5jb250ZW50KTticmVhaztjYXNlIHdkOm4ucHVzaChlLmNvbnRlbnQpO2JyZWFrO2Nhc2UgY2Q6ci5wdXNoKGN1KGUpKTticmVhaztjYXNlIE9mOnIucHVzaC5hcHBseShyLEV1KGUuY29udGVudCkpfX0sYSksUyh0KXx8ci5wdXNoKHthY3Rpb246JGwsY29udGVudDp0LmpvaW4oIiIpfSksUyhuKXx8ci5wdXNoKHthY3Rpb246WmwsY29udGVudDpufSk7dmFyIGM9SXUocyk7cmV0dXJuIFMoYyl8fHIucHVzaC5hcHBseShyLGMpLHJ9ZnVuY3Rpb24gRHUoZSl7dmFyIHQ9ZS5leGVjdXRlLG49dm9pZCAwPT09dD97fTp0LHI9bi5wYWdlTG9hZCxpPXZvaWQgMD09PXI/e306cixhPW4ubWJveGVzLG89dm9pZCAwPT09YT9bXTphLHM9W107cmV0dXJuIHMucHVzaC5hcHBseShzLHd1KGkpKSxzLnB1c2guYXBwbHkocyx2KFIod3UsbykpKSxzfWZ1bmN0aW9uIEF1KGUsdCl7dmFyIG49RHUodCk7ZVtFZl0obil9ZnVuY3Rpb24gU3UoZSx0KXt2YXIgbj10W1RmXXx8eGY7ZVtfZl0obix0KX1mdW5jdGlvbiBUdSh0KXt2YXIgZT1udSh0KSxuPWVbX2ZdO2lmKCFlW2tmXSlyZXR1cm4gSWUoc3Ysbiksdm9pZCBPZSh7c291cmNlOnN2LG9wdGlvbnM6dCxlcnJvcjpufSk7aWYoIXllKCkpcmV0dXJuIG8odFtfZl0oQ2YsQmQpKSxJZShzdixCZCksdm9pZCBPZSh7c291cmNlOnN2LG9wdGlvbnM6dCxlcnJvcjpCZH0pO3ZhciByPWZ1bmN0aW9uIHIoZSl7cmV0dXJuIEF1KHQsZSl9LGk9ZnVuY3Rpb24gaShlKXtyZXR1cm4gU3UodCxlKX07d2Uoc3YsdCksT2Uoe3NvdXJjZTpzdixvcHRpb25zOnR9KSxYZSgpJiYhS2UoKT8kZSgpLnRoZW4oZnVuY3Rpb24oKXtCYSh0KS50aGVuKHIpWyJjYXRjaCJdKGkpfSk6QmEodCkudGhlbihyKVsiY2F0Y2giXShpKX1mdW5jdGlvbiBQdShlKXt2YXIgdD1ydShlKSxuPXRbX2ZdO3JldHVybiB0W2tmXT95ZSgpPyh3ZShjdixlKSxPZSh7c291cmNlOmN2LG9wdGlvbnM6ZX0pLCFYZSgpfHxLZSgpP1VhKGUpOiRlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBVYShlKX0pKTooSWUoY3YsQmQpLE9lKHtzb3VyY2U6Y3Ysb3B0aW9uczplLGVycm9yOkJkfSksQmUobmV3IEVycm9yKEJkKSkpOihJZShjdixuKSxPZSh7c291cmNlOmN2LG9wdGlvbnM6ZSxlcnJvcjpufSksQmUodCkpfWZ1bmN0aW9uIE91KGUpe3ZhciB0PXFjKGUuc2VsZWN0b3IpLG49YXUoZSkscj1uW19mXTtyZXR1cm4gbltrZl0/eWUoKT8oZS5zZWxlY3Rvcj10LHdlKHV2LGUpLE9lKHtzb3VyY2U6dXYsb3B0aW9uczplfSksdm9pZCBIYyhlKSk6KEllKHV2LEJkKSxPZSh7c291cmNlOnV2LG9wdGlvbnM6ZSxlcnJvcjpCZH0pLHZvaWQgemModCkpOihJZSh1dixlLHIpLE9lKHtzb3VyY2U6dXYsb3B0aW9uczplLGVycm9yOnJ9KSx2b2lkIHpjKHQpKX1mdW5jdGlvbiBqdShlKXt2YXIgdD1xYyhlLnNlbGVjdG9yKSxuPW91KGUpLHI9bltfZl07cmV0dXJuIG5ba2ZdP3llKCk/KGUuc2VsZWN0b3I9dCx3ZShsdixlKSxPZSh7c291cmNlOmx2LG9wdGlvbnM6ZX0pLFdjKGUpKTooSWUobHYsQmQpLE9lKHtzb3VyY2U6bHYsb3B0aW9uczplLGVycm9yOkJkfSksemModCksQmUobmV3IEVycm9yKEJkKSkpOihJZShsdixlLHIpLE9lKHtzb3VyY2U6bHYsb3B0aW9uczplLGVycm9yOnJ9KSx6Yyh0KSxCZShuKSl9ZnVuY3Rpb24gTHUoZSl7dmFyIHQ9bnQoKVtZZl0sbj1lLmNvbnN1bWVySWQscj12b2lkIDA9PT1uP3Q6bixpPWUucmVxdWVzdCxhPWl1KGUpLG89YVtfZl07aWYoIWFba2ZdKXJldHVybiBJZShkdixvKSx2b2lkIE9lKHtzb3VyY2U6ZHYsb3B0aW9uczplLGVycm9yOm99KTtpZigheWUoKSlyZXR1cm4gSWUoZHYsQmQpLHZvaWQgT2Uoe3NvdXJjZTpkdixvcHRpb25zOmUsZXJyb3I6QmR9KTt3ZShkdixlKSxPZSh7c291cmNlOmR2LG9wdGlvbnM6ZX0pO3ZhciBzPWRzKHIse30saS5ub3RpZmljYXRpb25zKTshWGUoKXx8S2UoKT9ocyhzKTpJZShkdixacCl9ZnVuY3Rpb24gTXUoZSx0KXt2YXIgbj10W0RmXSxyPWxsKHt9LHQpLGk9ZCh0LnBhcmFtcyk/dC5wYXJhbXM6e307cmV0dXJuIHJbUGZdPWxsKHt9LGlyKG4pLGkpLHJbR2ZdPXVpKGUsdFtHZl0pLHJbRWZdPXUodFtFZl0pP3RbRWZdOkYscltfZl09dSh0W19mXSk/dFtfZl06RixyfWZ1bmN0aW9uIFZ1KGUpe3ZhciB0PWVbTmxdLG49ZVtYbF07cmV0dXJuIGpsKHQpJiYoamwobil8fEwobikpfWZ1bmN0aW9uIFJ1KGUpe3ZhciB0PWUubWJveCxuPWQoZS5wYXJhbXMpP2UucGFyYW1zOnt9LHI9bGwoe30saXIodCksbiksaT1ScCxhPXBzKFpyKHt9LHIpLGksW10pO2lmKGEubWJveD17bmFtZTp0fSxocyhkcyh0LHIsW2FdKSkpcmV0dXJuIHdlKG1mLGUpLHZvaWQgZVtFZl0oKTtJZShoZixlKSxlW19mXSh4ZixoZil9ZnVuY3Rpb24gRnUoZSl7aWYoWGUoKSYmIUtlKCkpcmV0dXJuIEllKGhmLFpwKSx2b2lkIGVbX2ZdKF9mLFpwKTtSdShlKX1mdW5jdGlvbiBOdShlKXtyZXR1cm4gRnUoZSksIWUucHJldmVudERlZmF1bHR9ZnVuY3Rpb24gQnUoZSl7dmFyIHQ9ZVtYbF0sbj1lW05sXSxyPUEoRXQodCkpLGk9ZnVuY3Rpb24gaSgpe3JldHVybiBOdShlKX07eShmdW5jdGlvbihlKXtyZXR1cm4gZXMobixpLGUpfSxyKX1mdW5jdGlvbiBVdShlKXt2YXIgdD1zdShlKSxuPXRbX2ZdO2lmKCF0W2tmXSlyZXR1cm4gSWUoZnYsbiksdm9pZCBPZSh7c291cmNlOmZ2LG9wdGlvbnM6ZSxlcnJvcjpufSk7dmFyIHI9TXUobnQoKSxlKTtpZigheWUoKSlyZXR1cm4gSWUoZnYsQmQpLG8ocltfZl0oQ2YsQmQpKSx2b2lkIE9lKHtzb3VyY2U6ZnYsb3B0aW9uczplLGVycm9yOkJkfSk7d2UoZnYsciksT2Uoe3NvdXJjZTpmdixvcHRpb25zOnJ9KSxWdShyKT9CdShyKTpGdShyKX1mdW5jdGlvbiBxdShlKXtyZXR1cm4gUXMoZSksdGMoZSkudGhlbihPYykudGhlbihmdW5jdGlvbihlKXtTKGUpfHx2dCh7ZXhlY3V0aW9uOmV9KX0pWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe0llKEJwLGUpLGJ0KHtlcnJvcjplfSl9KX1mdW5jdGlvbiB6dSgpe2Zvcig7MDxndi5sZW5ndGg7KXt2YXIgZT1ndi5wb3AoKSx0PWNzKGUudmlld05hbWUsZSk7Zyh0KXx8cXUodCl9fWZ1bmN0aW9uIEh1KCl7aHY9bXYsenUoKX1mdW5jdGlvbiBXdSgpe3NjKGlnLEh1KSxzYyhhZyxIdSksc2Mob2csSHUpfWZ1bmN0aW9uIEd1KGUsdCl7dmFyIG49e307cmV0dXJuIG4udmlld05hbWU9ZSxuLmltcHJlc3Npb25JZD1IKCksbi5wYWdlPSEwLFModCl8fChuLnBhZ2U9ISF0LnBhZ2UpLG59ZnVuY3Rpb24gWXUoZSl7TXQoZSksZyhjcyhlLnZpZXdOYW1lLGUpKSYmZS5wYWdlJiZDcyhlKSxndi5wdXNoKGUpLGh2PT09bXYmJnp1KCl9ZnVuY3Rpb24gWHUoZSx0KXtpZighQyhlKXx8UChlKSlyZXR1cm4gSWUocHYscXAsZSksdm9pZCBPZSh7c291cmNlOnB2LHZpZXc6ZSxlcnJvcjpxcH0pO3ZhciBuPWUudG9Mb3dlckNhc2UoKSxyPUd1KG4sdCk7d2UocHYsbixyKSxPZSh7c291cmNlOnB2LHZpZXc6bixvcHRpb25zOnJ9KSxZdShyKX1mdW5jdGlvbiBLdSgpe0llKGJ2LGFyZ3VtZW50cyl9ZnVuY3Rpb24gUXUoKXtJZSh5dixhcmd1bWVudHMpfWZ1bmN0aW9uICR1KCl7SWUoX3YsYXJndW1lbnRzKX1mdW5jdGlvbiBKdSgpe0llKEN2LGFyZ3VtZW50cyl9ZnVuY3Rpb24gWnUoZSl7dmFyIHQ9ZnVuY3Rpb24gdCgpe30sbj1mdW5jdGlvbiBuKCl7cmV0dXJuIE5lKCl9O2UuYWRvYmU9ZS5hZG9iZXx8e30sZS5hZG9iZS50YXJnZXQ9e1ZFUlNJT046IiIsZXZlbnQ6e30sZ2V0T2ZmZXI6dCxnZXRPZmZlcnM6bixhcHBseU9mZmVyOnQsYXBwbHlPZmZlcnM6bixzZW5kTm90aWZpY2F0aW9uczp0LHRyYWNrRXZlbnQ6dCx0cmlnZ2VyVmlldzp0LHJlZ2lzdGVyRXh0ZW5zaW9uOnQsaW5pdDp0fSxlLm1ib3hDcmVhdGU9dCxlLm1ib3hEZWZpbmU9dCxlLm1ib3hVcGRhdGU9dH1mdW5jdGlvbiBlbChlLHQsbil7aWYoZS5hZG9iZSYmZS5hZG9iZS50YXJnZXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5hZG9iZS50YXJnZXQuZ2V0T2ZmZXIpSWUoVWQpO2Vsc2V7JChuKTt2YXIgcj1udCgpLGk9cltLZl07aWYoZS5hZG9iZT1lLmFkb2JlfHx7fSxlLmFkb2JlLnRhcmdldD1lLmFkb2JlLnRhcmdldHx8e30sZS5hZG9iZS50YXJnZXQuVkVSU0lPTj1pLGUuYWRvYmUudGFyZ2V0LmV2ZW50PXtMSUJSQVJZX0xPQURFRDpBZyxSRVFVRVNUX1NUQVJUOlNnLFJFUVVFU1RfU1VDQ0VFREVEOlRnLFJFUVVFU1RfRkFJTEVEOlBnLENPTlRFTlRfUkVOREVSSU5HX1NUQVJUOk9nLENPTlRFTlRfUkVOREVSSU5HX1NVQ0NFRURFRDpqZyxDT05URU5UX1JFTkRFUklOR19GQUlMRUQ6TGcsQ09OVEVOVF9SRU5ERVJJTkdfTk9fT0ZGRVJTOk1nLENPTlRFTlRfUkVOREVSSU5HX1JFRElSRUNUOlZnfSwhcltxZl0pcmV0dXJuIFp1KGUpLHZvaWQgSWUoQmQpO1RlKCksUnQoKSxXdChlKSxlLmFkb2JlLnRhcmdldC5nZXRPZmZlcj1UdSxlLmFkb2JlLnRhcmdldC5nZXRPZmZlcnM9UHUsZS5hZG9iZS50YXJnZXQuYXBwbHlPZmZlcj1PdSxlLmFkb2JlLnRhcmdldC5hcHBseU9mZmVycz1qdSxlLmFkb2JlLnRhcmdldC5zZW5kTm90aWZpY2F0aW9ucz1MdSxlLmFkb2JlLnRhcmdldC50cmFja0V2ZW50PVV1LGUuYWRvYmUudGFyZ2V0LnRyaWdnZXJWaWV3PVh1LGUuYWRvYmUudGFyZ2V0LnJlZ2lzdGVyRXh0ZW5zaW9uPUt1LGUubWJveENyZWF0ZT1RdSxlLm1ib3hEZWZpbmU9JHUsZS5tYm94VXBkYXRlPUp1LGZ0KCl9fXZhciB0bCxubCxybCxpbCxhbCxvbCxzbCxjbD1uKCJAYWRvYmUvcmVhY3Rvci13aW5kb3ciKSx1bD1uKCJAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCIpLGxsPXIobigiQGFkb2JlL3JlYWN0b3Itb2JqZWN0LWFzc2lnbiIpKSxkbD1yKG4oIkBhZG9iZS9yZWFjdG9yLWNvb2tpZSIpKSxmbD1yKG4oIkBhZG9iZS9yZWFjdG9yLXF1ZXJ5LXN0cmluZyIpKSxwbD1yKG4oIkBhZG9iZS9yZWFjdG9yLXByb21pc2UiKSksZ2w9cihuKCJAYWRvYmUvcmVhY3Rvci1sb2FkLXNjcmlwdCIpKSxtbD1BcnJheS5pc0FycmF5LGhsPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsdmw9IltvYmplY3QgRnVuY3Rpb25dIixibD1mdW5jdGlvbiBibChlLHQpe3JldHVybiB0LmZvckVhY2goZSl9LHlsPWZ1bmN0aW9uIHlsKHQsbil7YmwoZnVuY3Rpb24oZSl7cmV0dXJuIHQobltlXSxlKX0scChuKSl9LF9sPWZ1bmN0aW9uIF9sKGUsdCl7cmV0dXJuIHQuZmlsdGVyKGUpfSxDbD1mdW5jdGlvbiBDbChuLGUpe3ZhciByPXt9O3JldHVybiB5bChmdW5jdGlvbihlLHQpe24oZSx0KSYmKHJbdF09ZSl9LGUpLHJ9LHhsPSJbb2JqZWN0IFN0cmluZ10iLGtsPTkwMDcxOTkyNTQ3NDA5OTEsRWw9ZnVuY3Rpb24gRWwoZSx0KXtyZXR1cm4gdC5tYXAoZSl9LElsPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksd2w9U3RyaW5nLnByb3RvdHlwZS50cmltLERsPSJbb2JqZWN0IE9iamVjdF0iLEFsPUZ1bmN0aW9uLnByb3RvdHlwZSxTbD1PYmplY3QucHJvdG90eXBlLFRsPUFsLnRvU3RyaW5nLFBsPVNsLmhhc093blByb3BlcnR5LE9sPVRsLmNhbGwoT2JqZWN0KSxqbD1mdW5jdGlvbiBqbChlKXtyZXR1cm4hUChlKX0sTGw9IltvYmplY3QgTnVtYmVyXSIsTWw9ZnVuY3Rpb24gTWwobixlKXt2YXIgcj17fTtyZXR1cm4geWwoZnVuY3Rpb24oZSx0KXtyW3RdPW4oZSx0KX0sZSkscn0sVmw9ZnVuY3Rpb24gVmwoZSx0LG4pe3JldHVybiBuLnJlZHVjZShlLHQpfSxSbD1mdW5jdGlvbiBSbChuLGUsdCl7dmFyIHI9ZTtyZXR1cm4geWwoZnVuY3Rpb24oZSx0KXtyPW4ocixlLHQpfSx0KSxyfSxGbD1BcnJheS5wcm90b3R5cGUucmV2ZXJzZSxObD0idHlwZSIsQmw9ImNvbnRlbnQiLFVsPSJoZWlnaHQiLHFsPSJ3aWR0aCIsemw9ImxlZnQiLEhsPSJ0b3AiLFdsPSJmcm9tIixHbD0idG8iLFlsPSJwcmlvcml0eSIsWGw9InNlbGVjdG9yIixLbD0iY3NzU2VsZWN0b3IiLFFsPSJzZXRIdG1sIiwkbD0ic2V0Q29udGVudCIsSmw9InNldFRleHQiLFpsPSJzZXRKc29uIixlZD0ic2V0QXR0cmlidXRlIix0ZD0ic2V0SW1hZ2VTb3VyY2UiLG5kPSJzZXRTdHlsZSIscmQ9InJlYXJyYW5nZSIsaWQ9InJlc2l6ZSIsYWQ9Im1vdmUiLG9kPSJyZW1vdmUiLHNkPSJjdXN0b21Db2RlIixjZD0icmVkaXJlY3QiLHVkPSJ0cmFja0NsaWNrIixsZD0ic2lnbmFsQ2xpY2siLGRkPSJpbnNlcnRCZWZvcmUiLGZkPSJpbnNlcnRBZnRlciIscGQ9ImFwcGVuZEh0bWwiLGdkPSJhcHBlbmRDb250ZW50IixtZD0icHJlcGVuZEh0bWwiLGhkPSJwcmVwZW5kQ29udGVudCIsdmQ9InJlcGxhY2VIdG1sIixiZD0icmVwbGFjZUNvbnRlbnQiLHlkPSJtYm94RGVidWciLF9kPSJtYm94RGlzYWJsZSIsQ2Q9Im1ib3hFZGl0Iix4ZD0iYXRfY2hlY2siLGtkPSJ0cnVlIixFZD0yNTAsSWQ9ImRhdGEtYXQtc3JjIix3ZD0ianNvbiIsRGQ9Imh0bWwiLEFkPSJkeW5hbWljIixTZD0ic2NyaXB0IixUZD0ic3JjIixQZD0iaWQiLE9kPSJjbGFzcyIsamQ9ImNsaWNrIixMZD0iaGVhZCIsTWQ9InNjcmlwdCIsVmQ9InN0eWxlIixSZD0ibGluayIsRmQ9ImltZyIsTmQ9ImRpdiIsQmQ9J0Fkb2JlIFRhcmdldCBjb250ZW50IGRlbGl2ZXJ5IGlzIGRpc2FibGVkLiBFbnN1cmUgdGhhdCB5b3UgY2FuIHNhdmUgY29va2llcyB0byB5b3VyIGN1cnJlbnQgZG9tYWluLCB0aGVyZSBpcyBubyAibWJveERpc2FibGUiIGNvb2tpZSBhbmQgdGhlcmUgaXMgbm8gIm1ib3hEaXNhYmxlIiBwYXJhbWV0ZXIgaW4gcXVlcnkgc3RyaW5nLicsVWQ9IkFkb2JlIFRhcmdldCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiIscWQ9Im9wdGlvbnMgYXJndW1lbnQgaXMgcmVxdWlyZWQiLHpkPSJyZXF1ZXN0IG9wdGlvbiBpcyByZXF1aXJlZCIsSGQ9InJlc3BvbnNlIG9wdGlvbiBpcyByZXF1aXJlZCIsV2Q9ImV4ZWN1dGUgb3IgcHJlZmV0Y2ggaXMgcmVxdWlyZWQiLEdkPSJleGVjdXRlIG9yIHByZWZldGNoIGlzIG5vdCBhbGxvd2VkIixZZD0ibm90aWZpY2F0aW9ucyBhcmUgcmVxdWlyZWQiLFhkPSJtYm94IG9wdGlvbiBpcyByZXF1aXJlZCIsS2Q9Im1ib3ggb3B0aW9uIGlzIHRvbyBsb25nIixRZD0ic3VjY2VzcyBvcHRpb24gaXMgcmVxdWlyZWQiLCRkPSJlcnJvciBvcHRpb24gaXMgcmVxdWlyZWQiLEpkPSJvZmZlciBvcHRpb24gaXMgcmVxdWlyZWQiLFpkPSJVbmV4cGVjdGVkIGVycm9yIixlZj0icmVxdWVzdCBmYWlsZWQiLHRmPSJyZXF1ZXN0IHN1Y2NlZWRlZCIsbmY9IkFjdGlvbiByZW5kZXJlZCBzdWNjZXNzZnVsbHkiLHJmPSJSZW5kZXJpbmcgYWN0aW9uIixhZj0iQWN0aW9uIGhhcyBubyBjb250ZW50IixvZj0iQWN0aW9uIGhhcyBubyBhdHRyaWJ1dGVzIixzZj0iQWN0aW9uIGhhcyBubyBDU1MgcHJvcGVydGllcyIsY2Y9IkFjdGlvbiBoYXMgbm8gaGVpZ2h0IG9yIHdpZHRoIix1Zj0iQWN0aW9uIGhhcyBubyBsZWZ0LCB0b3Agb3IgcG9zaXRpb24iLGxmPSJBY3Rpb24gaGFzIG5vIGZyb20gb3IgdG8iLGRmPSJBY3Rpb24gaGFzIG5vIHVybCIsZmY9IkFjdGlvbiBoYXMgbm8gaW1hZ2UgdXJsIixwZj0iUmVhcnJhbmdlIGVsZW1lbnRzIGFyZSBtaXNzaW5nIixnZj0iTG9hZGluZyBpbWFnZSIsbWY9IlRyYWNrIGV2ZW50IHJlcXVlc3Qgc3VjY2VlZGVkIixoZj0iVHJhY2sgZXZlbnQgcmVxdWVzdCBmYWlsZWQiLHZmPSJObyBhY3Rpb25zIHRvIGJlIHJlbmRlcmVkIixiZj0iUmVkaXJlY3QgYWN0aW9uIix5Zj0iU2NyaXB0IGxvYWQiLF9mPSJlcnJvciIsQ2Y9Indhcm5pbmciLHhmPSJ1bmtub3duIixrZj0idmFsaWQiLEVmPSJzdWNjZXNzIixJZj0icmVuZGVyIix3Zj0ibWV0cmljIixEZj0ibWJveCIsQWY9Im9mZmVyIixTZj0ibmFtZSIsVGY9InN0YXR1cyIsUGY9InBhcmFtcyIsT2Y9ImFjdGlvbnMiLGpmPSJyZXNwb25zZVRva2VucyIsTGY9ImRhdGEiLE1mPSJyZXNwb25zZSIsVmY9InJlcXVlc3QiLFJmPSJwcm92aWRlciIsRmY9InBhZ2VMb2FkIixOZj0iYXQtZmxpY2tlci1jb250cm9sIixCZj0iYXQtZWxlbWVudC1tYXJrZXIiLFVmPSJhdC1lbGVtZW50LWNsaWNrLXRyYWNraW5nIixxZj0iZW5hYmxlZCIsemY9ImNsaWVudENvZGUiLEhmPSJpbXNPcmdJZCIsV2Y9InNlcnZlckRvbWFpbiIsR2Y9InRpbWVvdXQiLFlmPSJnbG9iYWxNYm94TmFtZSIsWGY9Imdsb2JhbE1ib3hBdXRvQ3JlYXRlIixLZj0idmVyc2lvbiIsUWY9ImRlZmF1bHRDb250ZW50SGlkZGVuU3R5bGUiLCRmPSJib2R5SGlkZGVuU3R5bGUiLEpmPSJib2R5SGlkaW5nRW5hYmxlZCIsWmY9ImRldmljZUlkTGlmZXRpbWUiLGVwPSJzZXNzaW9uSWRMaWZldGltZSIsdHA9InNlbGVjdG9yc1BvbGxpbmdUaW1lb3V0IixucD0idmlzaXRvckFwaVRpbWVvdXQiLHJwPSJvdmVycmlkZU1ib3hFZGdlU2VydmVyIixpcD0ib3ZlcnJpZGVNYm94RWRnZVNlcnZlclRpbWVvdXQiLGFwPSJvcHRvdXRFbmFibGVkIixvcD0ic2VjdXJlT25seSIsc3A9InN1cHBsZW1lbnRhbERhdGFJZFBhcmFtVGltZW91dCIsY3A9ImF1dGhvcmluZ1NjcmlwdFVybCIsdXA9InNjaGVtZSIsbHA9ImNvb2tpZURvbWFpbiIsZHA9Im1ib3hQYXJhbXMiLGZwPSJnbG9iYWxNYm94UGFyYW1zIixwcD0ibWJveFNlc3Npb24iLGdwPSJQQyIsbXA9Im1ib3hFZGdlQ2x1c3RlciIsaHA9InNlc3Npb24iLHZwPSJUcmFjZXMiLGJwPSJzZXR0aW5ncyIseXA9ImNsaWVudCIrdnAsX3A9InNlcnZlciIrdnAsQ3A9Il9fX3RhcmdldF90cmFjZXMiLHhwPSJ0YXJnZXRHbG9iYWxTZXR0aW5ncyIsa3A9ImRhdGFQcm92aWRlciIsRXA9a3ArInMiLElwPSJlbmRwb2ludCIsd3A9InZpZXdzRW5hYmxlZCIsRHA9InBhZ2VMb2FkRW5hYmxlZCIsQXA9ImF1dGhTdGF0ZSIsU3A9ImF1dGhlbnRpY2F0ZWRTdGF0ZSIsVHA9ImludGVncmF0aW9uQ29kZSIsUHA9InBhZ2UiLE9wPSJ2aWV3IixqcD0idmlld3MiLExwPSJvcHRpb25zIixNcD0ibWV0cmljcyIsVnA9InZpZXdOYW1lIixScD0iZGlzcGxheSIsRnA9IkNvbnRlbnQtVHlwZSIsTnA9InRleHQvcGxhaW4iLEJwPSJWaWV3IHJlbmRlcmluZyBmYWlsZWQiLFVwPSJWaWV3IGRlbGl2ZXJ5IGVycm9yIixxcD0iVmlldyBuYW1lIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciLHpwPSJQYWdlIGxvYWQgZGlzYWJsZWQiLEhwPSJVc2luZyBzZXJ2ZXIgc3RhdGUiLFdwPSJhZG9iZSIsR3A9Im9wdEluIixZcD0iaXNBcHByb3ZlZCIsWHA9ImZldGNoUGVybWlzc2lvbnMiLEtwPSJDYXRlZ29yaWVzIixRcD0iVEFSR0VUIiwkcD0iQU5BTFlUSUNTIixKcD0ib3B0aW5FbmFibGVkIixacD0iQWRvYmUgVGFyZ2V0IGlzIG5vdCBvcHRlZCBpbiIsZWc9ImFuYWx5dGljc0xvZ2dpbmciLHRnPSJzZXJ2ZXJTdGF0ZSIsbmc9ImNzcFNjcmlwdE5vbmNlIixyZz0iY3NwU3R5bGVOb25jZSIsaWc9ImNhY2hlLXVwZGF0ZWQtZXZlbnQiLGFnPSJuby1vZmZlcnMtZXZlbnQiLG9nPSJyZWRpcmVjdC1vZmZlci1ldmVudCIsc2c9ImZpbGU6IixjZz0vXig/ITApKD8hLipcLiQpKCgxP1xkP1xkfDI1WzAtNV18MlswLTRdXGQpKFwufCQpKXs0fSQvLHVnPS9eKGNvbXxlZHV8Z292fG5ldHxtaWx8b3JnfG5vbXxjb3xuYW1lfGluZm98Yml6KSQvaSxsZz17fSxkZz1bcWYsemYsSGYsV2YsbHAsR2YsZHAsZnAsUWYsImRlZmF1bHRDb250ZW50VmlzaWJsZVN0eWxlIixaZiwkZixKZix0cCxucCxycCxpcCxhcCxKcCxvcCxzcCxjcCwidXJsU2l6ZUxpbWl0IixJcCxEcCx3cCxlZyx0ZyxuZyxyZyxZZl0sZmc9ZnVuY3Rpb24ga3YoZSx0KXt0PXR8fHt9O2Zvcih2YXIgcj17a2V5Olsic291cmNlIiwicHJvdG9jb2wiLCJhdXRob3JpdHkiLCJ1c2VySW5mbyIsInVzZXIiLCJwYXNzd29yZCIsImhvc3QiLCJwb3J0IiwicmVsYXRpdmUiLCJwYXRoIiwiZGlyZWN0b3J5IiwiZmlsZSIsInF1ZXJ5IiwiYW5jaG9yIl0scTp7bmFtZToicXVlcnlLZXkiLHBhcnNlcjovKD86XnwmKShbXiY9XSopPT8oW14mXSopL2d9LHBhcnNlcjp7c3RyaWN0Oi9eKD86KFteOlwvPyNdKyk6KT8oPzpcL1wvKCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSk/KCgoKD86W14/I1wvXSpcLykqKShbXj8jXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLGxvb3NlOi9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvfX0sbj1yLnBhcnNlclt0LnN0cmljdE1vZGU/InN0cmljdCI6Imxvb3NlIl0uZXhlYyhlKSxpPXt9LGE9MTQ7YS0tOylpW3Iua2V5W2FdXT1uW2FdfHwiIjtyZXR1cm4gaVtyLnEubmFtZV09e30saVtyLmtleVsxMl1dLnJlcGxhY2Uoci5xLnBhcnNlcixmdW5jdGlvbihlLHQsbil7dCYmKGlbci5xLm5hbWVdW3RdPW4pfSksaX0scGc9ZmwucGFyc2UsZ2c9Zmwuc3RyaW5naWZ5LG1nPXVsLmNyZWF0ZUVsZW1lbnQoImEiKSxoZz17fSx2Zz1kbC5nZXQsYmc9ZGwuc2V0LHlnPWRsLnJlbW92ZSxfZz0ibWJveCIsQ2c9IkFUOiIseGc9IjEiLGtnPSh0bD13aW5kb3csZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihlKXtyZXR1cm4gZS5femlkfHwoZS5femlkPXQrKyl9ZnVuY3Rpb24gbyhlLHQsbixyKXtpZigodD1wKHQpKS5ucyl2YXIgaT1hKHQubnMpO3JldHVybihrW2YoZSldfHxbXSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlJiYoIXQuZXx8ZS5lPT10LmUpJiYoIXQubnN8fGkudGVzdChlLm5zKSkmJighbnx8ZihlLmZuKT09PWYobikpJiYoIXJ8fGUuc2VsPT1yKX0pfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9KCIiK2UpLnNwbGl0KCIuIik7cmV0dXJue2U6dFswXSxuczp0LnNsaWNlKDEpLnNvcnQoKS5qb2luKCIgIil9fWZ1bmN0aW9uIGEoZSl7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58ICkiK2UucmVwbGFjZSgiICIsIiAuKiA/IikrIig/OiB8JCkiKX1mdW5jdGlvbiBnKGUsdCl7cmV0dXJuIGUuZGVsJiYhbiYmZS5lIGluIHJ8fCEhdH1mdW5jdGlvbiBtKGUpe3JldHVybiBFW2VdfHxuJiZyW2VdfHxlfWZ1bmN0aW9uIGgoYSxlLHQsbyxzLGMsdSl7dmFyIG49ZihhKSxsPWtbbl18fChrW25dPVtdKTtlLnNwbGl0KC9ccy8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoInJlYWR5Ij09ZSlyZXR1cm4gZChkb2N1bWVudCkucmVhZHkodCk7dmFyIG49cChlKTtuLmZuPXQsbi5zZWw9cyxuLmUgaW4gRSYmKHQ9ZnVuY3Rpb24gaShlKXt2YXIgdD1lLnJlbGF0ZWRUYXJnZXQ7aWYoIXR8fHQhPT10aGlzJiYhZC5jb250YWlucyh0aGlzLHQpKXJldHVybiBuLmZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pO3ZhciByPShuLmRlbD1jKXx8dDtuLnByb3h5PWZ1bmN0aW9uKGUpe2lmKCEoZT1iKGUpKS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXtlLmRhdGE9bzt2YXIgdD1yLmFwcGx5KGEsZS5fYXJncz09Xz9bZV06W2VdLmNvbmNhdChlLl9hcmdzKSk7cmV0dXJuITE9PT10JiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLHR9fSxuLmk9bC5sZW5ndGgsbC5wdXNoKG4pLCJhZGRFdmVudExpc3RlbmVyImluIGEmJmEuYWRkRXZlbnRMaXN0ZW5lcihtKG4uZSksbi5wcm94eSxnKG4sdSkpfSl9ZnVuY3Rpb24gdih0LGUsbixyLGkpe3ZhciBhPWYodCk7KGV8fCIiKS5zcGxpdCgvXHMvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe28odCxlLG4scikuZm9yRWFjaChmdW5jdGlvbihlKXtkZWxldGUga1thXVtlLmldLCJyZW1vdmVFdmVudExpc3RlbmVyImluIHQmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihtKGUuZSksZS5wcm94eSxnKGUsaSkpfSl9KX1mdW5jdGlvbiBiKHIsaSl7aWYoaXx8IXIuaXNEZWZhdWx0UHJldmVudGVkKXtpfHwoaT1yKSxkLmVhY2gobCxmdW5jdGlvbihlLHQpe3ZhciBuPWlbZV07cltlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdPWMsbiYmbi5hcHBseShpLGFyZ3VtZW50cyl9LHJbdF09SX0pO3RyeXtyLnRpbWVTdGFtcHx8KHIudGltZVN0YW1wPShuZXcgRGF0ZSkuZ2V0VGltZSgpKX1jYXRjaChlKXt9KGkuZGVmYXVsdFByZXZlbnRlZCE9PV8/aS5kZWZhdWx0UHJldmVudGVkOiJyZXR1cm5WYWx1ZSJpbiBpPyExPT09aS5yZXR1cm5WYWx1ZTppLmdldFByZXZlbnREZWZhdWx0JiZpLmdldFByZXZlbnREZWZhdWx0KCkpJiYoci5pc0RlZmF1bHRQcmV2ZW50ZWQ9Yyl9cmV0dXJuIHJ9ZnVuY3Rpb24geShlKXt2YXIgdCxuPXtvcmlnaW5hbEV2ZW50OmV9O2Zvcih0IGluIGUpdS50ZXN0KHQpfHxlW3RdPT09X3x8KG5bdF09ZVt0XSk7cmV0dXJuIGIobixlKX12YXIgXyx0PTEsQz1BcnJheS5wcm90b3R5cGUuc2xpY2UsaT1kLmlzRnVuY3Rpb24seD1mdW5jdGlvbiB4KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saz17fSxzPXt9LG49Im9uZm9jdXNpbiJpbiB0bCxyPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxFPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07cy5jbGljaz1zLm1vdXNlZG93bj1zLm1vdXNldXA9cy5tb3VzZW1vdmU9Ik1vdXNlRXZlbnRzIixkLmV2ZW50PXthZGQ6aCxyZW1vdmU6dn0sZC5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuPTIgaW4gYXJndW1lbnRzJiZDLmNhbGwoYXJndW1lbnRzLDIpO2lmKGkoZSkpe3ZhciByPWZ1bmN0aW9uIHIoKXtyZXR1cm4gZS5hcHBseSh0LG4/bi5jb25jYXQoQy5jYWxsKGFyZ3VtZW50cykpOmFyZ3VtZW50cyl9O3JldHVybiByLl96aWQ9ZihlKSxyfWlmKHgodCkpcmV0dXJuIG4/KG4udW5zaGlmdChlW3RdLGUpLGQucHJveHkuYXBwbHkobnVsbCxuKSk6ZC5wcm94eShlW3RdLGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoImV4cGVjdGVkIGZ1bmN0aW9uIil9LGQuZm4uYmluZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSx0LG4pfSxkLmZuLnVuYmluZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLHQpfSxkLmZuLm9uZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyLDEpfTt2YXIgYz1mdW5jdGlvbiBjKCl7cmV0dXJuITB9LEk9ZnVuY3Rpb24gSSgpe3JldHVybiExfSx1PS9eKFtBLVpdfHJldHVyblZhbHVlJHxsYXllcltYWV0kfHdlYmtpdE1vdmVtZW50W1hZXSQpLyxsPXtwcmV2ZW50RGVmYXVsdDoiaXNEZWZhdWx0UHJldmVudGVkIixzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ImlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkIixzdG9wUHJvcGFnYXRpb246ImlzUHJvcGFnYXRpb25TdG9wcGVkIn07ZC5mbi5kZWxlZ2F0ZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24odCxlLG4pfSxkLmZuLnVuZGVsZWdhdGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9mZih0LGUsbil9LGQuZm4ubGl2ZT1mdW5jdGlvbihlLHQpe3JldHVybiBkKGRvY3VtZW50LmJvZHkpLmRlbGVnYXRlKHRoaXMuc2VsZWN0b3IsZSx0KSx0aGlzfSxkLmZuLmRpZT1mdW5jdGlvbihlLHQpe3JldHVybiBkKGRvY3VtZW50LmJvZHkpLnVuZGVsZWdhdGUodGhpcy5zZWxlY3RvcixlLHQpLHRoaXN9LGQuZm4ub249ZnVuY3Rpb24obixhLG8scyxjKXt2YXIgdSxsLHI9dGhpcztyZXR1cm4gbiYmIXgobik/KGQuZWFjaChuLGZ1bmN0aW9uKGUsdCl7ci5vbihlLGEsbyx0LGMpfSkscik6KHgoYSl8fGkocyl8fCExPT09c3x8KHM9byxvPWEsYT1fKSxzIT09XyYmITEhPT1vfHwocz1vLG89XyksITE9PT1zJiYocz1JKSxyLmVhY2goZnVuY3Rpb24oZSxyKXtjJiYodT1mdW5jdGlvbiB0KGUpe3JldHVybiB2KHIsZS50eXBlLHMpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYSYmKGw9ZnVuY3Rpb24gaShlKXt2YXIgdCxuPWQoZS50YXJnZXQpLmNsb3Nlc3QoYSxyKS5nZXQoMCk7aWYobiYmbiE9PXIpcmV0dXJuIHQ9ZC5leHRlbmQoeShlKSx7Y3VycmVudFRhcmdldDpuLGxpdmVGaXJlZDpyfSksKHV8fHMpLmFwcGx5KG4sW3RdLmNvbmNhdChDLmNhbGwoYXJndW1lbnRzLDEpKSl9KSxoKHIsbixzLG8sYSxsfHx1KX0pKX0sZC5mbi5vZmY9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPXRoaXM7cmV0dXJuIGUmJiF4KGUpPyhkLmVhY2goZSxmdW5jdGlvbihlLHQpe3Iub2ZmKGUsbix0KX0pLHIpOih4KG4pfHxpKHQpfHwhMT09PXR8fCh0PW4sbj1fKSwhMT09PXQmJih0PUkpLHIuZWFjaChmdW5jdGlvbigpe3YodGhpcyxlLHQsbil9KSl9LGQuZm4udHJpZ2dlcj1mdW5jdGlvbihlLHQpe3JldHVybihlPXgoZSl8fGQuaXNQbGFpbk9iamVjdChlKT9kLkV2ZW50KGUpOmIoZSkpLl9hcmdzPXQsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZS50eXBlIGluIHImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzW2UudHlwZV0/dGhpc1tlLnR5cGVdKCk6ImRpc3BhdGNoRXZlbnQiaW4gdGhpcz90aGlzLmRpc3BhdGNoRXZlbnQoZSk6ZCh0aGlzKS50cmlnZ2VySGFuZGxlcihlLHQpfSl9LGQuZm4udHJpZ2dlckhhbmRsZXI9ZnVuY3Rpb24obixyKXt2YXIgaSxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSx0KXsoaT15KHgobik/ZC5FdmVudChuKTpuKSkuX2FyZ3M9cixpLnRhcmdldD10LGQuZWFjaChvKHQsbi50eXBlfHxuKSxmdW5jdGlvbihlLHQpe2lmKGE9dC5wcm94eShpKSxpLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpcmV0dXJuITF9KX0pLGF9LCJmb2N1c2luIGZvY3Vzb3V0IGZvY3VzIGJsdXIgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtkLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiAwIGluIGFyZ3VtZW50cz90aGlzLmJpbmQodCxlKTp0aGlzLnRyaWdnZXIodCl9fSksZC5FdmVudD1mdW5jdGlvbihlLHQpe3goZSl8fChlPSh0PWUpLnR5cGUpO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KHNbZV18fCJFdmVudHMiKSxyPSEwO2lmKHQpZm9yKHZhciBpIGluIHQpImJ1YmJsZXMiPT1pP3I9ISF0W2ldOm5baV09dFtpXTtyZXR1cm4gbi5pbml0RXZlbnQoZSxyLCEwKSxiKG4pfX0oc2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKGUpe3JldHVybiBudWxsPT1lP1N0cmluZyhlKTpLW1EuY2FsbChlKV18fCJvYmplY3QifWZ1bmN0aW9uIHMoZSl7cmV0dXJuImZ1bmN0aW9uIj09byhlKX1mdW5jdGlvbiBhKGUpe3JldHVybiBudWxsIT1lJiZlPT1lLndpbmRvd31mdW5jdGlvbiBjKGUpe3JldHVybiBudWxsIT1lJiZlLm5vZGVUeXBlPT1lLkRPQ1VNRU5UX05PREV9ZnVuY3Rpb24gcihlKXtyZXR1cm4ib2JqZWN0Ij09byhlKX1mdW5jdGlvbiB1KGUpe3JldHVybiByKGUpJiYhYShlKSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIGwoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dy50eXBlKGUpO3JldHVybiJmdW5jdGlvbiIhPW4mJiFhKGUpJiYoImFycmF5Ij09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gTy5jYWxsKGUsZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWV9KX1mdW5jdGlvbiBkKGUpe3JldHVybiAwPGUubGVuZ3RoP3cuZm4uY29uY2F0LmFwcGx5KFtdLGUpOmV9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZS5yZXBsYWNlKC86Oi9nLCIvIikucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywiJDFfJDIiKS5yZXBsYWNlKC8oW2EtelxkXSkoW0EtWl0pL2csIiQxXyQyIikucmVwbGFjZSgvXy9nLCItIikudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBuKGUpe3JldHVybiBlIGluIHQ/dFtlXTp0W2VdPW5ldyBSZWdFeHAoIihefFxccykiK2UrIihcXHN8JCkiKX1mdW5jdGlvbiBwKGUsdCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0fHxWW2YoZSldP3Q6dCsicHgifWZ1bmN0aW9uIGUoZSl7dmFyIHQsbjtyZXR1cm4gTVtlXXx8KHQ9TC5jcmVhdGVFbGVtZW50KGUpLEwuYm9keS5hcHBlbmRDaGlsZCh0KSxuPWdldENvbXB1dGVkU3R5bGUodCwiIikuZ2V0UHJvcGVydHlWYWx1ZSgiZGlzcGxheSIpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSwibm9uZSI9PW4mJihuPSJibG9jayIpLE1bZV09biksTVtlXX1mdW5jdGlvbiBnKGUpe3JldHVybiJjaGlsZHJlbiJpbiBlP2ouY2FsbChlLmNoaWxkcmVuKTp3Lm1hcChlLmNoaWxkTm9kZXMsZnVuY3Rpb24oZSl7aWYoMT09ZS5ub2RlVHlwZSlyZXR1cm4gZX0pfWZ1bmN0aW9uIG0oZSx0KXt2YXIgbixyPWU/ZS5sZW5ndGg6MDtmb3Iobj0wO248cjtuKyspdGhpc1tuXT1lW25dO3RoaXMubGVuZ3RoPXIsdGhpcy5zZWxlY3Rvcj10fHwiIn1mdW5jdGlvbiBoKGUsdCxuKXtmb3IoSSBpbiB0KW4mJih1KHRbSV0pfHxlZSh0W0ldKSk/KHUodFtJXSkmJiF1KGVbSV0pJiYoZVtJXT17fSksZWUodFtJXSkmJiFlZShlW0ldKSYmKGVbSV09W10pLGgoZVtJXSx0W0ldLG4pKTp0W0ldIT09RSYmKGVbSV09dFtJXSl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBudWxsPT10P3coZSk6dyhlKS5maWx0ZXIodCl9ZnVuY3Rpb24gYihlLHQsbixyKXtyZXR1cm4gcyh0KT90LmNhbGwoZSxuLHIpOnR9ZnVuY3Rpb24geShlLHQsbil7bnVsbD09bj9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LG4pfWZ1bmN0aW9uIF8oZSx0KXt2YXIgbj1lLmNsYXNzTmFtZXx8IiIscj1uJiZuLmJhc2VWYWwhPT1FO2lmKHQ9PT1FKXJldHVybiByP24uYmFzZVZhbDpuO3I/bi5iYXNlVmFsPXQ6ZS5jbGFzc05hbWU9dH1mdW5jdGlvbiBDKGUpe3RyeXtyZXR1cm4gZT8idHJ1ZSI9PWV8fCJmYWxzZSIhPWUmJigibnVsbCI9PWU/bnVsbDorZSsiIj09ZT8rZTovXltcW1x7XS8udGVzdChlKT93LnBhcnNlSlNPTihlKTplKTplfWNhdGNoKHQpe3JldHVybiBlfX1mdW5jdGlvbiB4KGUsdCl7dChlKTtmb3IodmFyIG49MCxyPWUuY2hpbGROb2Rlcy5sZW5ndGg7bjxyO24rKyl4KGUuY2hpbGROb2Rlc1tuXSx0KX1mdW5jdGlvbiBrKGUsdCxuKXt2YXIgcj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXTtpZihyKXt2YXIgaT1yLnBhcmVudE5vZGU7aWYoaSl7dmFyIGE9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLmlubmVySFRNTD10LGpsKG4pJiZhLnNldEF0dHJpYnV0ZSgibm9uY2UiLG4pLGkuYXBwZW5kQ2hpbGQoYSksaS5yZW1vdmVDaGlsZChhKX19fXZhciBFLEksdyxELEEsUyxUPVtdLFA9VC5jb25jYXQsTz1ULmZpbHRlcixqPVQuc2xpY2UsTD10bC5kb2N1bWVudCxNPXt9LHQ9e30sVj17ImNvbHVtbi1jb3VudCI6MSxjb2x1bW5zOjEsImZvbnQtd2VpZ2h0IjoxLCJsaW5lLWhlaWdodCI6MSxvcGFjaXR5OjEsInotaW5kZXgiOjEsem9vbToxfSxSPS9eXHMqPChcdyt8ISlbXj5dKj4vLEY9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxOPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksQj0vXig/OmJvZHl8aHRtbCkkL2ksVT0vKFtBLVpdKS9nLHE9WyJ2YWwiLCJjc3MiLCJodG1sIiwidGV4dCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsIm9mZnNldCJdLHo9WyJhZnRlciIsInByZXBlbmQiLCJiZWZvcmUiLCJhcHBlbmQiXSxIPUwuY3JlYXRlRWxlbWVudCgidGFibGUiKSxXPUwuY3JlYXRlRWxlbWVudCgidHIiKSxHPXt0cjpMLmNyZWF0ZUVsZW1lbnQoInRib2R5IiksdGJvZHk6SCx0aGVhZDpILHRmb290OkgsdGQ6Vyx0aDpXLCIqIjpMLmNyZWF0ZUVsZW1lbnQoImRpdiIpfSxZPS9jb21wbGV0ZXxsb2FkZWR8aW50ZXJhY3RpdmUvLFg9L15bXHctXSokLyxLPXt9LFE9Sy50b1N0cmluZywkPXt9LEo9TC5jcmVhdGVFbGVtZW50KCJkaXYiKSxaPXt0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsZm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0sZWU9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheX07cmV0dXJuICQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe2lmKCF0fHwhZXx8MSE9PWUubm9kZVR5cGUpcmV0dXJuITE7dmFyIG49ZS5tYXRjaGVzfHxlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZS5tb3pNYXRjaGVzU2VsZWN0b3J8fGUub01hdGNoZXNTZWxlY3Rvcnx8ZS5tYXRjaGVzU2VsZWN0b3I7aWYobilyZXR1cm4gbi5jYWxsKGUsdCk7dmFyIHIsaT1lLnBhcmVudE5vZGUsYT0haTtyZXR1cm4gYSYmKGk9SikuYXBwZW5kQ2hpbGQoZSkscj1+JC5xc2EoaSx0KS5pbmRleE9mKGUpLGEmJkoucmVtb3ZlQ2hpbGQoZSkscn0sQT1mdW5jdGlvbiBBKGUpe3JldHVybiBlLnJlcGxhY2UoLy0rKC4pPy9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9LFM9ZnVuY3Rpb24gUyhuKXtyZXR1cm4gTy5jYWxsKG4sZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5pbmRleE9mKGUpPT10fSl9LCQuZnJhZ21lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksYTtyZXR1cm4gRi50ZXN0KGUpJiYocj13KEwuY3JlYXRlRWxlbWVudChSZWdFeHAuJDEpKSkscnx8KGUucmVwbGFjZSYmKGU9ZS5yZXBsYWNlKE4sIjwkMT48LyQyPiIpKSx0PT09RSYmKHQ9Ui50ZXN0KGUpJiZSZWdFeHAuJDEpLHQgaW4gR3x8KHQ9IioiKSwoYT1HW3RdKS5pbm5lckhUTUw9IiIrZSxyPXcuZWFjaChqLmNhbGwoYS5jaGlsZE5vZGVzKSxmdW5jdGlvbigpe2EucmVtb3ZlQ2hpbGQodGhpcyl9KSksdShuKSYmKGk9dyhyKSx3LmVhY2gobixmdW5jdGlvbihlLHQpey0xPHEuaW5kZXhPZihlKT9pW2VdKHQpOmkuYXR0cihlLHQpfSkpLHJ9LCQuWj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbShlLHQpfSwkLmlzWj1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mICQuWn0sJC5pbml0PWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIWUpcmV0dXJuICQuWigpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlpZigiPCI9PShlPWUudHJpbSgpKVswXSYmUi50ZXN0KGUpKW49JC5mcmFnbWVudChlLFJlZ0V4cC4kMSx0KSxlPW51bGw7ZWxzZXtpZih0IT09RSlyZXR1cm4gdyh0KS5maW5kKGUpO249JC5xc2EoTCxlKX1lbHNle2lmKHMoZSkpcmV0dXJuIHcoTCkucmVhZHkoZSk7aWYoJC5pc1ooZSkpcmV0dXJuIGU7aWYoZWUoZSkpbj1pKGUpO2Vsc2UgaWYocihlKSluPVtlXSxlPW51bGw7ZWxzZSBpZihSLnRlc3QoZSkpbj0kLmZyYWdtZW50KGUudHJpbSgpLFJlZ0V4cC4kMSx0KSxlPW51bGw7ZWxzZXtpZih0IT09RSlyZXR1cm4gdyh0KS5maW5kKGUpO249JC5xc2EoTCxlKX19cmV0dXJuICQuWihuLGUpfSwodz1mdW5jdGlvbiB3KGUsdCl7cmV0dXJuICQuaW5pdChlLHQpfSkuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBuLGU9ai5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ZS5zaGlmdCgpKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7aCh0LGUsbil9KSx0fSwkLnFzYT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9IiMiPT10WzBdLGk9IXImJiIuIj09dFswXSxhPXJ8fGk/dC5zbGljZSgxKTp0LG89WC50ZXN0KGEpO3JldHVybiBlLmdldEVsZW1lbnRCeUlkJiZvJiZyPyhuPWUuZ2V0RWxlbWVudEJ5SWQoYSkpP1tuXTpbXToxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZT9bXTpqLmNhbGwobyYmIXImJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT9pP2UuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTplLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpOmUucXVlcnlTZWxlY3RvckFsbCh0KSl9LHcuY29udGFpbnM9TC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnM/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSE9PXQmJmUuY29udGFpbnModCl9OmZ1bmN0aW9uKGUsdCl7Zm9yKDt0JiYodD10LnBhcmVudE5vZGUpOylpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sdy50eXBlPW8sdy5pc0Z1bmN0aW9uPXMsdy5pc1dpbmRvdz1hLHcuaXNBcnJheT1lZSx3LmlzUGxhaW5PYmplY3Q9dSx3LmlzRW1wdHlPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sdy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9TnVtYmVyKGUpLG49dHQoZSk7cmV0dXJuIG51bGwhPWUmJiJib29sZWFuIiE9biYmKCJzdHJpbmciIT1ufHxlLmxlbmd0aCkmJiFpc05hTih0KSYmaXNGaW5pdGUodCl8fCExfSx3LmluQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBULmluZGV4T2YuY2FsbCh0LGUsbil9LHcuY2FtZWxDYXNlPUEsdy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOlN0cmluZy5wcm90b3R5cGUudHJpbS5jYWxsKGUpfSx3LnV1aWQ9MCx3LnN1cHBvcnQ9e30sdy5leHByPXt9LHcubm9vcD1mdW5jdGlvbigpe30sdy5tYXA9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksYT1bXTtpZihsKGUpKWZvcihyPTA7cjxlLmxlbmd0aDtyKyspbnVsbCE9KG49dChlW3JdLHIpKSYmYS5wdXNoKG4pO2Vsc2UgZm9yKGkgaW4gZSludWxsIT0obj10KGVbaV0saSkpJiZhLnB1c2gobik7cmV0dXJuIGQoYSl9LHcuZWFjaD1mdW5jdGlvbihlLHQpe3ZhciBuLHI7aWYobChlKSl7Zm9yKG49MDtuPGUubGVuZ3RoO24rKylpZighMT09PXQuY2FsbChlW25dLG4sZVtuXSkpcmV0dXJuIGV9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlyZXR1cm4gZTtyZXR1cm4gZX0sdy5ncmVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8uY2FsbChlLHQpfSx0bC5KU09OJiYody5wYXJzZUpTT049SlNPTi5wYXJzZSksdy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7S1siW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KSx3LmZuPXtjb25zdHJ1Y3RvcjokLlosbGVuZ3RoOjAsZm9yRWFjaDpULmZvckVhY2gscmVkdWNlOlQucmVkdWNlLHB1c2g6VC5wdXNoLHNvcnQ6VC5zb3J0LHNwbGljZTpULnNwbGljZSxpbmRleE9mOlQuaW5kZXhPZixjb25jYXQ6ZnVuY3Rpb24gdGUoKXt2YXIgZSx0LG49W107Zm9yKGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQ9YXJndW1lbnRzW2VdLG5bZV09JC5pc1oodCk/dC50b0FycmF5KCk6dDtyZXR1cm4gUC5hcHBseSgkLmlzWih0aGlzKT90aGlzLnRvQXJyYXkoKTp0aGlzLG4pfSxtYXA6ZnVuY3Rpb24gbmUobil7cmV0dXJuIHcody5tYXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0LGUpfSkpfSxzbGljZTpmdW5jdGlvbiByZSgpe3JldHVybiB3KGouYXBwbHkodGhpcyxhcmd1bWVudHMpKX0scmVhZHk6ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIFkudGVzdChMLnJlYWR5U3RhdGUpJiZMLmJvZHk/ZSh3KTpMLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7ZSh3KX0sITEpLHRoaXN9LGdldDpmdW5jdGlvbiBhZShlKXtyZXR1cm4gZT09PUU/ai5jYWxsKHRoaXMpOnRoaXNbMDw9ZT9lOmUrdGhpcy5sZW5ndGhdfSx0b0FycmF5OmZ1bmN0aW9uIG9lKCl7cmV0dXJuIHRoaXMuZ2V0KCl9LHNpemU6ZnVuY3Rpb24gc2UoKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHJlbW92ZTpmdW5jdGlvbiBjZSgpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtudWxsIT10aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pfSxlYWNoOmZ1bmN0aW9uIHVlKGUpe2Zvcih2YXIgdCxuPXRoaXMubGVuZ3RoLHI9MDtyPG4mJih0PXRoaXNbcl0sITEhPT1lLmNhbGwodCxyLHQpKTspcisrO3JldHVybiB0aGlzfSxmaWx0ZXI6ZnVuY3Rpb24gbGUodCl7cmV0dXJuIHModCk/dGhpcy5ub3QodGhpcy5ub3QodCkpOncoTy5jYWxsKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuICQubWF0Y2hlcyhlLHQpfSkpfSxhZGQ6ZnVuY3Rpb24gZGUoZSx0KXtyZXR1cm4gdyhTKHRoaXMuY29uY2F0KHcoZSx0KSkpKX0saXM6ZnVuY3Rpb24gZmUoZSl7cmV0dXJuIDA8dGhpcy5sZW5ndGgmJiQubWF0Y2hlcyh0aGlzWzBdLGUpfSxub3Q6ZnVuY3Rpb24gcGUodCl7dmFyIG49W107aWYocyh0KSYmdC5jYWxsIT09RSl0aGlzLmVhY2goZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZSl8fG4ucHVzaCh0aGlzKX0pO2Vsc2V7dmFyIHI9InN0cmluZyI9PXR5cGVvZiB0P3RoaXMuZmlsdGVyKHQpOmwodCkmJnModC5pdGVtKT9qLmNhbGwodCk6dyh0KTt0aGlzLmZvckVhY2goZnVuY3Rpb24oZSl7ci5pbmRleE9mKGUpPDAmJm4ucHVzaChlKX0pfXJldHVybiB3KG4pfSxoYXM6ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHIoZSk/dy5jb250YWlucyh0aGlzLGUpOncodGhpcykuZmluZChlKS5zaXplKCl9KX0sZXE6ZnVuY3Rpb24gbWUoZSl7cmV0dXJuLTE9PT1lP3RoaXMuc2xpY2UoZSk6dGhpcy5zbGljZShlLCtlKzEpfSxmaXJzdDpmdW5jdGlvbiBoZSgpe3ZhciBlPXRoaXNbMF07cmV0dXJuIGUmJiFyKGUpP2U6dyhlKX0sbGFzdDpmdW5jdGlvbiB2ZSgpe3ZhciBlPXRoaXNbdGhpcy5sZW5ndGgtMV07cmV0dXJuIGUmJiFyKGUpP2U6dyhlKX0sZmluZDpmdW5jdGlvbiBiZShlKXt2YXIgbj10aGlzO3JldHVybiBlPyJvYmplY3QiPT10dChlKT93KGUpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIFQuc29tZS5jYWxsKG4sZnVuY3Rpb24oZSl7cmV0dXJuIHcuY29udGFpbnMoZSx0KX0pfSk6MT09dGhpcy5sZW5ndGg/dygkLnFzYSh0aGlzWzBdLGUpKTp0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiAkLnFzYSh0aGlzLGUpfSk6dygpfSxjbG9zZXN0OmZ1bmN0aW9uIHllKG4scil7dmFyIGk9W10sYT0ib2JqZWN0Ij09dHQobikmJncobik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlLHQpe2Zvcig7dCYmIShhPzA8PWEuaW5kZXhPZih0KTokLm1hdGNoZXModCxuKSk7KXQ9dCE9PXImJiFjKHQpJiZ0LnBhcmVudE5vZGU7dCYmaS5pbmRleE9mKHQpPDAmJmkucHVzaCh0KX0pLHcoaSl9LHBhcmVudHM6ZnVuY3Rpb24gX2UoZSl7Zm9yKHZhciB0PVtdLG49dGhpczswPG4ubGVuZ3RoOyluPXcubWFwKG4sZnVuY3Rpb24oZSl7aWYoKGU9ZS5wYXJlbnROb2RlKSYmIWMoZSkmJnQuaW5kZXhPZihlKTwwKXJldHVybiB0LnB1c2goZSksZX0pO3JldHVybiB2KHQsZSl9LHBhcmVudDpmdW5jdGlvbiBDZShlKXtyZXR1cm4gdihTKHRoaXMucGx1Y2soInBhcmVudE5vZGUiKSksZSl9LGNoaWxkcmVuOmZ1bmN0aW9uIHhlKGUpe3JldHVybiB2KHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGcodGhpcyl9KSxlKX0sY29udGVudHM6ZnVuY3Rpb24ga2UoKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZW50RG9jdW1lbnR8fGouY2FsbCh0aGlzLmNoaWxkTm9kZXMpfSl9LHNpYmxpbmdzOmZ1bmN0aW9uIEVlKGUpe3JldHVybiB2KHRoaXMubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8uY2FsbChnKHQucGFyZW50Tm9kZSksZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSl9KSxlKX0sZW1wdHk6ZnVuY3Rpb24gSWUoKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9KX0scGx1Y2s6ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHcubWFwKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF19KX0sc2hvdzpmdW5jdGlvbiBEZSgpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsibm9uZSI9PXRoaXMuc3R5bGUuZGlzcGxheSYmKHRoaXMuc3R5bGUuZGlzcGxheT0iIiksIm5vbmUiPT1nZXRDb21wdXRlZFN0eWxlKHRoaXMsIiIpLmdldFByb3BlcnR5VmFsdWUoImRpc3BsYXkiKSYmKHRoaXMuc3R5bGUuZGlzcGxheT1lKHRoaXMubm9kZU5hbWUpKX0pfSxyZXBsYWNlV2l0aDpmdW5jdGlvbiBBZShlKXtyZXR1cm4gdGhpcy5iZWZvcmUoZSkucmVtb3ZlKCl9LHdyYXA6ZnVuY3Rpb24gU2UodCl7dmFyIG49cyh0KTtpZih0aGlzWzBdJiYhbil2YXIgcj13KHQpLmdldCgwKSxpPXIucGFyZW50Tm9kZXx8MTx0aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3codGhpcykud3JhcEFsbChuP3QuY2FsbCh0aGlzLGUpOmk/ci5jbG9uZU5vZGUoITApOnIpfSl9LHdyYXBBbGw6ZnVuY3Rpb24gVGUoZSl7aWYodGhpc1swXSl7dmFyIHQ7Zm9yKHcodGhpc1swXSkuYmVmb3JlKGU9dyhlKSk7KHQ9ZS5jaGlsZHJlbigpKS5sZW5ndGg7KWU9dC5maXJzdCgpO3coZSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24gUGUoaSl7dmFyIGE9cyhpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXcodGhpcyksbj10LmNvbnRlbnRzKCkscj1hP2kuY2FsbCh0aGlzLGUpOmk7bi5sZW5ndGg/bi53cmFwQWxsKHIpOnQuYXBwZW5kKHIpfSl9LHVud3JhcDpmdW5jdGlvbiBPZSgpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMpLnJlcGxhY2VXaXRoKHcodGhpcykuY2hpbGRyZW4oKSl9KSx0aGlzfSxjbG9uZTpmdW5jdGlvbiBqZSgpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lTm9kZSghMCl9KX0saGlkZTpmdW5jdGlvbiBMZSgpe3JldHVybiB0aGlzLmNzcygiZGlzcGxheSIsIm5vbmUiKX0sdG9nZ2xlOmZ1bmN0aW9uIE1lKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT13KHRoaXMpOyh0PT09RT8ibm9uZSI9PWUuY3NzKCJkaXNwbGF5Iik6dCk/ZS5zaG93KCk6ZS5oaWRlKCl9KX0scHJldjpmdW5jdGlvbiBWZShlKXtyZXR1cm4gdyh0aGlzLnBsdWNrKCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIikpLmZpbHRlcihlfHwiKiIpfSxuZXh0OmZ1bmN0aW9uIFJlKGUpe3JldHVybiB3KHRoaXMucGx1Y2soIm5leHRFbGVtZW50U2libGluZyIpKS5maWx0ZXIoZXx8IioiKX0saHRtbDpmdW5jdGlvbiBGZShuKXtyZXR1cm4gMCBpbiBhcmd1bWVudHM/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5uZXJIVE1MO3codGhpcykuZW1wdHkoKS5hcHBlbmQoYih0aGlzLG4sZSx0KSl9KTowIGluIHRoaXM/dGhpc1swXS5pbm5lckhUTUw6bnVsbH0sdGV4dDpmdW5jdGlvbiBOZShuKXtyZXR1cm4gMCBpbiBhcmd1bWVudHM/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWIodGhpcyxuLGUsdGhpcy50ZXh0Q29udGVudCk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOiIiK3R9KTowIGluIHRoaXM/dGhpcy5wbHVjaygidGV4dENvbnRlbnQiKS5qb2luKCIiKTpudWxsfSxhdHRyOmZ1bmN0aW9uIEJlKHQsbil7dmFyIGU7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHwxIGluIGFyZ3VtZW50cz90aGlzLmVhY2goZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGUpaWYocih0KSlmb3IoSSBpbiB0KXkodGhpcyxJLHRbSV0pO2Vsc2UgeSh0aGlzLHQsYih0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZSh0KSkpfSk6MCBpbiB0aGlzJiYxPT10aGlzWzBdLm5vZGVUeXBlJiZudWxsIT0oZT10aGlzWzBdLmdldEF0dHJpYnV0ZSh0KSk/ZTpFfSxyZW1vdmVBdHRyOmZ1bmN0aW9uIFVlKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsxPT09dGhpcy5ub2RlVHlwZSYmZS5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7eSh0aGlzLGUpfSx0aGlzKX0pfSxwcm9wOmZ1bmN0aW9uIHFlKHQsbil7cmV0dXJuIHQ9Wlt0XXx8dCwxIGluIGFyZ3VtZW50cz90aGlzLmVhY2goZnVuY3Rpb24oZSl7dGhpc1t0XT1iKHRoaXMsbixlLHRoaXNbdF0pfSk6dGhpc1swXSYmdGhpc1swXVt0XX0scmVtb3ZlUHJvcDpmdW5jdGlvbiB6ZShlKXtyZXR1cm4gZT1aW2VdfHxlLHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2VdfSl9LGRhdGE6ZnVuY3Rpb24gZSh0LG4pe3ZhciByPSJkYXRhLSIrdC5yZXBsYWNlKFUsIi0kMSIpLnRvTG93ZXJDYXNlKCksZT0xIGluIGFyZ3VtZW50cz90aGlzLmF0dHIocixuKTp0aGlzLmF0dHIocik7cmV0dXJuIG51bGwhPT1lP0MoZSk6RX0sdmFsOmZ1bmN0aW9uIEhlKHQpe3JldHVybiAwIGluIGFyZ3VtZW50cz8obnVsbD09dCYmKHQ9IiIpLHRoaXMuZWFjaChmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWIodGhpcyx0LGUsdGhpcy52YWx1ZSl9KSk6dGhpc1swXSYmKHRoaXNbMF0ubXVsdGlwbGU/dyh0aGlzWzBdKS5maW5kKCJvcHRpb24iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH0pLnBsdWNrKCJ2YWx1ZSIpOnRoaXNbMF0udmFsdWUpfSxvZmZzZXQ6ZnVuY3Rpb24gV2UoYSl7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXcodGhpcyksbj1iKHRoaXMsYSxlLHQub2Zmc2V0KCkpLHI9dC5vZmZzZXRQYXJlbnQoKS5vZmZzZXQoKSxpPXt0b3A6bi50b3Atci50b3AsbGVmdDpuLmxlZnQtci5sZWZ0fTsic3RhdGljIj09dC5jc3MoInBvc2l0aW9uIikmJihpLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHQuY3NzKGkpfSk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiBudWxsO2lmKEwuZG9jdW1lbnRFbGVtZW50IT09dGhpc1swXSYmIXcuY29udGFpbnMoTC5kb2N1bWVudEVsZW1lbnQsdGhpc1swXSkpcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIGU9dGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDplLmxlZnQrdGwucGFnZVhPZmZzZXQsdG9wOmUudG9wK3RsLnBhZ2VZT2Zmc2V0LHdpZHRoOk1hdGgucm91bmQoZS53aWR0aCksaGVpZ2h0Ok1hdGgucm91bmQoZS5oZWlnaHQpfX0sY3NzOmZ1bmN0aW9uIGUodCxuKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXNbMF07aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZighcilyZXR1cm47cmV0dXJuIHIuc3R5bGVbQSh0KV18fGdldENvbXB1dGVkU3R5bGUociwiIikuZ2V0UHJvcGVydHlWYWx1ZSh0KX1pZihlZSh0KSl7aWYoIXIpcmV0dXJuO3ZhciBpPXt9LGE9Z2V0Q29tcHV0ZWRTdHlsZShyLCIiKTtyZXR1cm4gdy5lYWNoKHQsZnVuY3Rpb24oZSx0KXtpW3RdPXIuc3R5bGVbQSh0KV18fGEuZ2V0UHJvcGVydHlWYWx1ZSh0KX0pLGl9fXZhciBlPSIiO2lmKCJzdHJpbmciPT1vKHQpKW58fDA9PT1uP2U9Zih0KSsiOiIrcCh0LG4pOnRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoZih0KSl9KTtlbHNlIGZvcihJIGluIHQpdFtJXXx8MD09PXRbSV0/ZSs9ZihJKSsiOiIrcChJLHRbSV0pKyI7Ijp0aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KGYoSSkpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuc3R5bGUuY3NzVGV4dCs9IjsiK2V9KX0saW5kZXg6ZnVuY3Rpb24gR2UoZSl7cmV0dXJuIGU/dGhpcy5pbmRleE9mKHcoZSlbMF0pOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleE9mKHRoaXNbMF0pfSxoYXNDbGFzczpmdW5jdGlvbiBZZShlKXtyZXR1cm4hIWUmJlQuc29tZS5jYWxsKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGVzdChfKGUpKX0sbihlKSl9LGFkZENsYXNzOmZ1bmN0aW9uIFhlKG4pe3JldHVybiBuP3RoaXMuZWFjaChmdW5jdGlvbihlKXtpZigiY2xhc3NOYW1lImluIHRoaXMpe0Q9W107dmFyIHQ9Xyh0aGlzKTtiKHRoaXMsbixlLHQpLnNwbGl0KC9ccysvZykuZm9yRWFjaChmdW5jdGlvbihlKXt3KHRoaXMpLmhhc0NsYXNzKGUpfHxELnB1c2goZSl9LHRoaXMpLEQubGVuZ3RoJiZfKHRoaXMsdCsodD8iICI6IiIpK0Quam9pbigiICIpKX19KTp0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbiBLZSh0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2lmKCJjbGFzc05hbWUiaW4gdGhpcyl7aWYodD09PUUpcmV0dXJuIF8odGhpcywiIik7RD1fKHRoaXMpLGIodGhpcyx0LGUsRCkuc3BsaXQoL1xzKy9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0Q9RC5yZXBsYWNlKG4oZSksIiAiKX0pLF8odGhpcyxELnRyaW0oKSl9fSl9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uIFFlKG4scil7cmV0dXJuIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXcodGhpcyk7Yih0aGlzLG4sZSxfKHRoaXMpKS5zcGxpdCgvXHMrL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7KHI9PT1FPyF0Lmhhc0NsYXNzKGUpOnIpP3QuYWRkQ2xhc3MoZSk6dC5yZW1vdmVDbGFzcyhlKX0pfSk6dGhpc30sc2Nyb2xsVG9wOmZ1bmN0aW9uICRlKGUpe2lmKHRoaXMubGVuZ3RoKXt2YXIgdD0ic2Nyb2xsVG9wImluIHRoaXNbMF07cmV0dXJuIGU9PT1FP3Q/dGhpc1swXS5zY3JvbGxUb3A6dGhpc1swXS5wYWdlWU9mZnNldDp0aGlzLmVhY2godD9mdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9wPWV9OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUbyh0aGlzLnNjcm9sbFgsZSl9KX19LHNjcm9sbExlZnQ6ZnVuY3Rpb24gSmUoZSl7aWYodGhpcy5sZW5ndGgpe3ZhciB0PSJzY3JvbGxMZWZ0ImluIHRoaXNbMF07cmV0dXJuIGU9PT1FP3Q/dGhpc1swXS5zY3JvbGxMZWZ0OnRoaXNbMF0ucGFnZVhPZmZzZXQ6dGhpcy5lYWNoKHQ/ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbExlZnQ9ZX06ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRvKGUsdGhpcy5zY3JvbGxZKX0pfX0scG9zaXRpb246ZnVuY3Rpb24gWmUoKXtpZih0aGlzLmxlbmd0aCl7dmFyIGU9dGhpc1swXSx0PXRoaXMub2Zmc2V0UGFyZW50KCksbj10aGlzLm9mZnNldCgpLHI9Qi50ZXN0KHRbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OnQub2Zmc2V0KCk7cmV0dXJuIG4udG9wLT1wYXJzZUZsb2F0KHcoZSkuY3NzKCJtYXJnaW4tdG9wIikpfHwwLG4ubGVmdC09cGFyc2VGbG9hdCh3KGUpLmNzcygibWFyZ2luLWxlZnQiKSl8fDAsci50b3ArPXBhcnNlRmxvYXQodyh0WzBdKS5jc3MoImJvcmRlci10b3Atd2lkdGgiKSl8fDAsci5sZWZ0Kz1wYXJzZUZsb2F0KHcodFswXSkuY3NzKCJib3JkZXItbGVmdC13aWR0aCIpKXx8MCx7dG9wOm4udG9wLXIudG9wLGxlZnQ6bi5sZWZ0LXIubGVmdH19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24gZXQoKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fEwuYm9keTtlJiYhQi50ZXN0KGUubm9kZU5hbWUpJiYic3RhdGljIj09dyhlKS5jc3MoInBvc2l0aW9uIik7KWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV9KX19LHcuZm4uZGV0YWNoPXcuZm4ucmVtb3ZlLFsid2lkdGgiLCJoZWlnaHQiXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPXIucmVwbGFjZSgvLi8sZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9VcHBlckNhc2UoKX0pO3cuZm5bcl09ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzWzBdO3JldHVybiB0PT09RT9hKG4pP25bImlubmVyIitpXTpjKG4pP24uZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2ldOihlPXRoaXMub2Zmc2V0KCkpJiZlW3JdOnRoaXMuZWFjaChmdW5jdGlvbihlKXsobj13KHRoaXMpKS5jc3MocixiKHRoaXMsdCxlLG5bcl0oKSkpfSl9fSksei5mb3JFYWNoKGZ1bmN0aW9uKHQsbCl7dmFyIGQ9bCUyO3cuZm5bdF09ZnVuY3Rpb24oKXt2YXIgbixzLGM9dy5tYXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiJhcnJheSI9PShuPW8oZSkpPyhlLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGUhPT1FP3QucHVzaChlKTp3LnplcHRvLmlzWihlKT90PXQuY29uY2F0KGUuZ2V0KCkpOnZvaWQodD10LmNvbmNhdCgkLmZyYWdtZW50KGUpKSl9KSx0KToib2JqZWN0Ij09bnx8bnVsbD09ZT9lOiQuZnJhZ21lbnQoZSl9KSx1PTE8dGhpcy5sZW5ndGg7cmV0dXJuIGMubGVuZ3RoPDE/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSx0KXtzPWQ/dDp0LnBhcmVudE5vZGUsdD0wPT1sP3QubmV4dFNpYmxpbmc6MT09bD90LmZpcnN0Q2hpbGQ6Mj09bD90Om51bGw7dmFyIG49dy5jb250YWlucyhMLmRvY3VtZW50RWxlbWVudCxzKSxyPS9eKHRleHR8YXBwbGljYXRpb24pXC8oamF2YXNjcmlwdHxlY21hc2NyaXB0KSQvLGk9bnQoKSxhPWlbbmddLG89aVtyZ107Yy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKHUpZT1lLmNsb25lTm9kZSghMCk7ZWxzZSBpZighcylyZXR1cm4gdyhlKS5yZW1vdmUoKTtqbChhKSYmIlNDUklQVCI9PT1lLnRhZ05hbWUmJmUuc2V0QXR0cmlidXRlKCJub25jZSIsYSksamwobykmJiJTVFlMRSI9PT1lLnRhZ05hbWUmJmUuc2V0QXR0cmlidXRlKCJub25jZSIsbykscy5pbnNlcnRCZWZvcmUoZSx0KSxuJiZ4KGUsZnVuY3Rpb24oZSl7bnVsbD09ZS5ub2RlTmFtZXx8IlNDUklQVCIhPT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCl8fGUudHlwZSYmIXIudGVzdChlLnR5cGUudG9Mb3dlckNhc2UoKSl8fGUuc3JjfHxrKEwsZS5pbm5lckhUTUwsZS5ub25jZSl9KX0pfSl9LHcuZm5bZD90KyJUbyI6Imluc2VydCIrKGw/IkJlZm9yZSI6IkFmdGVyIildPWZ1bmN0aW9uKGUpe3JldHVybiB3KGUpW3RdKHRoaXMpLHRoaXN9fSksJC5aLnByb3RvdHlwZT1tLnByb3RvdHlwZT13LmZuLCQudW5pcT1TLCQuZGVzZXJpYWxpemVWYWx1ZT1DLHcuemVwdG89JCx3fSgpKSxmdW5jdGlvbigpe3RyeXtnZXRDb21wdXRlZFN0eWxlKHVuZGVmaW5lZCl9Y2F0Y2goZSl7dmFyIG49Z2V0Q29tcHV0ZWRTdHlsZTt0bC5nZXRDb21wdXRlZFN0eWxlPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBuKGUsdCl9Y2F0Y2goRW9hKXtyZXR1cm4gbnVsbH19fX0oKSxybD0obmw9c2wpLnplcHRvLGlsPXJsLnFzYSxhbD0vXlxzKj4vLG9sPSJaZXB0byIrICtuZXcgRGF0ZSxybC5xc2E9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dDt0cnl7aT9hbC50ZXN0KGkpJiYocj1ubChlKS5hZGRDbGFzcyhvbCksaT0iLiIrb2wrIiAiK2kpOmk9IioiLG49aWwoZSxpKX1jYXRjaChhKXt0aHJvdyBhfWZpbmFsbHl7ciYmci5yZW1vdmVDbGFzcyhvbCl9cmV0dXJuIG59LHNsKSxFZz1jbC5NdXRhdGlvbk9ic2VydmVyfHxjbC5XZWJraXRNdXRhdGlvbk9ic2VydmVyLElnPSJFeHBlY3RlZCBhbiBhcnJheSBvZiBwcm9taXNlcyI7cGwuX3NldEltbWVkaWF0ZUZuJiZSZSgpO3ZhciB3Zz1IKCksRGc9Ly4qXC4oXGQrKV9cZCsvO2N0KGNsLHVsKTt2YXIgQWc9ImF0LWxpYnJhcnktbG9hZGVkIixTZz0iYXQtcmVxdWVzdC1zdGFydCIsVGc9ImF0LXJlcXVlc3Qtc3VjY2VlZGVkIixQZz0iYXQtcmVxdWVzdC1mYWlsZWQiLE9nPSJhdC1jb250ZW50LXJlbmRlcmluZy1zdGFydCIsamc9ImF0LWNvbnRlbnQtcmVuZGVyaW5nLXN1Y2NlZWRlZCIsTGc9ImF0LWNvbnRlbnQtcmVuZGVyaW5nLWZhaWxlZCIsTWc9ImF0LWNvbnRlbnQtcmVuZGVyaW5nLW5vLW9mZmVycyIsVmc9ImF0LWNvbnRlbnQtcmVuZGVyaW5nLXJlZGlyZWN0IixSZz0iOmVxKCIsRmc9IikiLE5nPVJnLmxlbmd0aCxCZz0vKChcLnwjKSgtKT9cZHsxfSkvZyxVZz0iVW5hYmxlIHRvIGxvYWQgdGFyZ2V0LXZlYy5qcyIscWc9IkxvYWRpbmcgdGFyZ2V0LXZlYy5qcyIsemc9Il9BVCIsSGc9ImNsaWNrSGFuZGxlckZvckV4cGVyaWVuY2VFZGl0b3IiLFdnPSJjdXJyZW50VmlldyIsR2c9ImF0X3FhX21vZGUiLFlnPSJhdF9wcmV2aWV3X3Rva2VuIixYZz0iYXRfcHJldmlld19pbmRleCIsS2c9ImF0X3ByZXZpZXdfbGlzdGVkX2FjdGl2aXRpZXNfb25seSIsUWc9ImF0X3ByZXZpZXdfZXZhbHVhdGVfYXNfdHJ1ZV9hdWRpZW5jZV9pZHMiLCRnPSJhdF9wcmV2aWV3X2V2YWx1YXRlX2FzX2ZhbHNlX2F1ZGllbmNlX2lkcyIsSmc9Il8iLFpnPWZ1bmN0aW9uIFpnKGUpe3JldHVybiFnKGUpfSxlbT0iYXQtIix0bT0iYXQtYm9keS1zdHlsZSIsbm09IiMiK3RtLHJtPWVtKyJ2aWV3cyIsaW09IkRpc2FibGVkIGR1ZSB0byBvcHRvdXQiLGFtPSJNQ0FBTUIiLG9tPSJNQ0FBTUxIIixzbT0iTUNNSUQiLGNtPSJNQ09QVE9VVCIsdW09ImdldFN1cHBsZW1lbnRhbERhdGFJRCIsbG09ImdldEN1c3RvbWVySURzIixkbT0idHJhY2tpbmdTZXJ2ZXIiLGZtPWRtKyJTZWN1cmUiLHBtPSJWaXNpdG9yIixnbT0iZ2V0SW5zdGFuY2UiLG1tPSJpc0FsbG93ZWQiLGhtPSJWaXNpdG9yIEFQSSByZXF1ZXN0cyB0aW1lZCBvdXQiLHZtPSJWaXNpdG9yIEFQSSByZXF1ZXN0cyBlcnJvciIsYm09e30seW09IkRhdGEgcHJvdmlkZXIiLF9tPSJ0aW1lZCBvdXQiLENtPTJlMyx4bT0iYXV0aG9yaXphdGlvbiIsa209Im1ib3hEZWJ1Z1Rvb2xzIixFbT1hcigpLEltPSJwcm9maWxlLiIsd209Im1ib3gzcmRQYXJ0eUlkIixEbT0iYXRfcHJvcGVydHkiLEFtPSJvcmRlcklkIixTbT0ib3JkZXJUb3RhbCIsVG09InByb2R1Y3RQdXJjaGFzZWRJZCIsUG09InByb2R1Y3RJZCIsT209ImNhdGVnb3J5SWQiLGptPSJQT1NUIixMbT0iTmV0d29yayByZXF1ZXN0IGZhaWxlZCIsTW09IlJlcXVlc3QgdGltZWQgb3V0IixWbT0iTWFsZm9ybWVkIHJlc3BvbnNlIEpTT04iLFJtPSJ3ZWIiLEZtPSJtYm94ZWRnZSIsTm09Ii50dC5vbXRyZGMubmV0IixCbT1mdW5jdGlvbiBCbShlKXtyZXR1cm4hUyhlKX0sVW09ZnVuY3Rpb24gVW0odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfX0scW09ZnVuY3Rpb24gcW0odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiF0KGUpfX0sem09cW0oZyksSG09ZnVuY3Rpb24gSG0odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBtKHQsZSl9fSxXbT1mdW5jdGlvbiBXbShlKXtyZXR1cm4gZS5zdGF0dXM9PT1fZn0sR209ZnVuY3Rpb24gR20oZSl7cmV0dXJuIGUudHlwZT09PU9mfSxZbT1mdW5jdGlvbiBZbShlKXtyZXR1cm4gZS50eXBlPT09Y2R9LFhtPUhtKHptKSxLbT1VbShMcCksUW09VW0oQmwpLCRtPVVtKGpmKSxKbT1mdW5jdGlvbiBKbShlKXtyZXR1cm4gamwoZS5uYW1lKX0sWm09ZnVuY3Rpb24gWm0oZSl7cmV0dXJuIWcoZS5pbmRleCl9LGVoPWZ1bmN0aW9uIGVoKGUpe3JldHVybiBkKGUpJiZKbShlKX0sdGg9ZnVuY3Rpb24gdGgoZSl7cmV0dXJuIGQoZSkmJkptKGUpJiZabShlKX0sbmg9ZnVuY3Rpb24gbmgoZSl7cmV0dXJuIGQoZSkmJkptKGUpfSxyaD1mdW5jdGlvbiByaChlKXtyZXR1cm4gamwoZS5zZWxlY3Rvcil9LGloPVVtKExmKSxhaD1iKFtpaCx6bV0pLG9oPSJhZG9iZV9tY19zZGlkIixzaD0iTmV0d29yayByZXF1ZXN0IGZhaWxlZCIsY2g9IlJlcXVlc3QgdGltZWQgb3V0Iix1aD0iVVJMIGlzIHJlcXVpcmVkIixsaD0iR0VUIixkaD0iUE9TVCIsZmg9Im1ldGhvZCIscGg9InVybCIsZ2g9ImhlYWRlcnMiLG1oPSJkYXRhIixoaD0iY3JlZGVudGlhbHMiLHZoPSJ0aW1lb3V0IixiaD0iYXN5bmMiLHloPS9DTEtUUksjKFxTKykvLF9oPS9DTEtUUksjKFxTKylccy8sQ2g9ZnVuY3Rpb24gWmcoZSl7cmV0dXJuIWcoZSl9LHhoPSJ2aXNpYmlsaXR5U3RhdGUiLGtoPSJ2aXNpYmxlIixFaD0xMDAsSWg9TWQrIiwiK1JkKyIsIitWZCx3aD0iYXQtYWN0aW9uLWtleSIsRGg9Im1ldHJpYyBlbGVtZW50IG5vdCBmb3VuZCIsQWg9Im5hdmlnYXRvciIsU2g9InNlbmRCZWFjb24iLFRoPSJCZWFjb24gZGF0YSBzZW50IixQaD0iQmVhY29uIGRhdGEgc2VudCBmYWlsZWQiLE9oPSJWaWV3IHRyaWdnZXJlZCBub3RpZmljYXRpb24iLGpoPSJWaWV3IHJlbmRlcmVkIG5vdGlmaWNhdGlvbiIsTGg9Ik1ib3hlcyByZW5kZXJlZCBub3RpZmljYXRpb24iLE1oPSJFdmVudCBoYW5kbGVyIG5vdGlmaWNhdGlvbiIsVmg9Ik1ib3ggZXZlbnQgaGFuZGxlciBub3RpZmljYXRpb24iLFJoPSJWaWV3IGV2ZW50IGhhbmRsZXIgbm90aWZpY2F0aW9uIixGaD0icHJlZmV0Y2hNYm94ZXMiLE5oPSJyZW5kZXJlZCIsQmg9InRyaWdnZXJlZCIsVWg9e30scWg9InBhZ2VMb2FkTWV0cmljcyIsemg9InByZWZldGNoTWV0cmljcyIsSGg9VW0oTXApLFdoPWZ1bmN0aW9uIFdoKCl7cmV0dXJuIHBpKHdmKX0sR2g9ZnVuY3Rpb24gR2goZSl7cmV0dXJuIGdpKHdmLGUpfSxZaD1VbShCbCksWGg9VW0oS2wpLEtoPWZ1bmN0aW9uIEtoKGUpe3JldHVybiBwaShJZixlKX0sUWg9ZnVuY3Rpb24gUWgoZSl7cmV0dXJuIGdpKElmLGUpfSwkaD1mdW5jdGlvbiAkaChlKXtyZXR1cm4gcW0oV20pKGUpJiZhaChlKX07bmMucHJvdG90eXBlPXtvbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5lfHwodGhpcy5lPXt9KTtyZXR1cm4ocltlXXx8KHJbZV09W10pKS5wdXNoKHtmbjp0LGN0eDpufSksdGhpc30sb25jZTpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcigpe2kub2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9dmFyIGk9dGhpcztyZXR1cm4gci5fPXQsdGhpcy5vbihlLHIsbil9LGVtaXQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49KCh0aGlzLmV8fCh0aGlzLmU9e30pKVtlXXx8W10pLnNsaWNlKCkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyluW3JdLmZuLmFwcGx5KG5bcl0uY3R4LHQpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmV8fCh0aGlzLmU9e30pLHI9bltlXSxpPVtdO2lmKHImJnQpZm9yKHZhciBhPTAsbz1yLmxlbmd0aDthPG87YSsrKXJbYV0uZm4hPT10JiZyW2FdLmZuLl8hPT10JiZpLnB1c2goclthXSk7cmV0dXJuIGkubGVuZ3RoP25bZV09aTpkZWxldGUgbltlXSx0aGlzfX07dmFyIEpoPW5jLFpoPW5jO0poLlRpbnlFbWl0dGVyPVpoO3ZhciBldj1yYygpLHR2PSJQYWdlIGxvYWQgcmVuZGVyaW5nIGZhaWxlZCIsbnY9Ik1ib3hlcyByZW5kZXJpbmcgZmFpbGVkIixydj0iVmlldyByZW5kZXJpbmcgZmFpbGVkIixpdj0iUHJlZmV0Y2ggcmVuZGVyaW5nIGZhaWxlZCIsYXY9ZnVuY3Rpb24gYXYoZSl7cmV0dXJuIVMobShXbSxlKSl9LG92PSJbcGFnZS1pbml0XSIsc3Y9IltnZXRPZmZlcigpXSIsY3Y9IltnZXRPZmZlcnMoKV0iLHV2PSJbYXBwbHlPZmZlcigpXSIsbHY9IlthcHBseU9mZmVycygpXSIsZHY9IltzZW5kTm90aWZpY2F0aW9ucygpXSIsZnY9Ilt0cmFja0V2ZW50KCldIixwdj0iW3RyaWdnZXJWaWV3KCldIixndj1bXSxtdj0xLGh2PTA7V3UoKTt2YXIgdnY9ImZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZ2V0T2ZmZXIoKSBhbmQgYXBwbHlPZmZlcigpIGZ1bmN0aW9ucyBpbnN0ZWFkLiIsYnY9ImFkb2JlLnRhcmdldC5yZWdpc3RlckV4dGVuc2lvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXZpZXcgdGhlIGRvY3VtZW50YXRpb24gZm9yIGFsdGVybmF0aXZlcy4iLHl2PSJtYm94Q3JlYXRlKCkgIit2dixfdj0ibWJveERlZmluZSgpICIrdnYsQ3Y9Im1ib3hVcGRhdGUoKSAiK3Z2LHh2PXtpbml0OmVsLGluaXRDb25maWc6JCxpbml0RGVsaXZlcnk6SmN9O2UuZXhwb3J0cz14dn19LCJhZG9iZS10YXJnZXQtdjIvbGliL21lc3NhZ2VzLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e0FMUkVBRFlfSU5JVElBTElaRUQ6IkFUOiBBZG9iZSBUYXJnZXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4iLERFTElWRVJZX0RJU0FCTEVEOiJBVDogQWRvYmUgVGFyZ2V0IGNvbnRlbnQgZGVsaXZlcnkgaXMgZGlzYWJsZWQuIFVwZGF0ZSB5b3VyIERPQ1RZUEUgdG8gc3VwcG9ydCBTdGFuZGFyZHMgbW9kZS4iLE5PX1JFUVVFU1Q6IkFUOiBUYXJnZXQgbGlicmFyeSBpcyBlaXRoZXIgbm90IGxvYWRlZCBvciBkaXNhYmxlZCwgbm8gcmVxdWVzdCB3aWxsIGJlIGV4ZWN1dGVkIn19fSwiYWRvYmUtdGFyZ2V0LXYyL2xpYi9tb2R1bGVzL3BhcmFtcy1zdG9yZS5qcyI6e3NjcmlwdDpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPWUudmFsdWUmJm51bGwhPWUuY2hlY2tlZH1mdW5jdGlvbiByKGkpe3ZhciBhPXt9O3JldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYobyh0KSl7dmFyIG49dC5jaGVja2VkLHI9dC52YWx1ZTtuJiYiIj09PXJ8fChhW2VdPXIpfWVsc2UgYVtlXT10fSksYX1mdW5jdGlvbiBpKGUpe3ZhciB0PXIoZSk7dShsLHQpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9cihlKTt1KGQsdCl9ZnVuY3Rpb24gcygpe3JldHVybiBsfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZH12YXIgdT1uKCIuL29iamVjdC1vdmVycmlkZSIpLGw9e30sZD17fTtlLmV4cG9ydHM9e21lcmdlUGFyYW1zOmksbWVyZ2VQYWdlTG9hZFBhcmFtczphLGdldFBhcmFtczpzLGdldFBhZ2VMb2FkUGFyYW1zOmN9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbW9kdWxlcy9vYmplY3Qtb3ZlcnJpZGUuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7dFtuXSE9PXImJihlW25dPXRbbl0pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIUFycmF5LmlzQXJyYXkodGhpcy5zdWJzZXQpfHwtMSE9PXRoaXMuc3Vic2V0LmluZGV4T2YoZSl9ZS5leHBvcnRzPWZ1bmN0aW9uKHQsbixlKXtPYmplY3Qua2V5cyhuKS5maWx0ZXIoaSx7c3Vic2V0OmV9KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IodCxuLGUpfSl9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbGlicmFyeVNldHRpbmdzLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD17dmVyc2lvbjoiMi4zLjIifTtlLmV4cG9ydHM9e1RBUkdFVF9ERUZBVUxUX1NFVFRJTkdTOnR9fX0sImFkb2JlLXRhcmdldC12Mi9saWIvbW9kdWxlcy9wYWdlLWxvYWQuanMiOntzY3JpcHQ6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCIuLi9saWJyYXJ5U2V0dGluZ3MiKSxpPW4oIkBhZG9iZS9yZWFjdG9yLXdpbmRvdyIpLGE9bigiLi9vYmplY3Qtb3ZlcnJpZGUiKSxvPW4oIi4vcGFyYW1zLXN0b3JlIikscz1vLmdldFBhcmFtcyxjPW8uZ2V0UGFnZUxvYWRQYXJhbXMsdT1uKCIuLi90YXJnZXRTZXR0aW5ncyIpLnRhcmdldFNldHRpbmdzO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdS5tYm94UGFyYW1zPXMoKSx1Lmdsb2JhbE1ib3hQYXJhbXM9YygpLGEodSxlLFsiYm9keUhpZGluZ0VuYWJsZWQiLCJib2R5SGlkZGVuU3R5bGUiXSksYSh1LGkudGFyZ2V0R2xvYmFsU2V0dGluZ3N8fHt9LFsiZW5hYmxlZCIsImJvZHlIaWRpbmdFbmFibGVkIiwiYm9keUhpZGRlblN0eWxlIl0pLGEodSxyLlRBUkdFVF9ERUZBVUxUX1NFVFRJTkdTfHx7fSxbInZlcnNpb24iXSksdX19fX0sc2V0dGluZ3M6e3RhcmdldFNldHRpbmdzOntlbmFibGVkOiEwLHRpbWVvdXQ6M2UzLHZlcnNpb246IjIuMi4wIixlbmRwb2ludDoiL3Jlc3QvdjEvZGVsaXZlcnkiLGltc09yZ0lkOiIxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmciLGNsaWVudENvZGU6ImZlZGV4IixzZWN1cmVPbmx5OiExLHNlcnZlclN0YXRlOnt9LG9wdGluRW5hYmxlZDohMSxzZXJ2ZXJEb21haW46ImZlZGV4LnR0Lm9tdHJkYy5uZXQiLHVybFNpemVMaW1pdDoyMDQ4LHZpZXdzRW5hYmxlZDohMCxvcHRvdXRFbmFibGVkOiExLGJvZHlIaWRkZW5TdHlsZToiYm9keSB7b3BhY2l0eTogMH0iLHBhZ2VMb2FkRW5hYmxlZDohMCxhbmFseXRpY3NMb2dnaW5nOiJzZXJ2ZXJfc2lkZSIsZGV2aWNlSWRMaWZldGltZTo2MzI0NDhlNSxib2R5SGlkaW5nRW5hYmxlZDohMCxzZXNzaW9uSWRMaWZldGltZToxODZlNCx2aXNpdG9yQXBpVGltZW91dDoyZTMsYXV0aG9yaW5nU2NyaXB0VXJsOiIvL2Nkbi50dC5vbXRyZGMubmV0L2Nkbi90YXJnZXQtdmVjLmpzIixvdmVycmlkZU1ib3hFZGdlU2VydmVyOiExLHNlbGVjdG9yc1BvbGxpbmdUaW1lb3V0OjVlMyxkZWZhdWx0Q29udGVudEhpZGRlblN0eWxlOiJ2aXNpYmlsaXR5OiBoaWRkZW47IixkZWZhdWx0Q29udGVudFZpc2libGVTdHlsZToidmlzaWJpbGl0eTogdmlzaWJsZTsiLG92ZXJyaWRlTWJveEVkZ2VTZXJ2ZXJUaW1lb3V0OjE4NmU0LHN1cHBsZW1lbnRhbERhdGFJZFBhcmFtVGltZW91dDozMH19LGhvc3RlZExpYkZpbGVzQmFzZVVybDoiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVAyNjk3OTJhYTczMTk0NTdlYTdkZDY3MGQzZjJmNjhlNS8ifSxjb250ZW50c3F1YXJlOntkaXNwbGF5TmFtZToiQ29udGVudFNxdWFyZSIsbW9kdWxlczp7ImNvbnRlbnRzcXVhcmUvc3JjL2xpYi9hY3Rpb25zL3V4YUluc3RhbGxhdGlvbi5qcyI6e25hbWU6InV4YS1pbnN0YWxsYXRpb24iLGRpc3BsYXlOYW1lOiJNYWluIFRyYWNraW5nIFRhZyBpbnN0YWxsYXRpb24iLHNjcmlwdDpmdW5jdGlvbihlLHQsbixvKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciByLGksYT1vLmdldEV4dGVuc2lvblNldHRpbmdzKCk7IiIhPT1lLnNldFBhdGhJbnB1dD8ocj1lLnNldFBhdGhJbnB1dCxyKz13aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKCIjIiwiP19fIikpOnI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lK3dpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoIiMiLCI/X18iKSxpPSIiIT09ZS5zZXRRdWVyeUlucHV0P2Uuc2V0UXVlcnlJbnB1dDp3aW5kb3cubG9jYXRpb24uc2VhcmNoLGZ1bmN0aW9uKCl7d2luZG93Ll91eGE9d2luZG93Ll91eGF8fFtdLHdpbmRvdy5fdXhhLnB1c2goWyJzZXRQYXRoIixyXSksd2luZG93Ll91eGEucHVzaChbInNldFF1ZXJ5IixpXSk7dHJ5e2lmKDE8YS5jdmFycy5sZW5ndGgpZm9yKHZhciBlPTE7ZTxhLmN2YXJzLmxlbmd0aDtlKyspd2luZG93Ll91eGEucHVzaChbInNldEN1c3RvbVZhcmlhYmxlIixlLGEuY3ZhcnNbZV0ua2V5LGEuY3ZhcnNbZV0udmFsdWUsM10pfWNhdGNoKG4pe31pZigidW5kZWZpbmVkIj09dHlwZW9mIENTX0NPTkYpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3QudHlwZT0idGV4dC9qYXZhc2NyaXB0Iix0LmFzeW5jPSEwLHQuc3JjPSIvL3QuY29udGVudHNxdWFyZS5uZXQvdXhhLyIrYS5wcm9qZWN0X2lkKyIuanMiLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQodCl9ZWxzZSB3aW5kb3cuX3V4YS5wdXNoKFsidHJhY2tQYWdldmlldyJdKX0oKX19fX0sc2V0dGluZ3M6e2N2YXJzOltdLHByb2plY3RfaWQ6IiV0YWdJRDpjb250ZW50U3F1YXJlJSJ9LGhvc3RlZExpYkZpbGVzQmFzZVVybDoiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVBhYmM0MDI2OTA4MmY0MzQ4YmE4ZmFmMmM2NmM3OTk3Yy8ifX0sY29tcGFueTp7b3JnSWQ6IjFFMjIxNzFCNTIwRTkzQkYwQTQ5MEQ0NEBBZG9iZU9yZyJ9LHByb3BlcnR5OntuYW1lOiJGZWRFeCIsc2V0dGluZ3M6e2RvbWFpbnM6WyJmZWRleC5jb20iXSx1bmRlZmluZWRWYXJzUmV0dXJuRW1wdHk6ITEscnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkOiExfX0scnVsZXM6W3tpZDoiUkw0NDM1NDU0ZGExYTE0MGQyOGJjMWEzNWY1ZGY5YjU1ZiIsbmFtZToiZ1RhZzpHbG9iYWwiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciBlPV9mZHgucGNmVXRpbCgpLm1hdGNoKC93d3coc2JveC5pZGV2fGJhc2UuaWRldnxkZXYuaWRldnxkcnQuaWRldnxzdHJlc3MuZG16LmlkZXZ8Yml0LmlkZXZ8dGVzdHwpLmZlZGV4LmNvbS9naSksdD0iIj09X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWdEaXNhYmxlTG9jYWxlIik7cmV0dXJuIShudWxsPT09ZXx8IXQpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTonXHgzYyEtLSBMb2dpYyB0byBmZXRjaCBHVEFHIEdsb2JhbCBEQyAmIEFXIElEIC0tXHgzZVxuXHgzYyEtLSBcbi8vU3RhcnQgb2YgZ2xvYmFsIHNuaXBwZXQ6IFBsZWFzZSBkbyBub3QgcmVtb3ZlXG4vL1BsYWNlIHRoaXMgc25pcHBldCBiZXR3ZWVuIHRoZSA8aGVhZD4gYW5kIDwvaGVhZD4gdGFncyBvbiBldmVyeSBwYWdlIG9mIHlvdXIgc2l0ZS5cbi0tXHgzZVxuXHgzYyEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gRG91YmxlQ2xpY2sgLS1ceDNlXG48c2NyaXB0PlxudmFyIGNvbmZpZ0RDSUQgPSAiIjtcbnZhciBjb25maWdBV0lEID0gIiI7XG52YXIgb2JqQ29uZmlnID0gX3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6Q29uZmlnTG9naWMiKTtcbi8vdmFyIGNudHJ5X2NvZGUgPSBGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8uY291bnRyeTtcbmlmICh0eXBlb2Ygb2JqQ29uZmlnICE9PSAidW5kZWZpbmVkIiAmJiBvYmpDb25maWcgIT09ICIiKSB7XG5cdGNvbmZpZ0RDSUQgPSBvYmpDb25maWdbIkRDQ29uZmlnSUQiXTtcblx0Y29uZmlnQVdJRCA9IG9iakNvbmZpZ1siQVdDb25maWdJRCJdO1xufVxuLy9HbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIFxuaWYgKHR5cGVvZiBndGFnID09IFwndW5kZWZpbmVkXCcpe1xuXHR2YXIgc2MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtcblx0aWYoKF9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkVuYWJsZWRMb2NhbGVFcGljIikpICE9PSAiIikge1xuXHRcdHNjLnNldEF0dHJpYnV0ZSgic3JjIiwgImh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9REMtMTk4MjU3NCIpXG5cdH1cblxuXHRlbHNle1xuXHRcdGlmKGNvbmZpZ0RDSUQgIT09ICIiKXtcblx0XHRcdHNjLnNldEF0dHJpYnV0ZSgic3JjIiwgImh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9IiArIGNvbmZpZ0RDSUQpXG5cdFx0fVxuXHRcdGVsc2UgaWYoY29uZmlnQVdJRCAhPT0gIiIpe1xuXHRcdFx0c2Muc2V0QXR0cmlidXRlKCJzcmMiLCAiaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0iICsgY29uZmlnQVdJRClcblx0XHR9XG5cdH1cblx0c2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvamF2YXNjcmlwdCIpO1xuXHRzYy5zZXRBdHRyaWJ1dGUoXCdhc3luY1wnLCB0cnVlKTtcblx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzYyk7XG5cdHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdO1xuXHRmdW5jdGlvbiBndGFnKCkge1xuXHRcdGRhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7XG5cdH1cblx0Z3RhZyhcJ2pzXCcsIG5ldyBEYXRlKCkpO1xufVxuZWxzZXtcblx0aWYoKF9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkVuYWJsZWRMb2NhbGVFcGljIikpICE9PSAiIil7XG5cdGd0YWcoXCdjb25maWdcJywgXCdEQy0xOTgyNTc0XCcpO1x0XG59XG5cdGVsc2V7XG5cblx0XHRpZiAoY29uZmlnRENJRCAhPT0gIiIpIHtcblx0XHRcdGd0YWcoXCdjb25maWdcJywgY29uZmlnRENJRCwge1xuXHRcdFx0XHRcJ3BhZ2VfbG9jYXRpb25cJyA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL2VtYWlsPVteJjtdKi9naSxcblx0XHRcdFx0XCdlbWFpbD1yZWRhY3RlZFwnKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGNvbmZpZ0FXSUQgIT09ICIiKSB7XG5cdFx0XHRndGFnKFwnY29uZmlnXCcsIGNvbmZpZ0FXSUQsIHtcblx0XHRcdFx0XCdwYWdlX2xvY2F0aW9uXCcgOiB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9lbWFpbD1bXiY7XSovZ2ksXG5cdFx0XHRcdFwnZW1haWw9cmVkYWN0ZWRcJylcblx0XHRcdH0pO1xuXHRcdH1cblxuXHR9XG59XG5cblxuXG48XC9zY3JpcHQ+XG5ceDNjIS0tIEVuZCBvZiBnbG9iYWwgc25pcHBldDogUGxlYXNlIGRvIG5vdCByZW1vdmUgLS1ceDNlXG5cbicsbGFuZ3VhZ2U6Imh0bWwifX1dfSx7aWQ6IlJMNTY4MGE1YWI2Y2M4NGQ0MTg3N2M4ZGVlYmVlY2M4Y2UiLG5hbWU6ImFkVGFnOnRyYWRlZGVzayIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9saWJyYXJ5TG9hZGVkLmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJ0cmFkZWRlc2s6cGFnZUxpc3RNYXBwaW5nIiksdD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKSxfc2F0ZWxsaXRlLnNldFZhcigidHJhZGVkZXNrVVJMIixfZmR4LnBhZ2VGbGFnKGUsdCkpLCExIT09X3NhdGVsbGl0ZS5nZXRWYXIoInRyYWRlZGVza1VSTCIpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTonPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7IiBhbHQ9IiIgc3JjPSV0cmFkZWRlc2tVUkwlIC8+JyxsYW5ndWFnZToiaHRtbCJ9fV19LHtpZDoiUkwzMDMyMjc1MTExYjQ0NTY2YWQ5ODU2NjgxZTI3YWVmMyIsbmFtZToiTUFHSUMgUE9DIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2N1c3RvbUV2ZW50LmpzIixzZXR0aW5nczp7dHlwZToiZXZlbnQtdmlldy1zdGFydCIsZWxlbWVudFNlbGVjdG9yOiJib2R5IixidWJibGVGaXJlSWZDaGlsZEZpcmVkOiExfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOltdLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM4YzY5ZDE4YWVkZGU0NTg4OWE2ZTA1YWU0YmRkYTRjZi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTGM0ZGRlNTU0OWVlYjRmOTA4YzAwMGMxYTZlYjVhY2EzIixuYW1lOiJzcDpkaXJlY3RIaXRzIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJzZWFyY2g9dHJ1ZSIsdmFsdWVJc1JlZ2V4OiEwfV19fSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiEodm9pZCAwIT09X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6RGVsYXllZCBQYWdlIFR5cGUiKSYmImRlbGF5ZWQiPT1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZSIpfHwtMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJzZWFyY2guaHRtbD9xPSIpfHwtMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJyZWdpc3Rlci5odG1sIil8fC0xPHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIi9vbmxpbmUvcmF0aW5nLmh0bWwiKSl9fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcyIsc2V0dGluZ3M6e2N1c3RvbVNldHVwOntzb3VyY2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj0obmV3IFVSTFNlYXJjaFBhcmFtcykuZ2V0KCJzcHRlcm0iKTt2b2lkIDAhPT1uJiYiIiE9biYmbnVsbCE9PW4/KG49bi5yZXBsYWNlKC9cOy4qLywiIiksdC5wcm9wMT10LmVWYXIxPW4sdC5saW5rVHJhY2tFdmVudHM9dC5ldmVudHM9dC5hcGwodC5ldmVudHMsImV2ZW50MTE4IiwiLCIsMikpOnQubGlua1RyYWNrRXZlbnRzPXQuZXZlbnRzPXQuYXBsKHQuZXZlbnRzLCJldmVudDExOSIsIiwiLDIpfX0sdHJhY2tlclByb3BlcnRpZXM6e319fSx7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzIixzZXR0aW5nczp7dHlwZToicGFnZSJ9fV19LHtpZDoiUkxiOGQ3MGY2Y2JhNTI0M2U4YjU1M2EyZGY3M2UxYmZmZCIsbmFtZToiZ1RhZzpUYXJnZXRWaWRlb0V4cGVyaWVuY2UiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6Ii52anMtYmlnLXBsYXktYnV0dG9uIixidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiIvZW4tdXMvZWNvbW1lcmNlLyhzaGlwcGluZy1vcHRpb25zLmh0bWx8dG9vbHMtYW5kLXNlcnZpY2VzLmh0bWwpIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6VGFyZ2V0VmlkZW9NYXBwaW5nIiksdD10aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvLWlkIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJ0YXJnZXRWaWRlb0d0YWdMYWJlbCIsbiksITEhPT1ufX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDOTIwYmMxYTNhZWM4NDc5NzkwZjIxZjc1NjVmZThhOTgtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkxiN2IzMDAxYzY2ZTk0ZTEyODZmMGM4MTU3YmEwNjMwNSIsbmFtZToidmlkZW86UGxheSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMiLHNldHRpbmdzOnt1bml0OiJwZXJjZW50IixhbW91bnQ6MSxlbGVtZW50U2VsZWN0b3I6Ii5icmlnaHRjb3ZlLWNvbnRhaW5lciB2aWRlbyIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITF9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzIixzZXR0aW5nczp7Y3VzdG9tU2V0dXA6e3NvdXJjZTpmdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5wYXJlbnRFbGVtZW50KXtmb3IodmFyIG49dGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSxyPXRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8taWQiKSxpPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImJyaWdodGNvdmUtY29udGFpbmVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKWlmKG49PWlbYV0uZ2V0QXR0cmlidXRlKCJkYXRhLXBsYXllcmlkIikpe3ZhciBvPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZqcy1kb2NrLXRpdGxlIik7dC5lVmFyNDI9b1thXS5pbm5lclRleHQsdC5lVmFyMzE9cix0LmxpbmtUcmFja1ZhcnM9dC5hcGwodC5saW5rVHJhY2tWYXJzLCJlVmFyNDIsZVZhcjMxIiwiLCIsMil9dC5saW5rVHJhY2tFdmVudHM9dC5ldmVudHM9ImV2ZW50MjAzIn19fSx0cmFja2VyUHJvcGVydGllczp7fX19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rTmFtZToiVmlkZW86UGxheSIsbGlua1R5cGU6Im8ifX1dfSx7aWQ6IlJMNjJkZDBiNmJkZmYxNGY3ZDk0MjkyY2YzMjRjNWUyMmUiLG5hbWU6ImdUYWdJbmRpYTpBZHdvcmRzIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJcXC9lbi1pblxcLyh0cmFja2luZ3xob21lfGNvcm9uYXZpcnVzfHNoaXBwaW5nfGJpbGxpbmcpLmh0bWwiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiJcXC9lbi1pblxcLyhjdXN0b21lci1zdXBwb3J0fG9wZW4tYWNjb3VudHxjdXN0b21zLXRvb2xzfGNvbmRpdGlvbnMtb2YtY2FycmlhZ2UpLmh0bWwiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiJcXC9lbi1pblxcLyhhYm91dHxjYW1wYWlnbnxvcGVuLWFjY291bnR8c2hpcHBpbmd8dHJ1c3QtY2VudGVyfG9ubGluZSlcXC8ocG9zc2liaWxpdGllc3xkZWxpdmVyaW5nLXdoYXQtbWF0dGVyc3xzdGFydC1zaGlwcGluZ3xzdXJjaGFyZ2VzfGdldHN0YXJ0ZWR8cmVzb3VyY2VzfHJhdGVzfHNtYWxsLWJ1c2luZXNzfHJlcG9ydC1mcmF1ZHxyYXRpbmcpLmh0bWwiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiJcXC9lbi1pblxcL2Fib3V0XFwvcG9zc2liaWxpdGllc1xcL2FydGljbGVzXFwvZmxvd2Vycy5odG1sIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvZW4taW5cXC9hYm91dFxcL3Bvc3NpYmlsaXRpZXNcXC9tYWtpbmctaXQtd29yay5odG1sIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvZW4taW5cXC9zaGlwcGluZ1xcL2luZHVzdHJ5LXNvbHV0aW9uc1xcLyhoZWFsdGhjYXJlLmh0bWx8KGhlYWx0aGNhcmVcXC90ZW1wZXJhdHVyZS1jb250cm9sLmh0bWwpfChoZWFsdGhjYXJlXFwvY29udGFjdC11cy5odG1sKSkiLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJndGFnKCdldmVudCcsICdwYWdlX3ZpZXcnLCB7XG4gICAgJ3NlbmRfdG8nOiAnQVctNjczNjgxODI5Jyxcbn0pOyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQifX1dfSx7aWQ6IlJMMzRjZWZjOTU5ZmRhNGE1NmE5YjViMGYzYzI0YTEyOGEiLG5hbWU6ImdUYWc6QnV0dG9uRXZlbnQiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6IiNzdWJzY3JpYmVidXR0b24iLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiExfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiBfc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyIpIT09dW5kZWZpbmVkJiZudWxsIT09X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKSYmIiIhPT1fc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyIpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDYjY3ZDM0Njk0YTVmNGEzN2JlMTZjMDBhNmM3OTY3NWItc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkxiNzBhODUzYjBiN2Q0NDQxOWU2ZjdmNTg3YzAyMmJkMiIsbmFtZToiZXZlbnQ6c29jaWFsIHNoYXJlIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJpbWciLGVsZW1lbnRQcm9wZXJ0aWVzOlt7bmFtZToiZGF0YS1hbmFseXRpY3MiLHZhbHVlOiJzb2NpYWwiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWFuYWx5dGljcyIpO3JldHVybiEoMDw9ZS5pbmRleE9mKCJOZXdzbGV0dGVyIikmJihmZHhfc2V0TGlua1ZpZXcoZSksMSkpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMiLHNldHRpbmdzOntjdXN0b21TZXR1cDp7c291cmNlOmZ1bmN0aW9uKGUsdCl7dC5saW5rVHJhY2tWYXJzPXQuYXBsKHQubGlua1RyYWNrVmFycywicHJvcDE4LHByb3AxOSxwcm9wMjAsZVZhcjY1IiwiLCIsMiksdC5ldmVudHM9dC5hcGwodC5ldmVudHMsImV2ZW50NTYiLCIsIiwyKSwiTm9uZSIhPT10LmxpbmtUcmFja0V2ZW50cz90LmxpbmtUcmFja0V2ZW50cz10LmxpbmtUcmFja0V2ZW50cysiLGV2ZW50NTYiOnQubGlua1RyYWNrRXZlbnRzPSJldmVudDU2Iix3aW5kb3cubmx0cms9InkiO3ZhciBuPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWFuYWx5dGljcyIpOyJ1bmRlZmluZWQiIT09biYmbnVsbCE9PW4mJih0LmVWYXI2NT1uLnN1YnN0cmluZyhuLmxhc3RJbmRleE9mKCJ8IikrMSksdC5wcm9wMTg9dC5wYWdlTmFtZSx0LnByb3AxOT1uLHQucHJvcDIwPXQucGFnZU5hbWUrIiB8ICIrbil9fSx0cmFja2VyUHJvcGVydGllczp7fX19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rVHlwZToibyJ9fV19LHtpZDoiUkwyZmRlNWU0MDhlNWI0Nzk2YjExNjZkNzQxMDkwMjUzYyIsbmFtZToiZXZlbnQ6aHAgbGluayBjbGljayIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2VsZW1lbnRTZWxlY3RvcjoiYSIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJkYXRhLWFuYWx5dGljcyIsdmFsdWU6Ii4qIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMX0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKT90aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKToiIjtzLmxpbmtOYW1lPWU7dmFyIHQ9dm9pZCAwIT09dGhpcy5nZXRBdHRyaWJ1dGUoInRhcmdldCIpJiZudWxsIT09dGhpcy5nZXRBdHRyaWJ1dGUoInRhcmdldCIpJiYiIiE9PXRoaXMuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKT8ibmV3UGFnZSI6InNhbWVQYWdlIjtpZigiIiE9ZSYmLTE8ZS5pbmRleE9mKCJtZnhyIikmJih0PSJzYW1lUGFnZSIpLCJzYW1lUGFnZSI9PXQmJi0xPGUuaW5kZXhPZigiL2NvbnRlbnQvZGFtL2ZlZGV4IikpcmV0dXJuIHQ9IiIsITE7dmFyIG49X3NhdGVsbGl0ZS5nZXRWYXIoImNsaWNrOmJsb2NrRmxhZyIpKGUsImNsaWNrOmJsb2NrTGlzdCIpLHI9e2hlcm86ImV2ZW50MjAwIn07aWYoIWV8fG4pcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGE9IiIsRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZT0iIiwhMTtpZigibmV3UGFnZSI9PXQpcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGE9IiIsRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZT0iIixmZHhfc2V0TGlua1ZpZXcoZSksITE7aWYoInNhbWVQYWdlIj09dCl7dmFyIGk9cltlLnNwbGl0KCJ8IilbMF0udG9Mb3dlckNhc2UoKV07cmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGE9IiIsRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZT0iIiwtMTx0aGlzLmhyZWYuaW5kZXhPZigidGVsOiIpfHxmZHhfbG9nTGlua1ZpZXcoZSxpKSwhMX19fX1dLGFjdGlvbnM6W119LHtpZDoiUkwyMTQ4ODhiMjA5ZWY0NTA2OWIyOGI3MGY2YzQzYTVkMyIsbmFtZToiZmJUYWc6R2xvYmFsIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJcXC9lbi11c1xcL3NoaXBwaW5nXFwvKChmcmVpZ2h0LXNlcnZpY2VzKXwoc2NoZWR1bGUtbWFuYWdlLXBpY2t1cHMpfChzdG9yZVxcL2dyb3VuZCl8KHBhY2tpbmctc3VwcGxpZXMpfChwYWNraW5nLXN1cHBsaWVzXFwvY3VzdG9tLWJyYW5kZWQtYm94ZXMpfChvZmZpY2UtZGVwb3Qtb2ZmaWNlbWF4KXwoaG9sZC1hdC1sb2NhdGlvbikpLmh0bWwiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiJcXC9lbi11c1xcL3NoaXBwaW5nXFwvcmV0dXJucygoKFxcL2J1c2luZXNzKXwoXFwvdGVjaG5vbG9neSkpXFwuaHRtbHxcXC5odG1sKSIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcL2VuLXVzXFwvc2hpcHBpbmdcXC9vbnNpdGUoKChcXC93YWxncmVlbnMtcGFja2FnZS1waWNrdXApfChcXC9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UpfChcXC90YXJnZXQtcGljay11cC1kcm9wLW9mZi1wYWNrYWdlKSlcXC5odG1sfFxcLmh0bWwpIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvZW4tdXNcXC9wcmludGluZ1xcLygoc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycyl8KGNvbnN1bWVyLW9mZmVycyl8KGZsYXNoLXNhbGUtb2ZmZXJzKXwocGFzc3BvcnQtcGhvdG8pfChuYXRpb25hbC1iaWQtY2VudGVyKXwoYnVzaW5lc3Mtc29sdXRpb25zXFwva25vd2xlZGdlLWNlbnRlcil8KGRlc2lnbi1zZXJ2aWNlcykpXFwuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcL2VuLXVzXFwvZGlzY291bnQtcHJvZ3JhbXNcXC8oZW0xNTY5MjExM3xlbTE1NjkyMjEzfGVtMTU2OTIwMTN8YWcxMzM5ODYwMilcXC5odG1sIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvZW4tdXNcXC9kZWxpdmVyeS1tYW5hZ2VyKChcXC9ob3ctdG8tcHJldmVudC1zdG9sZW4tbWlzc2luZy1wYWNrYWdlc3xcXC9tYW5hZ2UteW91ci1kZWxpdmVyaWVzKS5odG1sfC5odG1sKSIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6Ii9lbi11cy9ob21lLmh0bWw/bG9jYXRpb249aG9tZSJ9LHt2YWx1ZToiXFwvZW4tdXNcXC8ocG9zc2liaWxpdGllc3xvZmZpY2VcXC93YWxtYXJ0fGNyZWF0ZS1hY2NvdW50fGJpZy1jb21tZXJjZXxjb3Vwb24tb2ZmZXJzXFwvZ3JvdW5kfGhlYWx0aGNhcmVcXC92YWNjaW5lLXNoaXBwaW5nfGVjb21tZXJjZVxcL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dCkuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcL2VuLXVzXFwvKHNtYWxsLWJ1c2luZXNzfHN1c3RhaW5hYmlsaXR5KS5odG1sIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvZW4tdXNcXC9ob2xpZGF5KFxcL2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWx8Lmh0bWwpIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiXHgzYyEtLSBGYWNlYm9vayBQaXhlbCBDb2RlIC0tXHgzZVxuPHNjcmlwdD5cbiAgIWZ1bmN0aW9uKGYsYixlLHYsbix0LHMpXG4gIHtpZihmLmZicSlyZXR1cm47bj1mLmZicT1mdW5jdGlvbigpe24uY2FsbE1ldGhvZD9cbiAgbi5jYWxsTWV0aG9kLmFwcGx5KG4sYXJndW1lbnRzKTpuLnF1ZXVlLnB1c2goYXJndW1lbnRzKX07XG4gIGlmKCFmLl9mYnEpZi5fZmJxPW47bi5wdXNoPW47bi5sb2FkZWQ9ITA7bi52ZXJzaW9uPScyLjAnO1xuICBuLnF1ZXVlPVtdO3Q9Yi5jcmVhdGVFbGVtZW50KGUpO3QuYXN5bmM9ITA7XG4gIHQuc3JjPXY7cz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpWzBdO1xuICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQscyl9KHdpbmRvdywgZG9jdW1lbnQsJ3NjcmlwdCcsXG4gICdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL2ZiZXZlbnRzLmpzJyk7XG4gIGZicSgnaW5pdCcsICczOTg2MTM4NTM5OTkyOTcnKTtcbiAgZmJxKCd0cmFjaycsICdQYWdlVmlldycpO1xuPFwvc2NyaXB0PlxuPG5vc2NyaXB0PjxpbWcgaGVpZ2h0PVwiMVwiIHdpZHRoPVwiMVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCJcbiAgc3JjPVwiaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3RyP2lkPTM5ODYxMzg1Mzk5OTI5NyZldj1QYWdlVmlldyZub3NjcmlwdD0xXCJcbi8+PC9ub3NjcmlwdD5cblx4M2MhLS0gRW5kIEZhY2Vib29rIFBpeGVsIENvZGUgLS1ceDNlIixsYW5ndWFnZToiaHRtbCJ9fV19LHtpZDoiUkxjODU4ZjFkNjE1MGY0YmY0YWYwMzVhNDExY2MyMzIyMyIsbmFtZToiZXZlbnQ6cGhvbmUgY2xpY2siLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6ImEiLGVsZW1lbnRQcm9wZXJ0aWVzOlt7bmFtZToiaHJlZiIsdmFsdWU6InRlbDoiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigidGVsZSIsdGhpcy50ZXh0KSwhMH19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzIixzZXR0aW5nczp7Y3VzdG9tU2V0dXA6e3NvdXJjZTpmdW5jdGlvbihlLHQpe3QubGlua1RyYWNrRXZlbnRzPXQuZXZlbnRzPXQuYXBsKHQuZXZlbnRzLCJldmVudDEiLCIsIiwyKX19LHRyYWNrZXJQcm9wZXJ0aWVzOntlVmFyczpbe25hbWU6ImVWYXIxNDciLHR5cGU6InZhbHVlIix2YWx1ZToiJXRlbGUlIn1dfX19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rTmFtZToiUGhvbmUgTnVtYmVyIixsaW5rVHlwZToibyJ9fV19LHtpZDoiUkwwNjAxNTk2ZTQxZDE0Nzk4OWU2NWRhNTZmZGIyMGMzNiIsbmFtZToib25lVGFnOkZsYXNodGFsa2luZyBUYWciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiRmxhc2hUYWxraW5nOnBhZ2VMaXN0TWFwcGluZyIpLHQ9d2luZG93LmxvY2F0aW9uLmhyZWY7dD0vLmNvbSguKikvLmV4ZWModClbMV07dmFyIG49MWUxMyooTWF0aC5yYW5kb20oKSsiIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgcj1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIDAhPXImJihfc2F0ZWxsaXRlLnNldFZhcigiZmxhc2h0YWxraW5nVVJMIixyK24pLCEwKX19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6JzxpZnJhbWUgc3JjPSVmbGFzaHRhbGtpbmdVUkwlIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZyYW1lYm9yZGVyPSIwIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGUiPjwvaWZyYW1lPicsbGFuZ3VhZ2U6Imh0bWwifX1dfSx7aWQ6IlJMODdlZTVhY2ViMTQ1NGU4ZGEyY2EwNzM1OTY0NTcwYmQiLG5hbWU6ImdUYWc6YnRuQVciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6ImEuZnhnLWxpbmsuanMtZnhnYy1pbml0LmRlZmF1bHQuZnhnLWxpbmstLWFsaWduLWxlZnQuZnhnLWxpbmstLW1vYmlsZS1hbGlnbi1jZW50ZXIiLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tbWQuZnhnLWxpbmstLXJvdW5kZWRfYnV0dG9uLmZ4Zy1saW5rLS1hbGlnbi1sZWZ0LnN1cC5zdWIiLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tYmx1ZS5meGctbGluay0tbW9iaWxlLWFsaWduLWNlbnRlciIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo1MH0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6ImEuZnhnLWxpbmsuanMtZnhnYy1pbml0LmZ4Zy1saW5rLS1yb3VuZGVkX2J1dHRvbi5meGctbGluay0tYWxpZ24tY2VudGVyLmZ4Zy1saW5rLS1tb2JpbGUtYWxpZ24tY2VudGVyIixidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2VsZW1lbnRTZWxlY3RvcjoiYS5meGctbGluay5qcy1meGdjLWluaXQuZnhnLWxpbmstLXJvdW5kZWRfYnV0dG9uLmZ4Zy1idXR0b24tLXJvdW5kLmZ4Zy1saW5rLS1hbGlnbi1jZW50ZXIuZnhnLWxpbmstLW1vYmlsZS1hbGlnbi1jZW50ZXIiLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1zdWJtaXQuZnhnLWJ1dHRvbi0tb3JhbmdlLmpzLWNtcy1mb3JtLXN1Ym1pdCIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6YnRuQVdQYWdlTGlzdE1hcHBpbmciKSx0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciBuPV9mZHgucGFnZUZsYWcoZSx0KTtpZigib2JqZWN0IiE9dHlwZW9mIG4pcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJhd0xhYmVsIixuKSwhMSE9PW47dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmNsYXNzTmFtZSksaT10aGlzO3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigiYXdMYWJlbCIsX2ZkeC5nZXRHdGFnTGFiZWwobixyLGkpKSwhMH19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2E0M2IyMjk2ZDliMzQzNmJiNGU3NGIwMzA2NDc1OTkwLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMMmM5YTZlNmY2Njc2NDI5OGI3YjEyZjczMzZiNmY4MmMiLG5hbWU6ImFkVGFnOmRmYSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJkZmE6cGFnZUxpc3RNYXBwaW5nIiksdD1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpjb3VudHJ5Q29kZSIpLG49d2luZG93LmxvY2F0aW9uLmhyZWY7bj0vLmNvbSguKikvLmV4ZWMobilbMV07dmFyIHI9MWUxMyooTWF0aC5yYW5kb20oKSsiIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgaT1fZmR4LnBhZ2VGbGFnKGUsdCwiY291bnRyeSIpLGE9X2ZkeC5wYWdlRmxhZyhpLG4pO3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigiZGZhTGFiZWwiLGErciksITEhPT1hfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTonPGlmcmFtZSBzcmM9JWRmYUxhYmVsJSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9pZnJhbWU+JyxsYW5ndWFnZToiaHRtbCJ9fV19LHtpZDoiUkwwNjNkNWFhMDg1NmE0ZWZlYmI3OTMxOTBjNDFiZTcxNCIsbmFtZToiZXZlbnQ6Y3ViZSBjbGljayIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2VsZW1lbnRTZWxlY3RvcjoiZGl2IC5meGctY3ViZSIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJkYXRhLWFuYWx5dGljcyIsdmFsdWU6Imhlcm8uKiIsdmFsdWVJc1JlZ2V4OiEwfV0sYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMX0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj12b2lkIDAhPT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKT90aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKToiIixyPSh0PXZvaWQgMCE9PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWxpbmstdGFyZ2V0Iik/Im5ld1BhZ2UiOiJzYW1lUGFnZSIse2hlcm86ImV2ZW50MjAwIn0pO2lmKCFufHwtMTxuLmluZGV4T2YoIlRSQUNLIikpcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGE9IiIsRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZT0iIiwhKHdpbmRvdy5ubHRyaz0ieSIpO2lmKCJuZXdQYWdlIj09dClyZXR1cm4gRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsuZGF0YT0iIixGRFguREFUQUxBWUVSLnBhZ2UubGluay50eXBlPSIiLGZkeF9zZXRMaW5rVmlldyhuKSwhMTtpZigic2FtZVBhZ2UiPT10KXt2YXIgaT1yW24uc3BsaXQoInwiKVswXS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsuZGF0YT0iIixGRFguREFUQUxBWUVSLnBhZ2UubGluay50eXBlPSIiLGZkeF9sb2dMaW5rVmlldyhuLGkpLCExfX19fV0sYWN0aW9uczpbXX0se2lkOiJSTDQ2NTU5ZjE2OWNhZDQ5OWU4ZmEwYzRiMWZhOGE1MmQwIixuYW1lOiJ2aWRlbzo3NSUgVmlld2VkIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL21lZGlhVGltZVBsYXllZC5qcyIsc2V0dGluZ3M6e3VuaXQ6InBlcmNlbnQiLGFtb3VudDo3NSxlbGVtZW50U2VsZWN0b3I6Ii5icmlnaHRjb3ZlLWNvbnRhaW5lciB2aWRlbyIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITF9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzIixzZXR0aW5nczp7Y3VzdG9tU2V0dXA6e3NvdXJjZTpmdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5wYXJlbnRFbGVtZW50KXtmb3IodmFyIG49dGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSxyPXRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8taWQiKSxpPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImJyaWdodGNvdmUtY29udGFpbmVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKWlmKG49PWlbYV0uZ2V0QXR0cmlidXRlKCJkYXRhLXBsYXllcmlkIikpe3ZhciBvPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZqcy1kb2NrLXRpdGxlIik7dC5lVmFyNDI9b1thXS5pbm5lclRleHQsdC5lVmFyMzE9cix0LmxpbmtUcmFja1ZhcnM9dC5hcGwodC5saW5rVHJhY2tWYXJzLCJlVmFyNDIsZVZhcjMxIiwiLCIsMil9dC5saW5rVHJhY2tFdmVudHM9dC5ldmVudHM9ImV2ZW50MjA2In19fSx0cmFja2VyUHJvcGVydGllczp7fX19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rTmFtZToiVmlkZW86NzUlIFZpZXdlZCIsbGlua1R5cGU6Im8ifX1dfSx7aWQ6IlJMY2M1MmM5MDI5NDc0NDYwYzgwZjc1NjNjNzZmYzgyYWEiLG5hbWU6InRyYWRlZGVzazpldmVudEJ0bkNsaWNrVFREIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlIixlbGVtZW50UHJvcGVydGllczpbe25hbWU6ImRhdGEtYW5hbHl0aWNzIix2YWx1ZToiKGxpbmtcXHxGaW5kIGEgRG9sbGFyIEdlbmVyYWwpfChsaW5rXFx8U2lnbiB1cCBmb3IgZnJlZSl8KGhlcm9cXHxGaW5kIGEgV2FsZ3JlZW5zIE5lYXIgWW91KXwoaGVyb1xcfFNlZSBDdXJyZW50IE9mZmVycykiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tcm91bmRlZF9idXR0b24uZnhnLWJ1dHRvbi0tcm91bmQiLGVsZW1lbnRQcm9wZXJ0aWVzOlt7bmFtZToiZGF0YS1hbmFseXRpY3MiLHZhbHVlOiIobGlua1xcfHNpZ24gdXAgbm93KXwobGlua1xcfE5leHQgdGltZSB1c2UgRmVkRXggRGVsaXZlcnkgTWFuYWdlclxcfFNJR04gVVAgRk9SIEZSRUUpIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcL2VuLXVzXFwvc2hpcHBpbmdcXC9vbnNpdGVcXC8od2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwfGRvbGxhci1nZW5lcmFsLXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZSkuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcL2VuLXVzXFwvcHJpbnRpbmdcXC9jb25zdW1lci1vZmZlcnMuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcL2VuLXVzXFwvZGVsaXZlcnktbWFuYWdlci5odG1sIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoInRyYWRlZGVzazpidG5DbGlja1BhZ2VMaXN0TWFwcGluZyIpLHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtYW5hbHl0aWNzIikudG9Mb3dlckNhc2UoKTsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciBuPV9mZHgucGFnZUZsYWcoZSx0KTtyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoInRkUGl4ZWwiLG4pLCExIT09bn19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzk1ZmM4YzdkODA4NDQ4YjdhZjkzMTRmMWQ3YjM1ZjAyLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJodG1sIixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMYmNjMWE1MGNiYmYwNDJiNTlhMmY4M2I2M2M0YjY5OGQiLG5hbWU6InVzZXI6TG9nZ2VkIEluIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RhdGFFbGVtZW50Q2hhbmdlLmpzIixzZXR0aW5nczp7bmFtZToibG9naW46c3RhdHVzIn0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2Nvb2tpZS5qcyIsc2V0dGluZ3M6e25hbWU6ImZkeF9sb2dpbiIsdmFsdWU6Ii4qIix2YWx1ZUlzUmVnZXg6ITB9fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMiLHNldHRpbmdzOnt9fSx7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMiLHNldHRpbmdzOntjdXN0b21TZXR1cDp7c291cmNlOmZ1bmN0aW9uKGUsdCl7dC5saW5rVHJhY2tWYXJzPXQubGlua1RyYWNrVmFycysiLGV2ZW50cyIsdC5saW5rVHJhY2tFdmVudHM9dC5saW5rVHJhY2tFdmVudHMrIixldmVudDMsZXZlbnQ0IiwiIiE9PV9zYXRlbGxpdGUuZ2V0VmFyKCJsb2dpbjp1c2VyLWlkIikmJl9zYXRlbGxpdGUuZ2V0VmFyKCJsb2dpbjp1c2VyLWlkIikmJih0LmV2ZW50cz10LmFwbCh0LmV2ZW50cywiZXZlbnQzIiwiLCIsMiksdC5ldmVudHM9dC5hcGwodC5ldmVudHMsImV2ZW50NCIsIiwiLDIpKX19LHRyYWNrZXJQcm9wZXJ0aWVzOntlVmFyczpbe25hbWU6ImVWYXI0Iix0eXBlOiJ2YWx1ZSIsdmFsdWU6IiVsb2dpbjpzdGF0dXMlIn0se25hbWU6ImVWYXIxMyIsdHlwZToidmFsdWUiLHZhbHVlOiIlbG9naW46ZmR4X2NiaWQlIn0se25hbWU6ImVWYXI2MCIsdHlwZToidmFsdWUiLHZhbHVlOiIldXNlcjplbWFpbElEJSJ9LHtuYW1lOiJlVmFyNiIsdHlwZToidmFsdWUiLHZhbHVlOiIlbG9naW46dXNlci1pZCUifV0scHJvcHM6W3tuYW1lOiJwcm9wNCIsdHlwZToiYWxpYXMiLHZhbHVlOiJlVmFyNCJ9LHtuYW1lOiJwcm9wNiIsdHlwZToiYWxpYXMiLHZhbHVlOiJlVmFyNiJ9LHtuYW1lOiJwcm9wNzUiLHR5cGU6InZhbHVlIix2YWx1ZToiJXVzZXI6dXNlci1hZ2VudCUifSx7bmFtZToicHJvcDIiLHR5cGU6InZhbHVlIix2YWx1ZToiJWNvbnRlbnQ6Y291bnRyeUNvZGUlIn0se25hbWU6InByb3AzIix0eXBlOiJ2YWx1ZSIsdmFsdWU6IiVjb250ZW50Omxhbmd1YWdlJSJ9XX19fSx7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzIixzZXR0aW5nczp7dHlwZToibGluayIsbGlua05hbWU6ImhkcnxMb2dnZWQgSW4iLGxpbmtUeXBlOiJvIn19XX0se2lkOiJSTDAzYjNlMzhjYTRkODQ3N2VhNWM0MWNlMzllYTEyMDJlIixuYW1lOiJnVGFnOmJ0bkRDIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1zdWJtaXQuZnhnLWJ1dHRvbi0tb3JhbmdlLmpzLWNtcy1mb3JtLXN1Ym1pdCIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo0MH0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOnthbmNob3JEZWxheTo2MDAsZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tc20uZnhnLWxpbmstLXJvdW5kZWRfYnV0dG9uLmZ4Zy1saW5rLS1hbGlnbi1jZW50ZXIiLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NDB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOmJ0bkRDUGFnZUxpc3RNYXBwaW5nIiksdD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigiZGNMYWJlbCIsbiksITEhPT1uO3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLGk9dGhpcztyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoImRjTGFiZWwiLF9mZHguZ2V0R3RhZ0xhYmVsKG4scixpKSksITB9fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkNhYmRiMDYxODk3NTE0ZjVmOTg0ZTMzOGM1MDM0MmJlYi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTGFhY2ZhNWRhYmE3MTQwOTBiYzZjMTkyMjE1YWNlYWIyIixuYW1lOiJnVGFnOlRhcmdldEV4cGVyaWVuY2UiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOnthbmNob3JEZWxheToxMjAwLGVsZW1lbnRTZWxlY3RvcjoiYS5meGctYnV0dG9uLmZ4Zy1idXR0b24tLW9yYW5nZSIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJkYXRhLWFuYWx5dGljcyIsdmFsdWU6IihUUFxcfCkiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcL2VuLXVzXFwvc2hpcHBpbmdcXC8oaW50ZXJuYXRpb25hbC5odG1sfDctZGF5LWRlbGl2ZXJ5Lmh0bWx8aG9tZS1kZWxpdmVyeS5odG1sKSIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6Ii9lbi11cy9lY29tbWVyY2UvdG9vbHMtYW5kLXNlcnZpY2VzLmh0bWwifV19fSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOlRhcmdldEVuYWJsZWRNYXBwaW5nIiksdD10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKTsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciBuPV9mZHgucGFnZUZsYWcoZSx0KTtyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoInRhcmdldEd0YWdMYWJlbCIsbiksITEhPT1ufX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDM2I1MGFjYzUwOTQyNDUyNmE5MjAwODg2NWEzYTg4MjEtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkxlMWU5YzI1ZGQ5MTk0M2JmYmJiYmI5M2UzODY2MmNiNCIsbmFtZToidGFyZ2V0OmxvZ2luIHN0YXR1cyB0cmlnZ2VyIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIGFkb2JlLnRhcmdldCE9PXVuZGVmaW5lZH19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6J2lmICh0eXBlb2YgKGFkb2JlLnRhcmdldCkgIT0gInVuZGVmaW5lZCIpe1xuJCgiYm9keSIpLm9uKCJsb2dnZWRJbiIsIGZ1bmN0aW9uIChlKSB7XG4gIGFkb2JlLnRhcmdldC5nZXRPZmZlcnMoe1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIGV4ZWN1dGU6IHtcbiAgICAgICAgcGFnZUxvYWQ6IHtcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBsb2dnZWRJbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gYWRvYmUudGFyZ2V0LmFwcGx5T2ZmZXJzKHtcbiAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxuICAgIH0pO1xuICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gO1xuICB9KTtcbn0pO1xuJCgiYm9keSIpLm9uKCJsb2dnZWRPdXQiLCBmdW5jdGlvbiAoKSB7XG4gIGFkb2JlLnRhcmdldC5nZXRPZmZlcnMoe1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIGV4ZWN1dGU6IHtcbiAgICAgICAgcGFnZUxvYWQ6IHtcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBsb2dnZWRJbjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGFkb2JlLnRhcmdldC5hcHBseU9mZmVycyh7XG4gICAgICByZXNwb25zZTogcmVzcG9uc2VcbiAgICB9KTtcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIDtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIDtcbiAgfSk7XG59KTtcbn0nLGxhbmd1YWdlOiJqYXZhc2NyaXB0In19XX0se2lkOiJSTGI1ZDAyM2UwMjRiNjRkOTNiNDdiNmQ4ZjIxNGJiOTE2IixuYW1lOiJnVGFnOmN0YU9yYW5nZURDIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7YW5jaG9yRGVsYXk6NjAwLGVsZW1lbnRTZWxlY3RvcjoiYS5meGctYnV0dG9uLmZ4Zy1idXR0b24tLW9yYW5nZSIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJkYXRhLWFuYWx5dGljcyIsdmFsdWU6IihsaW5rIFxcfCBTSUdOIFVQIE5PVyl8KGxpbmtcXHxTaWduIHVwIGZvciBmcmVlKXwoaGVyb1xcfFNlZSBDdXJyZW50IE9mZmVycyl8KGhlcm9cXHxGaW5kIGEgV2FsZ3JlZW5zIE5lYXIgWW91KSIsdmFsdWVJc1JlZ2V4OiEwfV0sYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo0MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6Y3RhT3JhbmdlRENQYWdlTGlzdE1hcHBpbmciKSx0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciBuPV9mZHgucGFnZUZsYWcoZSx0KTtpZigib2JqZWN0IiE9dHlwZW9mIG4pcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJkY09yYW5nZUxhYmVsIixuKSwhMSE9PW47dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmNsYXNzTmFtZSksaT10aGlzO3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigiZGNPcmFuZ2VMYWJlbCIsX2ZkeC5nZXRHdGFnTGFiZWwobixyLGkpKSwhMH19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzJmYjE4Mjk1MjY5MzQxNzFhNjUyNjA4NzI0NzAzNzQ1LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMZDdiZGQyZmYxZDMzNGM2MGEwNjVkZmYxNzFmMzAzOTUiLG5hbWU6ImdUYWc6Y3RhT3JhbmdlQVciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOnthbmNob3JEZWxheTo2MDAsZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlIixlbGVtZW50UHJvcGVydGllczpbe25hbWU6ImRhdGEtYW5hbHl0aWNzIix2YWx1ZToiKGhlcm9cXHxmcmVlIGRvd25sb2FkKXwobGlua1xcfENyZWF0ZSBhIGxhYmVsKXwoaGVyb1xcfHNoaXAgbm93KXwoaGVyb1xcfENoYXQgd2l0aCBhIHNhbGVzIHNwZWNpYWxpc3QpfChoZXJvXFx8QXBwbHkgTm93KXwobGlua1xcfFN0YXJ0IGEgZnJlZSBCaWdDb21tZXJjZSB0cmlhbCl8KGhlcm9cXHxHZXQgU3RhcnRlZCl8KGxpbmtcXHxTdGFydCBPcmRlcil8KGxpbmtcXHxTaWduIHVwIGZvciBmcmVlKXwobGlua1xcfEZpbmQgYSBEb2xsYXIgR2VuZXJhbCl8KGhlcm9cXHxTZWUgQ3VycmVudCBPZmZlcnMpfChoZXJvXFx8RmluZCBhIFdhbGdyZWVucyBOZWFyIFlvdSkiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOmN0YU9yYW5nZUFXUGFnZUxpc3RNYXBwaW5nIiksdD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigiYXdPcmFuZ2VMYWJlbCIsbiksITEhPT1uO3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLGk9dGhpcztyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoImF3T3JhbmdlTGFiZWwiLF9mZHguZ2V0R3RhZ0xhYmVsKG4scixpKSksITB9fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkNlZmZjNmYyYTlmOGY0ZTBmOWUwNzliYzZiZmZjMDNhNC1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDFjYjJhY2IzYTJjMTQ2NjY4NDk3ZmYyOGMxYWNiNDViIixuYW1lOiJnVGFnOkJ1dHRvbkV2ZW50X1Bvc3NpYmlsaXRpZXMiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOnthbmNob3JEZWxheToxMDAsZWxlbWVudFNlbGVjdG9yOiIjc3Vic2NyaWJlYnV0dG9uIixidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMX0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gX3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKSE9PXVuZGVmaW5lZCYmbnVsbCE9PV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkVuYWJsZWRMb2NhbGVFcGljIikmJiIiIT09X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKX19fSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiL2Fib3V0L3Bvc3NpYmlsaXRpZXMifV19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzU0NzJiODdkYjAxOTQyYjdhYzk4NmE0MGU5MGJmZTVlLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMNTk5OTBmNmYwMzZkNGQ2NDgyNTk3MGJhYmExMDhkOWEiLG5hbWU6ImNvbnRlbnQ6YWxsIHBhZ2VzIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuISh2b2lkIDAhPT1fc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZSIpJiYiZGVsYXllZCI9PV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OkRlbGF5ZWQgUGFnZSBUeXBlIil8fC0xPHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInNlYXJjaC5odG1sP3E9Iil8fC0xPHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInJlZ2lzdGVyLmh0bWwiKXx8LTE8d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiL29ubGluZS9yYXRpbmcuaHRtbCIpfHwtMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCIvb25saW5lL3NoaXBwaW5nLmh0bWwiKXx8LTE8d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiL3VzZXItcHJvZmlsZS1jb21wbGV0aW9uL2VtYWlsP2xvY2FsZSIpfHwtMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZmVkZXh0cmFja2luZy8iKXx8LTE8d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmVkZXguY29tL2ZkbWVucm9sbG1lbnQvIil8fC0xPHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIi9zaGlwbWVudC1oaXN0b3J5IikpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTond2luZG93LmZkeF9sb2NhbGUgPSBfc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpsb2NhbGUiKTsnLGxhbmd1YWdlOiJqYXZhc2NyaXB0In19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcyIsc2V0dGluZ3M6e3RyYWNrZXJQcm9wZXJ0aWVzOntlVmFyczpbe25hbWU6ImVWYXIzMCIsdHlwZToidmFsdWUiLHZhbHVlOiIlc2l0ZS1kaWFnbm9zdGljczp2aWV3cG9ydCUifSx7bmFtZToiZVZhcjM4Iix0eXBlOiJ2YWx1ZSIsdmFsdWU6IiVjb250ZW50OnBhZ2UgbmFtZSUifSx7bmFtZToiZVZhcjU4Iix0eXBlOiJ2YWx1ZSIsdmFsdWU6IiVleHRlcm5hbC1jYW1wYWlnbjpsaW5rJSJ9XSxwcm9wczpbe25hbWU6InByb3AyIix0eXBlOiJ2YWx1ZSIsdmFsdWU6IiVjb250ZW50OmNvdW50cnlDb2RlJSJ9LHtuYW1lOiJwcm9wMyIsdHlwZToidmFsdWUiLHZhbHVlOiIlY29udGVudDpsYW5ndWFnZSUifSx7bmFtZToicHJvcDUiLHR5cGU6InZhbHVlIix2YWx1ZToiJWNvbnRlbnQ6cmVnaW9uJSJ9LHtuYW1lOiJwcm9wMjMiLHR5cGU6InZhbHVlIix2YWx1ZToiJWNvbnRlbnQ6aGlzdG9yaWNhbFBhZ2VOYW1lJSJ9LHtuYW1lOiJwcm9wMzMiLHR5cGU6InZhbHVlIix2YWx1ZToiJWNvbnRlbnQ6cGFnZSB0eXBlJSJ9LHtuYW1lOiJwcm9wMzgiLHR5cGU6ImFsaWFzIix2YWx1ZToiZVZhcjM4In0se25hbWU6InByb3A1OCIsdHlwZToiYWxpYXMiLHZhbHVlOiJlVmFyNTgifSx7bmFtZToicHJvcDY3Iix0eXBlOiJhbGlhcyIsdmFsdWU6ImVWYXIzMCJ9XSxjaGFubmVsOiIlY29udGVudDpzaXRlIHNlY3Rpb24lIixjYW1wYWlnbjp7dHlwZToicXVlcnlQYXJhbSIsdmFsdWU6IkNNUCJ9LHBhZ2VOYW1lOiIlY29udGVudDpwYWdlIG5hbWUlIn19fSx7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzIixzZXR0aW5nczp7dHlwZToicGFnZSJ9fV19LHtpZDoiUkwyYWJiMjZkN2U2Mjg0YmIyOTAxODkwOGIyNmEyNzI0ZSIsbmFtZToiZ1RhZzpEQ1BhZ2VFdmVudF9Qb3NzaWJpbGl0aWVzIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiBfc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyIpIT09dW5kZWZpbmVkJiZudWxsIT09X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKSYmIiIhPT1fc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyIpfX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiIvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sIn1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM5MTZkZTZiYmNmNmQ0NzU4ODIxODA0NjU4MTRiZTk0NC1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTGMxZGNiYzZmNDU3MTRjZjY4ZDI3MTVjZTFlNzAxZjM2IixuYW1lOiJ2aWRlbzoxMDAlIFZpZXdlZCIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMiLHNldHRpbmdzOnt1bml0OiJwZXJjZW50IixhbW91bnQ6MTAwLGVsZW1lbnRTZWxlY3RvcjoiLmJyaWdodGNvdmUtY29udGFpbmVyIHZpZGVvIixidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMX0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMiLHNldHRpbmdzOntjdXN0b21TZXR1cDp7c291cmNlOmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLnBhcmVudEVsZW1lbnQpe2Zvcih2YXIgbj10aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpLHI9dGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlby1pZCIpLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYnJpZ2h0Y292ZS1jb250YWluZXIiKSxhPTA7YTxpLmxlbmd0aDthKyspaWYobj09aVthXS5nZXRBdHRyaWJ1dGUoImRhdGEtcGxheWVyaWQiKSl7dmFyIG89ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmpzLWRvY2stdGl0bGUiKTt0LmVWYXI0Mj1vW2FdLmlubmVyVGV4dCx0LmVWYXIzMT1yLHQubGlua1RyYWNrVmFycz10LmFwbCh0LmxpbmtUcmFja1ZhcnMsImVWYXI0MixlVmFyMzEiLCIsIiwyKX10LmxpbmtUcmFja0V2ZW50cz10LmV2ZW50cz0iZXZlbnQyMDcifX19LHRyYWNrZXJQcm9wZXJ0aWVzOnt9fX0se21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcyIsc2V0dGluZ3M6e3R5cGU6ImxpbmsiLGxpbmtOYW1lOiJWaWRlbzpDb21wbGV0ZSIsbGlua1R5cGU6Im8ifX1dfSx7aWQ6IlJMMjNhZmJkZTYzYjhiNDBkYmJlNzEzNDY5MzJlNzBlNzgiLG5hbWU6ImdUYWc6QWRXb3Jkc0V2ZW50IixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgZT1fZmR4LnBjZlV0aWwoKS5tYXRjaCgvd3d3KHNib3guaWRldnxiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpLHQ9IiI9PV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnRGlzYWJsZUxvY2FsZSIpLG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHI9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6Y291bnRyeUNvZGUiKSxpPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkFkV29yZHNFdmVudE1hcHBpbmciKSxhPV9mZHgucGFnZUZsYWcoaSxyLCJjb3VudHJ5Iiksbz1fZmR4LnBhZ2VGbGFnKGEsbik7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJhd0xhYmVsIixvKSwhKCExPT09b3x8bnVsbD09PWV8fCF0KX19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6JzxzY3JpcHQ+XG4gIGd0YWcoXCdldmVudFwnLCBcJ2NvbnZlcnNpb25cJyxcbiAgICB7XG4gICAgICAgIFwnc2VuZF90b1wnOiBfc2F0ZWxsaXRlLmdldFZhcigiYXdMYWJlbCIpXG4gICAgfSk7XG48XC9zY3JpcHQ+XG5ceDNjIS0tXG52YXIgYWR3b3Jkc01hcHBpbmcgPSBfc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpBZFdvcmRzRXZlbnRNYXBwaW5nIik7ICBcbnZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7IFxudmFyIG9iakFkV29yZHMgPSIiO1xudmFyIGV2ZW50X3R5cGUgPSAiIjtcbnZhciBldmVudF9uYW1lID0gIiI7XG52YXIgZXZlbnRfcGFyYW0gPSAiIjtcbmlmICgodHlwZW9mIGFkd29yZHNNYXBwaW5nICE9PSAidW5kZWZpbmVkIiAmJiBhZHdvcmRzTWFwcGluZyAhPT0gIiIpICYmICh0eXBlb2YgdXJsICE9PSAidW5kZWZpbmVkIiAmJiB1cmwgIT09ICIiKSl7XG5cdGZvcih2YXIga2V5IGluIGFkd29yZHNNYXBwaW5nKXtcdFx0XHRcdFxuXHRcdGlmKHVybC5pbmRleE9mKGtleSkgPiAtMSl7XG5cdFx0XHRvYmpBZFdvcmRzID0gYWR3b3Jkc01hcHBpbmdba2V5XTtcdFx0XHQgXG5cdFx0XHRicmVhaztcdFx0XHRcdCAgXG5cdFx0fVxuXHR9XG59ICAgIFxuaWYgKCh0eXBlb2Ygb2JqQWRXb3JkcyAhPT0gInVuZGVmaW5lZCIgJiYgb2JqQWRXb3JkcyAhPT0gIiIpICl7XG5cdGV2ZW50X3R5cGUgPSBvYmpBZFdvcmRzLmV2ZW50X3R5cGU7XG5cdGV2ZW50X25hbWUgPSBvYmpBZFdvcmRzLmV2ZW50X25hbWU7XG5cdGV2ZW50X3BhcmFtID0gb2JqQWRXb3Jkcy5ldmVudF9wYXJhbTtcbn1cbmd0YWcoZXZlbnRfdHlwZSwgZXZlbnRfbmFtZSwgZXZlbnRfcGFyYW0pO1xuPFwvc2NyaXB0Pi0tXHgzZScsbGFuZ3VhZ2U6Imh0bWwifX1dfSx7aWQ6IlJMZGIxZTM5NWM5NTY3NGZmN2FjYTI2NjE2MjE5ZTBhZjciLG5hbWU6IkFkb2JlVGFyZ2V0OkNhdGVnb3J5IEFmZmluaXR5IixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiIvZW4tdXMvc2hpcHBpbmciLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiIvZW4tdXMvdHJhY2tpbmciLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiIvZW4tdXMvcHJpbnRpbmciLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiIvZW4tdXMvY3VzdG9tZXItc3VwcG9ydCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6Ii9lbi11cy9lY29tbWVyY2UiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiIvZW4tdXMvc21hbGwtYnVzaW5lc3MiLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOidhZG9iZS50YXJnZXQudHJhY2tFdmVudCh7XG4gICJtYm94IjogImNhdGVnb3J5LWFmZmluaXR5IixcbiAgInBhcmFtcyI6IHtcbiAgICAgInVzZXIuY2F0ZWdvcnlJZCI6IF9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnBhZ2VQYXRoIilcbiAgfVxufSk7XG4nLGxhbmd1YWdlOiJqYXZhc2NyaXB0In19XX0se2lkOiJSTGNiMzA3NGM0ZjZjZDQ2NmZiN2FjYWZiZDUzZWJkM2U2IixuYW1lOiJnVGFnOmJ0bkZCIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tbWQuZnhnLWxpbmstLXJvdW5kZWRfYnV0dG9uLmZ4Zy1saW5rLS1hbGlnbi1sZWZ0LnN1cC5zdWIiLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NjB9LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tYmx1ZS5meGctbGluay0tbW9iaWxlLWFsaWduLWNlbnRlci5meGctbW9iaWxlLS1oaWRlIixidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjYwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpidG5GQlBhZ2VMaXN0TWFwcGluZyIpLHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIik7dmFyIG49X2ZkeC5wYWdlRmxhZyhlLHQpO2lmKCJvYmplY3QiIT10eXBlb2YgbilyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoImZiRXZlbnQiLG4pLCExIT09bjt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuY2xhc3NOYW1lKSxpPXRoaXM7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJmYkV2ZW50IixfZmR4LmdldEd0YWdMYWJlbChuLHIsaSkpLCEwfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDMGQzZjQxNzk0ODhiNDgzNDg1M2ZjNjQxYjAxZmI2NjQtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkwwYWY1ZmZhODAzYzA0MzljOWM3ZWMxNDQ0ZDYyNmIwYyIsbmFtZToic2VhcmNoIC0gUyZQIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RhdGFFbGVtZW50Q2hhbmdlLmpzIixzZXR0aW5nczp7bmFtZToic2VhcmNoOnNwRGF0YSAtIEpTT2JqZWN0Q2hhbmdlIn0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4tMTx3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJzZWFyY2guaHRtbD9xPSIpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDMTYzOTdiYWQ4MzE1NGUzYTllZTU0MThlNDIwODQwNWUtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw0ZTAxMjBiOGFlNmM0NjQ2OTliZDRiMjRhNDA0M2VlNiIsbmFtZToidXNlcjp1c2VyIGluZm8iLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMiLHNldHRpbmdzOntjdXN0b21TZXR1cDp7c291cmNlOmZ1bmN0aW9uKGUsdCl7IkxvZ2dlZCBJbiI9PV9zYXRlbGxpdGUuZ2V0VmFyKCJsb2dpbjpzdGF0dXMiKSYmKHQuZXZlbnRzPXQuYXBsKHQuZXZlbnRzLCJldmVudDMiLCIsIiwyKSl9fSx0cmFja2VyUHJvcGVydGllczp7ZVZhcnM6W3tuYW1lOiJlVmFyNCIsdHlwZToidmFsdWUiLHZhbHVlOiIlbG9naW46c3RhdHVzJSJ9LHtuYW1lOiJlVmFyMTMiLHR5cGU6InZhbHVlIix2YWx1ZToiJWxvZ2luOmZkeF9jYmlkJSJ9LHtuYW1lOiJlVmFyNjAiLHR5cGU6InZhbHVlIix2YWx1ZToiJXVzZXI6ZW1haWxJRCUifV0scHJvcHM6W3tuYW1lOiJwcm9wNCIsdHlwZToiYWxpYXMiLHZhbHVlOiJlVmFyNCJ9LHtuYW1lOiJwcm9wNzUiLHR5cGU6InZhbHVlIix2YWx1ZToiJXVzZXI6dXNlci1hZ2VudCUifV19fX1dfSx7aWQ6IlJMZDBhNjNhYzA1ZTJjNGFjZWEzY2EyZDgxMjZhOWY1NjUiLG5hbWU6InZhOnBvcGluIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OmRldmljZVR5cGUiKTsidW5kZWZpbmVkIj09dHlwZW9mIF9mZHgmJl9zYXRlbGxpdGUuZ2V0VmFyKCJfZmR4VXRpbCIpO3ZhciB0PV9zYXRlbGxpdGUuZ2V0VmFyKCJ2YTplbmFibGVkQ291bnRyeUxpc3QiKSxuPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OmNvdW50cnlDb2RlIikscj1fc2F0ZWxsaXRlLmdldFZhcigidmE6bW9iRW5hYmxlZFVybCIpLGk9X2ZkeC5wYWdlRmxhZyh0LG4pLGE9X3NhdGVsbGl0ZS5nZXRWYXIoInZhOmNhYXNFbmFibGVkQ291bnRyeUxpc3QiKSxvPV9zYXRlbGxpdGUuZ2V0VmFyKCJ2YTpjYWFzTW9iRW5hYmxlZFVybCIpLHM9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIiksYz1fc2F0ZWxsaXRlLmdldFZhcigidmE6Y2Fhc0Rpc2FibGVkQ291bnRyeUxpc3QiKTstMTxhLmluZGV4T2Yocyk/aXNDYWFzTW9iRW5hYmxlZD0hMDppc0NhYXNNb2JFbmFibGVkPSExO3ZhciB1PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxsPSIvIitfc2F0ZWxsaXRlLmdldFZhcigiY29udGVudDpsb2NhbGUiKS5yZXBsYWNlKCJfIiwiLSIpKyIvIixkPV9zYXRlbGxpdGUuZ2V0VmFyKCJ2YTpkaXNhYmxlZFBhZ2VMaXN0IiksZj0hX2ZkeC5wYWdlRmxhZyhkLHUpLHA9IV9mZHgucGFnZUZsYWcoZCxsKSxnPV9mZHgucGFnZUZsYWcocix1KSxtPV9mZHgucGFnZUZsYWcobyx1KSxoPWkmJmYsdj1pJiZwJiZjLGI9aSYmZyx5PWkmJnAmJm0mJmlzQ2Fhc01vYkVuYWJsZWQ7cmV0dXJuIEZEWC5DQUFTPT09dW5kZWZpbmVkPyEoImRlc2t0b3AiIT1lfHwhaCl8fCEoIm1vYmlsZSIhPWV8fCFiKTohKCJkZXNrdG9wIiE9ZXx8IXYpfHwhKCJtb2JpbGUiIT1lfHwheSl9fX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCJ3Y21tb2RlIik9PXVuZGVmaW5lZH19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2UwN2U1MDRmZTNlZTQ0YTA4Y2FiYjYyYTc4MDk3YjIxLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMN2ZiOWU4M2UwZjJmNDk4N2IzYWIzYThjZjljODM5NzUiLG5hbWU6ImV2ZW50OnZhUG9waW4gY2xpY2siLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZGF0YUVsZW1lbnRDaGFuZ2UuanMiLHNldHRpbmdzOntuYW1lOiJldmVudDp2YUNsaWNrIn0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT0idW5kZWZpbmVkIiE9dHlwZW9mIEZEWC5EQVRBTEFZRVIuVkEmJkZEWC5EQVRBTEFZRVIuVkE/RkRYLkRBVEFMQVlFUi5WQToiIjsiZnVuY3Rpb24iPT10eXBlb2YgZmR4X2xvZ0NoYXQmJmUmJmZkeF9sb2dDaGF0KGUsInZhX05JTkEiKX19fV0sYWN0aW9uczpbXX0se2lkOiJSTGI3NWM0YzYxYjZhZjQ5OWI4YmZkZWZlMzU4ZDcwMTVlIixuYW1lOiJtZWRhbGxpYSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiLygoKGVufGZyfGRlfGl0KS1jaCl8KGhlLWlsKXwocnUtcnUpfCh0ci10cil8KHVrLXVhKSkvdHJhY2tpbmcuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6Ii8oKGVuLShpbHxydXx0cikpfChmci1mcil8KChlbnxkZXxpdCktY2gpfChoZS1pbCl8KHJ1LXJ1KXwodHItdHIpfCgoZW58cnV8dWspLXVhKSkvb25saW5lL3NoaXBwaW5nLmh0bWwiLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJ2YXIgdmVyc2lvbiA9IFwiMjAwNi4wNzI0MjAyMC4wMVwiO1xuaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA9PSBcInd3dy5mZWRleC5jb21cIiB8fCB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gXCJ3d3cuc3BhaW4uZmVkZXguY29tXCIpIHtcbiAgICB3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVggPSBcImh0dHBzOi8vb24tcHJlbS5rYW1weWxlLmNvbS9GZWRleFByb2QvQ09MT1wiO1xufSBlbHNlIHtcbiAgICB3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVggPSBcImh0dHBzOi8vb24tcHJlbS5rYW1weWxlLmNvbS9GZWRleFRlc3QvQ09MT1wiO1xufVxuKGZ1bmN0aW9uKCkge1xuICAgIGlmICghd2luZG93LktBTVBZTEVfRU1CRUQpIHtcbiAgICAgICAgdmFyIG9uUHJlbUVtYmVkUmVnZXggPSAvXFwvW2EtekEtWlxcZC1dK1xcL1xcZCtcXC9vbnNpdGVcXC9tZWRhbGxpYS1kaWdpdGFsLWVtYmVkXFwuanMkLztcbiAgICAgICAgdmFyIGdlbmVyaWNQYXRoUmVnZXggPSAvXFwvW2EtekEtWlxcZC1dK1xcL1xcZCtcXC9vbnNpdGVcXC9nZW5lcmljXFxkezEzfVxcLmpzJC87XG4gICAgICAgIHdpbmRvdy5LQU1QWUxFX0VNQkVEID0ge1xuICAgICAgICAgICAga2FtcHlsZUluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICAgICAgdC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdC5zcmMgPSBLQU1QWUxFX0VNQkVELmdldEdlbmVyaWNMb2NhdGlvbigpO1xuICAgICAgICAgICAgICAgIHQuY2hhcnNldCA9ICdVVEYtOCc7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrYW1weWxlTG9hZExvZ2dlcjogZnVuY3Rpb24oKSB7fSxcbiAgICAgICAgICAgIGthbXB5bGVFdmVudEhhbmRsZXI6IGZ1bmN0aW9uKGVsZW0sIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1N1cHBvcnRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaXNJRTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRydWVWZXJzaW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpbmdWZXJzaW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5TW9kZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB0cmlkZW50ID0gd2luZG93LktBTVBZTEVfRU1CRUQuZ2V0VXNlckFnZW50KCkubWF0Y2goL1RyaWRlbnRcXC8oXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpZGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaXNJRSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50cnVlVmVyc2lvbiA9IHBhcnNlSW50KHRyaWRlbnRbMV0sIDEwKSArIDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtc2llID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobXNpZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaXNJRSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hY3RpbmdWZXJzaW9uID0gcGFyc2VJbnQobXNpZVsxXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjdGluZ1ZlcnNpb24gPSByZXN1bHQudHJ1ZVZlcnNpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNJRSAmJiByZXN1bHQudHJ1ZVZlcnNpb24gPiAwICYmIHJlc3VsdC5hY3RpbmdWZXJzaW9uID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29tcGF0aWJpbGl0eU1vZGUgPSByZXN1bHQudHJ1ZVZlcnNpb24gIT0gcmVzdWx0LmFjdGluZ1ZlcnNpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhcmVzdWx0LmlzSUUgfHwgcmVzdWx0LnRydWVWZXJzaW9uID4gOSB8fCAocmVzdWx0LmFjdGluZ1ZlcnNpb24gPj0gOSAmJiByZXN1bHQuY29tcGF0aWJpbGl0eU1vZGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFVzZXJBZ2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0R2VuZXJpY0xvY2F0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ2VuZXJpY0xvY2F0aW9uID0gbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJ3Jlc291cmNlcy5kaWdpdGFsLWNsb3VkLXByZW0ubWVkYWxsaWEuZXUvd2RjZXVwcmVtLzEwMTg5L29uc2l0ZS9nZW5lcmljMTU4MjkxMjAzNjAxMy5qcyc7XG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyaWNQYXRoID0gKGdlbmVyaWNMb2NhdGlvbi5tYXRjaChnZW5lcmljUGF0aFJlZ2V4KSB8fCBbXSlbMF07XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0xvY2F0aW9uID0gd2luZG93LktBTVBZTEVfRU1CRUQuZ2V0UmVzb3VyY2VzUHJlZml4KCkgKyBnZW5lcmljUGF0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJpY0xvY2F0aW9uO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzT25QcmVtU2NyaXB0OiBmdW5jdGlvbihzY3JpcHRQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uUHJlbUVtYmVkUmVnZXgudGVzdChzY3JpcHRQYXRoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc09uUHJlbTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5NRElHSVRBTF9PTl9QUkVNX1BSRUZJWCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuS0FNUFlMRV9FTUJFRC5pc09uUHJlbVNjcmlwdChzY3JpcHRzW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRSZXNvdXJjZXNQcmVmaXg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5NRElHSVRBTF9PTl9QUkVNX1BSRUZJWDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgdmFyIG5lZWRlZFNyY1BhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc2NyaXB0cyAmJiAhbmVlZGVkU3JjUGF0aCAmJiBpIDwgc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbaV0uc3JjICYmIG9uUHJlbUVtYmVkUmVnZXgudGVzdChzY3JpcHRzW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZFNyY1BhdGggPSBzY3JpcHRzW2ldLnNyYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkZWRTcmNQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5NRElHSVRBTF9PTl9QUkVNX1BSRUZJWCA9IG5lZWRlZFNyY1BhdGgucmVwbGFjZShvblByZW1FbWJlZFJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAod2luZG93LktBTVBZTEVfRU1CRUQuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuS0FNUFlMRV9FTUJFRC5rYW1weWxlSW5pdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuS0FNUFlMRV9FTUJFRC5rYW1weWxlRXZlbnRIYW5kbGVyKHdpbmRvdywgJ2xvYWQnLCB3aW5kb3cuS0FNUFlMRV9FTUJFRC5rYW1weWxlSW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KSgpOyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQifX1dfSx7aWQ6IlJMN2ZlODAyZThlYzE2NGI0OWExZWY3NmFmYTIxM2Y3NWYiLG5hbWU6ImV2ZW50OmJ1dHRvbiBjbGljayIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2FuY2hvckRlbGF5OjEwMCxlbGVtZW50U2VsZWN0b3I6ImJ1dHRvbiIsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMX0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiQ2hlY2sgSW50ZXJ2YWwiKSx0PV9zYXRlbGxpdGUuZ2V0VmFyKCJEZWxheSBUaW1lIikscj1bImhlcm98dHJhY2siLCJoZXJvfGN1YmV8cmF0ZSAmIHNoaXAiLCJoZXJvfGN1YmV8cmF0ZSIsImhlcm98Y3ViZXx0cmFjayIsImhlcm98Y3ViZXxsb2NhdGUiLCJoZXJvfGN1YmV8c2hpcCJdLGk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgbj1GRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLmRhdGE7dm9pZCAwIT09biYmbiYmKGNsZWFySW50ZXJ2YWwoaSksYSYmY2xlYXJUaW1lb3V0KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT0idW5kZWZpbmVkIiE9PUZEWC5EQVRBTEFZRVIucGFnZS5idXR0b24mJiIiIT09RkRYLkRBVEFMQVlFUi5wYWdlLmJ1dHRvbi5kYXRhP0ZEWC5EQVRBTEFZRVIucGFnZS5idXR0b24uZGF0YToiIix0PSJ1bmRlZmluZWQiIT09RkRYLkRBVEFMQVlFUi5wYWdlLmJ1dHRvbiYmIiIhPT1GRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLnR5cGU/RkRYLkRBVEFMQVlFUi5wYWdlLmJ1dHRvbi50eXBlOiIiO3JldHVybiBudWxsIT1lJiYiIiE9ZSYmKCIiIT09dCYmIm5ld1BhZ2UiPT10PyhmZHhfc2V0TGlua1ZpZXcoZSksITEpOnZvaWQgMCE9PXQmJiJzYW1lUGFnZSI9PXQ/KC0xPHIuaW5kZXhPZihuLnRvTG93ZXJDYXNlKCkpP2ZkeF9zZXRMaW5rVmlldyhlKTpmZHhfbG9nTGlua1ZpZXcoZSksITEpOnZvaWQgMCl9LHQpKX0sZSksYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChpKX0sM2UzKX19fV0sYWN0aW9uczpbXX0se2lkOiJSTGQ5ZWU0Mjg1ODQwMDQ2NmRiYTAwNWQzYzcxZmM4ZTQ0IixuYW1lOiJndGFnOlZpZGVvUGxheSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMiLHNldHRpbmdzOnt1bml0OiJwZXJjZW50IixhbW91bnQ6MSxlbGVtZW50U2VsZWN0b3I6Ii5icmlnaHRjb3ZlLWNvbnRhaW5lciB2aWRlbyIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiIvKGtvLWtyfHpoLXR3fGVuLXNnKS9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWwiLHZhbHVlSXNSZWdleDohMH1dfX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpWaWRlb1BsYXlJZExpc3QiKSx0PXRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8taWQiKSxuPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OmNvdW50cnlDb2RlIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgcj1fZmR4LnBhZ2VGbGFnKGUsbiwiY291bnRyeSIpLGk9X2ZkeC5wYWdlRmxhZyhyLHQpO3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigidmlkZW9HdGFnTGFiZWwiLGkpLCExIT09aX19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzU3MGE2OTA3NTdiMTQ0NGU5NGIwY2MzMGY5YzIxYmQyLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMOWQ1ZGIzYTZiZTBmNGU3YmI2MzNkMzdlZjdiN2YzNjMiLG5hbWU6IkFkb2JlVGFyZ2V0OmJlYWNvblYyIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjoxfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1GRFguREFUQUxBWUVSLnBhZ2UuY2F0ZWdvcnksdD1fc2F0ZWxsaXRlLmdldFZhcigidGFyZ2V0ZW5hYmxlZFVybExpc3QiKSxuPS8uW2Etel17Mn0tW2Etel17Mn0oLiopLy5leGVjKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7cmV0dXJuIG51bGwhPT1uJiYobj1uWzFdKSwiZmFsc2UiPT1lLmlzQXBwbGljYXRpb24mJiJzaGFyZWRuYXYiIT09RkRYLkRBVEFMQVlFUi5wYWdlLmNhdGVnb3J5LnBhZ2VUeXBlfHwidHJ1ZSI9PWUuaXNBcHBsaWNhdGlvbiYmbnVsbCE9PW4mJnZvaWQgMCE9PXQmJiIiIT09dCYmMDx0Lmxlbmd0aCYmLTE8dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuLnRvTG93ZXJDYXNlKCkpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiYWRvYmUtdGFyZ2V0LXYyL2xpYi9sb2FkVGFyZ2V0LmpzIixzZXR0aW5nczp7fX0se21vZHVsZVBhdGg6ImFkb2JlLXRhcmdldC12Mi9saWIvYWRkUGFnZUxvYWRQYXJhbXMuanMiLHNldHRpbmdzOntwYXJhbXM6e2F0X3Byb3BlcnR5Ont2YWx1ZToiJVRhcmdldDphdF9wcm9wZXJ0eSUiLGNoZWNrZWQ6ITF9LGxvZ2dlZGluU3RhdHVzOnt2YWx1ZToiJWxvZ2luOnN0YXR1cyUiLGNoZWNrZWQ6ITF9fX19LHttb2R1bGVQYXRoOiJhZG9iZS10YXJnZXQtdjIvbGliL2ZpcmVQYWdlTG9hZC5qcyIsc2V0dGluZ3M6e2JvZHlIaWRkZW5TdHlsZToiYm9keSB7b3BhY2l0eTogMH0iLGJvZHlIaWRpbmdFbmFibGVkOiEwfX1dfSx7aWQ6IlJMYjk2OTJiMmYxZWIxNDM4MmJiODIyNjdmOTU1MGY3MmUiLG5hbWU6ImFkVGFnOnZlcml6b24iLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigidmVyaXpvbjpwYWdlTGlzdCIpLHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIiksX3NhdGVsbGl0ZS5zZXRWYXIoInZlcml6b25VUkwiLF9mZHgucGFnZUZsYWcoZSx0KSk7dmFyIG49ITEhPT1fc2F0ZWxsaXRlLmdldFZhcigidmVyaXpvblVSTCIpLHI9IiIhPT1fc2F0ZWxsaXRlLmdldFZhcigidmVyaXpvbjp0aW1lRnJhbWUiKSYmITEhPT1fc2F0ZWxsaXRlLmdldFZhcigidmVyaXpvbjp0aW1lRnJhbWUiKTtyZXR1cm4gbiYmcn19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6JzxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgc3R5bGU9ImJvcmRlci1zdHlsZTpub25lOyIgYWx0PSIiIHNyYz0ldmVyaXpvblVSTCUgLz4nLGxhbmd1YWdlOiJodG1sIn19XX0se2lkOiJSTGY3NWIxYTNjZDM5NzQ2ZDQ4NjY1ZTRjMjllMmQ1YzM0IixuYW1lOiJyZWRpcmVjdDphcHBTZWdJZFRhcmdldCIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e2dsb2JhbDohMCxzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2Q1Nzk0ZWJhZGVhNjQ2NjhhNTRjODJhOTQ0OTk4ZWIyLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMOTEwMTNjMjg0ZDI2NDE3ZGJkN2I0MzUzYjhjYTBjYTMiLG5hbWU6ImFkVGFnOmRvdFRhZyAiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiZG90VGFnOmVuYWJsZWRQYWdlTGlzdCIpLHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIiksITEhPT1fZmR4LnBhZ2VGbGFnKGUsdCl9fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOid2YXIgZG90VGFnUGl4ZWxJZCA9IF9zYXRlbGxpdGUuZ2V0VmFyKCJkb3RUYWdQaXhlbElkIik7XG4oZnVuY3Rpb24odyxkLHQscix1KXt3W3VdPXdbdV18fFtdO3dbdV0ucHVzaCh7XCdwcm9qZWN0SWRcJzpcJzEwMDAwXCcsXCdwcm9wZXJ0aWVzXCc6e1wncGl4ZWxJZFwnOmRvdFRhZ1BpeGVsSWR9fSk7dmFyIHM9ZC5jcmVhdGVFbGVtZW50KHQpO3Muc3JjPXI7cy5hc3luYz10cnVlO3Mub25sb2FkPXMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIHkscnM9dGhpcy5yZWFkeVN0YXRlLGM9d1t1XTtpZihycyYmcnMhPSJjb21wbGV0ZSImJnJzIT0ibG9hZGVkIil7cmV0dXJufXRyeXt5PVlBSE9PLnl3YS5JMTNOLmZpcmVCZWFjb247d1t1XT1bXTt3W3VdLnB1c2g9ZnVuY3Rpb24ocCl7eShbcF0pfTt5KGMpfWNhdGNoKGUpe319O3ZhciBzY3I9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxwYXI9c2NyLnBhcmVudE5vZGU7cGFyLmluc2VydEJlZm9yZShzLHNjcil9KSh3aW5kb3csZG9jdW1lbnQsInNjcmlwdCIsImh0dHBzOi8vcy55aW1nLmNvbS93aS95dGMuanMiLCJkb3RxIik7XG5cblxuXG4nLGxhbmd1YWdlOiJqYXZhc2NyaXB0In19XX0se2lkOiJSTGFjYzJhODUwYjdkYjRjZWE4ZmY4MDcwNTk5YjE4MDIzIixuYW1lOiJ2aWRlbzo1MCUgVmlld2VkIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL21lZGlhVGltZVBsYXllZC5qcyIsc2V0dGluZ3M6e3VuaXQ6InBlcmNlbnQiLGFtb3VudDo1MCxlbGVtZW50U2VsZWN0b3I6Ii5icmlnaHRjb3ZlLWNvbnRhaW5lciB2aWRlbyIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITF9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzIixzZXR0aW5nczp7Y3VzdG9tU2V0dXA6e3NvdXJjZTpmdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5wYXJlbnRFbGVtZW50KXtmb3IodmFyIG49dGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSxyPXRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW8taWQiKSxpPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImJyaWdodGNvdmUtY29udGFpbmVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKWlmKG49PWlbYV0uZ2V0QXR0cmlidXRlKCJkYXRhLXBsYXllcmlkIikpe3ZhciBvPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZqcy1kb2NrLXRpdGxlIik7dC5lVmFyNDI9b1thXS5pbm5lclRleHQsdC5lVmFyMzE9cix0LmxpbmtUcmFja1ZhcnM9dC5hcGwodC5saW5rVHJhY2tWYXJzLCJlVmFyNDIsZVZhcjMxIiwiLCIsMil9dC5saW5rVHJhY2tFdmVudHM9dC5ldmVudHM9ImV2ZW50MjA1In19fSx0cmFja2VyUHJvcGVydGllczp7fX19LHttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rTmFtZToiVmlkZW86NTAlIFZpZXdlZCIsbGlua1R5cGU6Im8ifX1dfSx7aWQ6IlJMYmZhMmY0MGQwZjFmNDdjZGJlZDc4NDAzNmNkOWNmY2EiLG5hbWU6IkhQVHJhY2tCdG46VmFsaWREYXRhIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6ImRpdiAucmVkZXNpZ25TbmFwc2hvdFRWQyJ9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzc4OTA5ZDU0ODIzODQ5ZmViZDVhZDZjZGU5NGE3ZjYwLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMMjUyMzczNzIzODM3NDA2MzkxZWM2YjlhMDUyNDZmNTUiLG5hbWU6ImdUYWc6VmlkZW9FdmVudENsaWNrIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiIudmpzLWJpZy1wbGF5LWJ1dHRvbiIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITB9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiLyhrby1rcnx6aC10d3xlbi1zZykvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6VmlkZW9QbGF5QnRuSWRMaXN0IiksdD10aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvLWlkIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJ2aWRlb0d0YWdMYWJlbCIsbiksITEhPT1ufX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDMGIzMzYyMDFlNWNlNDM2M2JlOTk2MjNmMjE1YzE3ZTUtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkwzZWZhYWYxZjJhYzg0MjE2YjYyNGFmN2Q1N2Q3MzcyZiIsbmFtZToiZm9ybXNPbkNoYW5nZSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jaGFuZ2UuanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6Ii5qcy1mb3JtLWNhdGVnb3J5IixlbGVtZW50UHJvcGVydGllczpbe25hbWU6ImRhdGEtaW5kZXgiLHZhbHVlOiIxIn1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx0PXRoaXMuY2hpbGRyZW47Zm9yKHZhciBuIGluIHQpaWYodFtuXS5zZWxlY3RlZClpZigtMTxlLmluZGV4T2YoImNvbnRhY3QiKSl7dmFyIHI9IkNvbnRhY3QgZm9ybToiK3Rbbl0udmFsdWU7X3NhdGVsbGl0ZS5zZXRWYXIoImZvcm06bGlua05hbWUiLHIpfWVsc2Ugcj0iQ1MgQWdlbnQgRm9ybToiK3Rbbl0udmFsdWUsX3NhdGVsbGl0ZS5zZXRWYXIoImZvcm06bGlua05hbWUiLHIpO3JldHVybiIvZW4tZ2IvY3VzdG9tZXItc3VwcG9ydC9jb250YWN0Lmh0bWwiPT1lfHwiL2VuLWdiL2N1c3RvbWVyLXN1cHBvcnQuaHRtbCI9PWV9fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMiLHNldHRpbmdzOnt0eXBlOiJsaW5rIixsaW5rTmFtZToiJWZvcm06bGlua05hbWUlIixsaW5rVHlwZToibyJ9fV19LHtpZDoiUkxlODBkZWM4MGJiMWI0NTY2YmQ0ODE3OGM4NmI2MmEzOCIsbmFtZToiZ1RhZzpidG5PcmFuZ2VEQyIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2VsZW1lbnRTZWxlY3RvcjoiYnV0dG9uLmZ4Zy1idXR0b24iLGVsZW1lbnRQcm9wZXJ0aWVzOlt7bmFtZToiaWQiLHZhbHVlOiIoc2lnblVwQ29udGludWVCdXR0b24pfChzdWJtaXRQaW5CdXR0b24pIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcL2ZkbWVucm9sbG1lbnRcXC9cXD9zaWdudXBcXD10cnVlIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6YnRuT3JhbmdlRENQYWdlTGlzdE1hcHBpbmciKSx0PXRoaXMuaWQ7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJkY09yYW5nZUJ0bkxhYmVsIixuKSwhMSE9PW59fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM0NWUxOTg4ZjhiYWY0OWQ0YTdmMTc5YTgwMmUwNGExMi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDkwOGU3NGVhNDk2MjQ4Yjg4NGVhYzA1NDQ0YjgzNjc0IixuYW1lOiJnVGFnOmJ0bk9yYW5nZUFXIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJidXR0b24uZnhnLWJ1dHRvbiIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJpZCIsdmFsdWU6IihzaWduVXBDb250aW51ZUJ1dHRvbil8KHN1Ym1pdFBpbkJ1dHRvbikiLHZhbHVlSXNSZWdleDohMH1dLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiEwfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiXFwvZmRtZW5yb2xsbWVudFxcL1xcP3NpZ251cFxcPXRydWUiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiJcXC9zaGlwcGluZy9pbmR1c3RyeS1zb2x1dGlvbnMvaGVhbHRoY2FyZS9jb250YWN0LXVzIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6YnRuT3JhbmdlQVdQYWdlTGlzdE1hcHBpbmciKSx0PXRoaXMuaWQ7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgbj1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJhd09yYW5nZUJ0bkxhYmVsIixuKSwhMSE9PW59fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM0YjU3M2I0ZDI4ODE0ZmFhYTNiYjRhZWU0ZDZiOGJhYi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDg0YzRlMTNkOTE2MTQxYjlhNmI0OGY4Y2U2ZDk0ZDAzIixuYW1lOiJnVGFnOmN0YU9yYW5nZUZCIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJhLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlIixlbGVtZW50UHJvcGVydGllczpbe25hbWU6ImRhdGEtYW5hbHl0aWNzIix2YWx1ZToiKGhlcm9cXHxBcHBseSBOb3cpfChoZXJvXFx8R2V0IFN0YXJ0ZWQpfChsaW5rXFx8U3RhcnQgT3JkZXIpIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjYwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT1fc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpjdGFPcmFuZ2VGQlBhZ2VMaXN0TWFwcGluZyIpLHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIik7dmFyIG49X2ZkeC5wYWdlRmxhZyhlLHQpO2lmKCJvYmplY3QiIT10eXBlb2YgbilyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoImZiT3JhbmdlRXZlbnQiLG4pLCExIT09bjt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuY2xhc3NOYW1lKSxpPXRoaXM7cmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCJmYk9yYW5nZUV2ZW50IixfZmR4LmdldEd0YWdMYWJlbChuLHIsaSkpLCEwfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDMThhMTZjZDEzYjIwNGU3Nzk5M2EwYjk5MTA0MmMzN2Mtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw1ZDcxYTc1MGEwOWU0YzUxYWJmYmMyODM5YmQ4ZDQ3OCIsbmFtZToicXVhbHRyaWNzIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoInF1YWx0cmljczpwYWdlTGlzdE1hcHBpbmciKSx0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxuPV9zYXRlbGxpdGUuZ2V0VmFyKCJxdWFsdHJpY3M6cGFnZU5hbWUiKSxyPV9zYXRlbGxpdGUuZ2V0VmFyKCJjb250ZW50OnBhZ2VQYXRoIik7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgaT1fZmR4LnBhZ2VGbGFnKGUsdCk7cmV0dXJuIGl8fF9mZHgucGFnZUZsYWcobixyKX19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6JzxzY3JpcHQ+XG4vLy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vLyAgICAgUVVBTFRSSUNTIFNJVEUgSU5URVJDRVBUIHwgMTU1MC4wNjI3MjAxNC4wMSBcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLyogQkVHSU4gUVVBTFRSSUNTIFNJVEUgSU5URVJDRVBUICovXG4vL0ZFREVYIC0gQWRkZWQgdmVyc2lvbiBpbmZvLlxudmFyIGludGVyY2VwdFZlcnNpb24gPSAiMTU1MC4wNjI3MjAxNC4wMSI7XG4vL0ZFREVYIC0gUmVtb3ZlZCBmb3IgbGF6eSBsb2FkLlxuLy88c2NyaXB0IHR5cGU9XCd0ZXh0L2phdmFzY3JpcHRcJz5cbi8vRkVERVggLSBBZGRlZCBvdXRzaWRlIHRyeS9jYXRjaC5cbnRyeSB7XG5cdC8vRkVERVggLSBSZXBsYWNlIGlubGluZSBESVYgYW5kIGNyZWF0ZSBkeW5hbWljYWxseS5cblx0dmFyIGludGVyY2VwdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCdkaXZcJyk7XG5cdGludGVyY2VwdERpdi5pZCA9IFwnWk5fYWd6NGpPODdsTUlVTzFLXCc7XG5cdHZhciBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCdib2R5XCcpWzBdO1xuXHRiLmFwcGVuZENoaWxkKGludGVyY2VwdERpdik7XG5cblx0KGZ1bmN0aW9uKCl7dmFyIGc9ZnVuY3Rpb24oZSxoLGYsZyl7XG5cdFx0dGhpcy5nZXQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBhPWErIj0iLGM9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7IiksYj0wLGU9Yy5sZW5ndGg7YjxlO2IrKyl7Zm9yKHZhciBkPWNbYl07IiAiPT1kLmNoYXJBdCgwKTspZD1kLnN1YnN0cmluZygxLGQubGVuZ3RoKTtpZigwPT1kLmluZGV4T2YoYSkpcmV0dXJuIGQuc3Vic3RyaW5nKGEubGVuZ3RoLGQubGVuZ3RoKX1yZXR1cm4gbnVsbH07XG5cdFx0dGhpcy5zZXQ9ZnVuY3Rpb24oYSxjKXt2YXIgYj0iIixiPW5ldyBEYXRlO2Iuc2V0VGltZShiLmdldFRpbWUoKSs2MDQ4RTUpO2I9IjsgZXhwaXJlcz0iK2IudG9HTVRTdHJpbmcoKTtkb2N1bWVudC5jb29raWU9YSsiPSIrYytiKyI7IHBhdGg9LzsgIn07XG5cdFx0dGhpcy5jaGVjaz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0KGYpO2lmKGEpYT1hLnNwbGl0KCI6Iik7ZWxzZSBpZigxMDAhPWUpInYiPT1oJiYoZT1NYXRoLnJhbmRvbSgpPj1lLzEwMD8wOjEwMCksYT1baCxlLDBdLHRoaXMuc2V0KGYsYS5qb2luKCI6IikpO2Vsc2UgcmV0dXJuITA7dmFyIGM9YVsxXTtpZigxMDA9PWMpcmV0dXJuITA7c3dpdGNoKGFbMF0pe2Nhc2UgInYiOnJldHVybiExO2Nhc2UgInIiOnJldHVybiBjPWFbMl0lTWF0aC5mbG9vcigxMDAvYyksYVsyXSsrLHRoaXMuc2V0KGYsYS5qb2luKCI6IikpLCFjfXJldHVybiEwfTtcblx0XHQvL0ZFREVYIC0gQWRkZWQgdHJ5L2NhdGNoIGZvciB3aGVuIHRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGxvYWQgZXZlbnQuXG5cdFx0dGhpcy5nbz1mdW5jdGlvbigpe3RyeXtpZih0aGlzLmNoZWNrKCkpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2EudHlwZT0idGV4dC9qYXZhc2NyaXB0IjthLnNyYz1nKyAiJnQ9IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX19Y2F0Y2goZSl7fX07XG5cdFx0Ly90aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXthLmdvKCl9LCExKTp3aW5kb3cuYXR0YWNoRXZlbnQmJndpbmRvdy5hdHRhY2hFdmVudCgib25sb2FkIixmdW5jdGlvbigpe2EuZ28oKX0pfX07XG5cdFx0Ly9GRURFWCAtIFJlcGxhY2VkIGxpbmUgYWJvdmUgdG8gdXBkYXRlIHRvIGZpcmUgd2hlbiBkb2N1bWVudC5yZWFkeVN0YXRlIGlzIGFscmVhZHkgY29tcGxldGUgZm9yIGxhenkgbG9hZC5cblx0XHR0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczsoZG9jdW1lbnQucmVhZHlTdGF0ZSE9ImNvbXBsZXRlIik/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe2EuZ28oKX0sITEpOndpbmRvdy5hdHRhY2hFdmVudCYmd2luZG93LmF0dGFjaEV2ZW50KCJvbmxvYWQiLGZ1bmN0aW9uKCl7YS5nbygpfSkpOmEuZ28oKTt9fTtcblx0XHQvL0ZFREVYIC0gSGFuZGxlIGRldi90ZXN0IGFuZCBwcm9kLlxuXHRcdHZhciBmZHhfUVNJX3BhcmFtX2Vudj0od2luZG93LmxvY2F0aW9uLmhvc3Q9PT0id3d3LmZlZGV4LmNvbSIpID8gIiI6IiZRX1ZFUlNJT049MCI7IFxuXHRcdHRyeXtcblx0XHRcdChuZXcgZygxMDAsInIiLCJRU0lfU19aTl9hZ3o0ak84N2xNSVVPMUsiLCIvL3puX2FnejRqbzg3bG1pdW8xay1mZWRleC5zaXRlaW50ZXJjZXB0LnF1YWx0cmljcy5jb20vV1JTaXRlSW50ZXJjZXB0RW5naW5lLz9RX1pJRD1aTl9hZ3o0ak84N2xNSVVPMUsmUV9MT0M9IitlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpK2ZkeF9RU0lfcGFyYW1fZW52KSkuc3RhcnQoKVxuXHRcdH1cblx0XHRjYXRjaChpKXt9XG5cdH0pKCk7XG59XG5jYXRjaChlKXt9XG5cbjxcL3NjcmlwdD4nLGxhbmd1YWdlOiJodG1sIn19XX0se2lkOiJSTGRlOTk1MDE1MjA4OTQ5NmZhMzNlNzE4NzliOTg5YThmIixuYW1lOiJnVGFnOkRGQUV2ZW50IixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7InVuZGVmaW5lZCI9PXR5cGVvZiBfZmR4JiZfc2F0ZWxsaXRlLmdldFZhcigiX2ZkeFV0aWwiKTt2YXIgZT1fZmR4LnBjZlV0aWwoKS5tYXRjaCgvd3d3KHNib3guaWRldnxiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpLHQ9IiI9PV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnRGlzYWJsZUxvY2FsZSIpLG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHI9X3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6Y291bnRyeUNvZGUiKSxpPV9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkRGQUV2ZW50TWFwcGluZyIpLGE9X2ZkeC5wYWdlRmxhZyhpLHIsImNvdW50cnkiKSxvPV9mZHgucGFnZUZsYWcoYSxuKTtyZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoImRjTGFiZWwiLG8pLCEoITE9PT1vfHxudWxsPT09ZXx8IXQpfX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTonPHNjcmlwdD5cbiAgZ3RhZyhcJ2V2ZW50XCcsIFwnY29udmVyc2lvblwnLFxuICAgIHtcbiAgICAgICAgImFsbG93X2N1c3RvbV9zY3JpcHRzIjogZmFsc2UsXG4gICAgICAgIFwnc2VuZF90b1wnOiBfc2F0ZWxsaXRlLmdldFZhcigiZGNMYWJlbCIpXG4gICAgfSk7XG48XC9zY3JpcHQ+XG5ceDNjIS0tXG52YXIgZGZhTWFwcGluZyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkRGQUV2ZW50TWFwcGluZyIpOyAgXG52YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG51cmwgPSAgLy5jb20oLiopLy5leGVjKHVybClbMV07XG52YXIgb2JqREZBID0iIjsgXG52YXIgZXZlbnRfdHlwZSA9ICIiO1xudmFyIGV2ZW50X25hbWUgPSAiIjtcbnZhciBldmVudF9wYXJhbSA9ICIiO1xuaWYgKCh0eXBlb2YgZGZhTWFwcGluZyAhPT0gInVuZGVmaW5lZCIgJiYgZGZhTWFwcGluZyAhPT0gIiIpICYmICh0eXBlb2YgdXJsICE9PSAidW5kZWZpbmVkIiAmJiB1cmwgIT09ICIiKSl7XG5cdGZvcih2YXIga2V5IGluIGRmYU1hcHBpbmcpe1x0XHRcdFx0XG5cdFx0aWYodXJsLmluZGV4T2Yoa2V5KSA+IC0xKXtcblx0XHRcdG9iakRGQSA9IGRmYU1hcHBpbmdba2V5XTtcdFx0XHQgXG5cdFx0XHRicmVhaztcdFx0XHRcdCAgXG5cdFx0fVxuXHR9XG59ICBcbmlmICgodHlwZW9mIG9iakRGQSAhPT0gInVuZGVmaW5lZCIgJiYgb2JqREZBICE9PSAiIikgKXtcblx0ZXZlbnRfdHlwZSA9IG9iakRGQVsiZXZlbnRfdHlwZSJdO1xuXHRldmVudF9uYW1lID0gb2JqREZBWyJldmVudF9uYW1lIl07XG5cdGV2ZW50X3BhcmFtID0gb2JqREZBWyJldmVudF9wYXJhbSJdO1xufVxuZ3RhZyhldmVudF90eXBlLCBldmVudF9uYW1lLCBldmVudF9wYXJhbSk7XG48XC9zY3JpcHQ+LS1ceDNlJyxsYW5ndWFnZToiaHRtbCJ9fV19LHtpZDoiUkxlN2NiOWI0MWE1ODE0MzNkYjUzYTlhZWE4YWJiMjgxMyIsbmFtZToidmlkZW86MjUlIFZpZXdlZCIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMiLHNldHRpbmdzOnt1bml0OiJwZXJjZW50IixhbW91bnQ6MjUsZWxlbWVudFNlbGVjdG9yOiIuYnJpZ2h0Y292ZS1jb250YWluZXIgdmlkZW8iLGJ1YmJsZUZpcmVJZlBhcmVudDohMCxidWJibGVGaXJlSWZDaGlsZEZpcmVkOiExfSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOltdLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcyIsc2V0dGluZ3M6e2N1c3RvbVNldHVwOntzb3VyY2U6ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMucGFyZW50RWxlbWVudCl7Zm9yKHZhciBuPXRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikscj10aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvLWlkIiksaT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJicmlnaHRjb3ZlLWNvbnRhaW5lciIpLGE9MDthPGkubGVuZ3RoO2ErKylpZihuPT1pW2FdLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGF5ZXJpZCIpKXt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2anMtZG9jay10aXRsZSIpO3QuZVZhcjQyPW9bYV0uaW5uZXJUZXh0LHQuZVZhcjMxPXIsdC5saW5rVHJhY2tWYXJzPXQuYXBsKHQubGlua1RyYWNrVmFycywiZVZhcjQyLGVWYXIzMSIsIiwiLDIpfXQubGlua1RyYWNrRXZlbnRzPXQuZXZlbnRzPSJldmVudDIwNCJ9fX0sdHJhY2tlclByb3BlcnRpZXM6e319fSx7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzIixzZXR0aW5nczp7dHlwZToibGluayIsbGlua05hbWU6IlZpZGVvOjI1JSBWaWV3IixsaW5rVHlwZToibyJ9fV19LHtpZDoiUkxiMzI4Y2U4ODE2YmE0OGQ5YjZkODRjYWI2MzRmNGFjZSIsbmFtZToic2VhcmNoUmVzdWx0VHJhY2siLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6Ii5jcS1zbnAtcmVzdWx0c2V0LWhlYWRlciIsYnViYmxlRmlyZUlmUGFyZW50OiEwLGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ITF9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzIixzZXR0aW5nczp7Y3VzdG9tU2V0dXA6e3NvdXJjZTpmdW5jdGlvbihlLHQpe3QubGlua1RyYWNrVmFycz0icHJvcDMxLGVWYXI0Myxwcm9wNTEsZVZhcjUxLGVWYXI1Myxwcm9wMjkscHJvcDE4LHByb3AxOSxwcm9wMjAsZXZlbnRzIix0LmxpbmtUcmFja0V2ZW50cz0iTm9uZSIsdC5saW5rVHJhY2tFdmVudHM9dC5ldmVudHM9ImV2ZW50MTIyIjt2YXIgbj10aGlzLmZpcnN0RWxlbWVudENoaWxkLmhyZWYscj1fc2F0ZWxsaXRlLmdldFZhcigic2VhcmNoOnRlcm0iKTtuPXIrInwiK24sdC5lVmFyNDM9Ikw6SW50U3JjaDoiK3IsdC5lVmFyNTE9dC5wcm9wNTE9bix0LmVWYXI1Mz0iKzEiLHQucHJvcDE4PXQucGFnZU5hbWUsdC5wcm9wMTk9bix0LnByb3AyMD10LnBhZ2VOYW1lKyI6IituLHQucHJvcDMxPSIiIT09dC52aXNpdG9yLmdldEFuYWx5dGljc1Zpc2l0b3JJRCgpPyJbQ1NddjF8Iit0LnZpc2l0b3IuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKCkrIltDRV0iOnQudmlzaXRvci5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLG5sdHJrPSJ5In19LHRyYWNrZXJQcm9wZXJ0aWVzOnt9fX0se21vZHVsZVBhdGg6ImFkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcyIsc2V0dGluZ3M6e3R5cGU6ImxpbmsiLGxpbmtOYW1lOiJTZWFyY2ggUmVzdWx0IixsaW5rVHlwZToibyJ9fV19LHtpZDoiUkw2MDI2MGFmZjBlNmM0YWExYjUyOGE4ZWY3MzQ4NDNmNiIsbmFtZToidmVyaXpvbjpjdGFPcmFuZ2VCdXR0b24iLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMiLHNldHRpbmdzOntlbGVtZW50U2VsZWN0b3I6ImJ1dHRvbi5meGctYnV0dG9uLmZ4Zy1idXR0b24tLXN1Ym1pdCIsZWxlbWVudFByb3BlcnRpZXM6W3tuYW1lOiJkYXRhLWFuYWx5dGljcyIsdmFsdWU6IihGb3JtXFx8RnJlaWdodCBRdW90ZSB3aXRoIEFjY291bnQpfChGb3JtXFx8RU4tRnJlaWdodCBRdW90ZS1Oby1BY2NvdW50KXwoRm9ybVxcfEZSLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCl8KEZvcm1cXHxGUi1GcmVpZ2h0IFF1b3RlKXwoRm9ybVxcfEJleW9uZCB0aGUgQnV5IEJ1dHRvbil8KEZvcm1cXHxCZXlvbmQgdGhlIEJ1eSBCdXR0b24tRlIpIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyIsc2V0dGluZ3M6e2FuY2hvckRlbGF5OjZlMyxlbGVtZW50U2VsZWN0b3I6ImEuZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UiLGVsZW1lbnRQcm9wZXJ0aWVzOlt7bmFtZToiZGF0YS1hbmFseXRpY3MiLHZhbHVlOiIobGlua1xcfFN0YXJ0IHlvdXIgcXVvdGUpfChsaW5rXFx8Q29tbWVuY2V6IHZvdHJlIGVzdGltYXRpb24pIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJcXC8oKGVufGZyKS1jYSlcXC9zaGlwcGluZy10b29sc1xcLyhmcmVpZ2h0LXF1b3RlLmh0bWx8ZnJlaWdodC1xdW90ZS1uby1hY2NvdW50Lmh0bWwpIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvKChlbnxmciktY2EpXFwvc21hbGwtYnVzaW5lc3NcXC9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwiLHZhbHVlSXNSZWdleDohMH0se3ZhbHVlOiIobGlua1xcfFN0YXJ0IHlvdXIgcXVvdGUpfChsaW5rXFx8Q29tbWVuY2V6IHZvdHJlIGVzdGltYXRpb24pIix2YWx1ZUlzUmVnZXg6ITB9XX19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9X3NhdGVsbGl0ZS5nZXRWYXIoInZlcml6b25CdG5DbGlja01hcHBpbmciKSx0PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWFuYWx5dGljcyIpOyJ1bmRlZmluZWQiPT10eXBlb2YgX2ZkeCYmX3NhdGVsbGl0ZS5nZXRWYXIoIl9mZHhVdGlsIik7dmFyIG49X2ZkeC5wYWdlRmxhZyhlLHQpO3JldHVybiBfc2F0ZWxsaXRlLnNldFZhcigicGl4ZWxJZCIsblswXSksX3NhdGVsbGl0ZS5zZXRWYXIoIkVDIixuWzFdKSwhMSE9PW59fX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM5YWIxZmU2NDEwMGM0NmRmODg3Y2NjNjA3NjQ0ZDQyMS1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTGUxMjRhZWY0NzU0ZTRkNzJhNDVhOTc3OTM4MWU2NjVjIixuYW1lOiJldmVudDpmb3JtU3VibWl0QnV0dG9uIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzIixzZXR0aW5nczp7ZWxlbWVudFNlbGVjdG9yOiJidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UgIixlbGVtZW50UHJvcGVydGllczpbe25hbWU6ImRhdGEtYW5hbHl0aWNzIix2YWx1ZToiKEZvcm1cXHxFTi1GcmVpZ2h0IFF1b3RlLU5vLUFjY291bnQpfChGb3JtXFx8U3VibWl0IEJ1dHRvbi1Mb2dpc3RpY3MgQ29udGFjdCBVcyl8KEZvcm1cXHxTb3VtZXR0cmUtTG9naXN0aWNzIENvbnRhY3QgVXMtRlIpIix2YWx1ZUlzUmVnZXg6ITB9XSxidWJibGVGaXJlSWZQYXJlbnQ6ITAsYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDohMH0scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmFseXRpY3MiKSx0PXsiRm9ybXxFTi1GcmVpZ2h0IFF1b3RlLU5vLUFjY291bnQiOiJldmVudDE5MyIsIkZvcm18U3VibWl0IEJ1dHRvbi1Mb2dpc3RpY3MgQ29udGFjdCBVcyI6ImV2ZW50MTk0IiwiRm9ybXxTb3VtZXR0cmUtTG9naXN0aWNzIENvbnRhY3QgVXMtRlIiOiJldmVudDE5NCJ9LG49IiI7cmV0dXJuIG49X2ZkeC5wYWdlRmxhZyh0LGUpLF9zYXRlbGxpdGUuc2V0VmFyKCJmb3JtRXZlbnQiLG4pLCJ1bmRlZmluZWQiIT09biYmIiIhPT1ufX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMiLHNldHRpbmdzOntjdXN0b21TZXR1cDp7c291cmNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49X3NhdGVsbGl0ZS5nZXRWYXIoImZvcm1FdmVudCIpO3QubGlua1RyYWNrRXZlbnRzPXQuZXZlbnRzPW59fSx0cmFja2VyUHJvcGVydGllczp7fX19XX0se2lkOiJSTDliZmViM2RmMTBjNzRhNGY5ZTY3ZWMwMGE2MTQxODk4IixuYW1lOiJyZWN0YWc6Q29udGVudFNxdWFyZSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcLyhlbi11cylcXC8ocHJpbnRpbmd8b2ZmaWNlKVxcLyhwZXJzb25hbC1wcm9qZWN0c3xvbmxpbmUtcHJpbnRpbmd8YmFubmVyc3xidXNpbmVzcy1jYXJkc3xjb25zdW1lci1vZmZlcnN8ZGVzaWduLXNlcnZpY2VzfGZsYXNoLXNhbGUtb2ZmZXJzfGdyZWV0aW5nLWNhcmRzfG1hcmtldGluZy1tYXRlcmlhbHN8bWVudXN8bmF0aW9uYWwtYmlkLWNlbnRlcnxvbmxpbmUtY3VzdG9tLWZyYW1lc3xwYXNzcG9ydC1waG90b3xwaG90b2Jvb2tzfHBvc3RlcnN8cG9zdGVyLXNpZ24tYmFubmVyLXByaW50aW5nfHByaW50LXByZWZlcnJlZHxzaWduc3xzbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzfHNlcnZpY2VzfHByaW50YW5kZ298Y3VzdG9tZXJzdXBwb3J0KS5odG1sIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiXFwvKGVuLXVzKVxcLyhzaGlwcGluZ3xwcmludGluZylcXC8obWFya2V0aW5nLW1hdGVyaWFsc3xwYWNraW5nLXN1cHBsaWVzfHBvc3RlcnMpXFwvKGJyb2NodXJlc3xmbHllcnN8cG9zdGNhcmRzfGN1c3RvbS1icmFuZGVkLWJveGVzfHByaW50cykuaHRtbCIsdmFsdWVJc1JlZ2V4OiEwfSx7dmFsdWU6IlxcLyhlbi11cylcXC8ob2ZmaWNlfHByaW50aW5nfGNvdXBvbi1vZmZlcnN8KS5odG1sIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29udGVudHNxdWFyZS9zcmMvbGliL2FjdGlvbnMvdXhhSW5zdGFsbGF0aW9uLmpzIixzZXR0aW5nczp7c2V0UGF0aElucHV0OiIiLHNldFF1ZXJ5SW5wdXQ6IiIsc2V0UGF0aENoZWNrYm94OiExLHNldFF1ZXJ5Q2hlY2tib3g6ITF9fV19XX07dmFyICRfX192YXJfMTFjNGI3MGFkN2NlOGNmYj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKG4pe2lmKG4uX19lc01vZHVsZSlyZXR1cm4gbjt2YXIgcj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHQuZ2V0P3Q6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5bZV19fSl9KSxyfWZ1bmN0aW9uIHQoZSl7dmFyIHQ9e2V4cG9ydHM6e319O3JldHVybiBlKHQsdC5leHBvcnRzKSx0LmV4cG9ydHN9ZnVuY3Rpb24gbih0KXt2YXIgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIG4ucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBuLnJlamVjdChlKX0pfSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gQm9vbGVhbihlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUubGVuZ3RoKX1mdW5jdGlvbiByKCl7fWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gYShlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXciKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMuX3N0YXRlPTAsdGhpcy5faGFuZGxlZD0hMSx0aGlzLl92YWx1ZT11bmRlZmluZWQsdGhpcy5fZGVmZXJyZWRzPVtdLGYoZSx0aGlzKX1mdW5jdGlvbiBvKHIsaSl7Zm9yKDszPT09ci5fc3RhdGU7KXI9ci5fdmFsdWU7MCE9PXIuX3N0YXRlPyhyLl9oYW5kbGVkPSEwLGEuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7dmFyIGU9MT09PXIuX3N0YXRlP2kub25GdWxmaWxsZWQ6aS5vblJlamVjdGVkO2lmKG51bGwhPT1lKXt2YXIgdDt0cnl7dD1lKHIuX3ZhbHVlKX1jYXRjaChuKXtyZXR1cm4gdm9pZCBjKGkucHJvbWlzZSxuKX1zKGkucHJvbWlzZSx0KX1lbHNlKDE9PT1yLl9zdGF0ZT9zOmMpKGkucHJvbWlzZSxyLl92YWx1ZSl9KSk6ci5fZGVmZXJyZWRzLnB1c2goaSl9ZnVuY3Rpb24gcyhlLHQpe3RyeXtpZih0PT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKHQmJigib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0KSl7dmFyIG49dC50aGVuO2lmKHQgaW5zdGFuY2VvZiBhKXJldHVybiBlLl9zdGF0ZT0zLGUuX3ZhbHVlPXQsdm9pZCBsKGUpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiB2b2lkIGYoaShuLHQpLGUpfWUuX3N0YXRlPTEsZS5fdmFsdWU9dCxsKGUpfWNhdGNoKHIpe2MoZSxyKX19ZnVuY3Rpb24gYyhlLHQpe2UuX3N0YXRlPTIsZS5fdmFsdWU9dCxsKGUpfWZ1bmN0aW9uIGwoZSl7Mj09PWUuX3N0YXRlJiYwPT09ZS5fZGVmZXJyZWRzLmxlbmd0aCYmYS5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKXtlLl9oYW5kbGVkfHxhLl91bmhhbmRsZWRSZWplY3Rpb25GbihlLl92YWx1ZSl9KTtmb3IodmFyIHQ9MCxuPWUuX2RlZmVycmVkcy5sZW5ndGg7dDxuO3QrKylvKGUsZS5fZGVmZXJyZWRzW3RdKTtlLl9kZWZlcnJlZHM9bnVsbH1mdW5jdGlvbiBkKGUsdCxuKXt0aGlzLm9uRnVsZmlsbGVkPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbCx0aGlzLm9uUmVqZWN0ZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsLHRoaXMucHJvbWlzZT1ufWZ1bmN0aW9uIGYoZSx0KXt2YXIgbj0hMTt0cnl7ZShmdW5jdGlvbihlKXtufHwobj0hMCxzKHQsZSkpfSxmdW5jdGlvbihlKXtufHwobj0hMCxjKHQsZSkpfSl9Y2F0Y2gocil7aWYobilyZXR1cm47bj0hMCxjKHQscil9fWZ1bmN0aW9uIHAoZSl7aWYobnVsbD09PWV8fGU9PT11bmRlZmluZWQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0KGUpfWZ1bmN0aW9uIGcoKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGU9bmV3IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIrU3RyaW5nLmZyb21DaGFyQ29kZShuKV09bjtpZigiMDEyMzQ1Njc4OSIhPT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KS5qb2luKCIiKSlyZXR1cm4hMTt2YXIgcj17fTtyZXR1cm4iYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JbZV09ZX0pLCJhYmNkZWZnaGlqa2xtbm9wcXJzdCI9PT1PYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LHIpKS5qb2luKCIiKX1jYXRjaChpKXtyZXR1cm4hMX19ZnVuY3Rpb24gbShlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1pZih3aW5kb3cuYXRvYil7dmFyIGg9ZnVuY3Rpb24oZSl7dmFyIG49W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmV2ZW50cyYmdC5ldmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtuLnB1c2goe3J1bGU6dCxldmVudDplfSl9KX0pLG4uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmV2ZW50LnJ1bGVPcmRlci10LmV2ZW50LnJ1bGVPcmRlcn0pfSx2PSJkZWJ1ZyIsYj1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKCl7cmV0dXJuInRydWUiPT09dC5nZXRJdGVtKHYpfSxyPWZ1bmN0aW9uKGUpe3Quc2V0SXRlbSh2LGUpfSxpPVtdLGE9ZnVuY3Rpb24oZSl7aS5wdXNoKGUpfTtyZXR1cm4gZS5vdXRwdXRFbmFibGVkPW4oKSx7b25EZWJ1Z0NoYW5nZWQ6YSxnZXREZWJ1Z0VuYWJsZWQ6bixzZXREZWJ1Z0VuYWJsZWQ6ZnVuY3Rpb24odCl7bigpIT09dCYmKHIodCksZS5vdXRwdXRFbmFibGVkPXQsaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCl9KSl9fX0seT0iTW9kdWxlIGRpZCBub3QgZXhwb3J0IGEgZnVuY3Rpb24uIixfPWZ1bmN0aW9uKGEsbyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtuPW58fFtdO3ZhciByPWEuZ2V0TW9kdWxlRXhwb3J0cyhlLm1vZHVsZVBhdGgpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcih5KTt2YXIgaT1vKGUuc2V0dGluZ3N8fHt9LHQpO3JldHVybiByLmJpbmQobnVsbCxpKS5hcHBseShudWxsLG4pfX0sQz1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKTplfSx4PXtMT0c6ImxvZyIsSU5GTzoiaW5mbyIsREVCVUc6ImRlYnVnIixXQVJOOiJ3YXJuIixFUlJPUjoiZXJyb3IifSxrPSLwn5qAIixFPTEwPT09cGFyc2VJbnQoKC9tc2llIChcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSl8fFtdKVsxXSk/IltMYXVuY2hdIjprLEk9ITEsdz1mdW5jdGlvbihlKXtpZihJJiZ3aW5kb3cuY29uc29sZSl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3QudW5zaGlmdChFKSxlIT09eC5ERUJVR3x8d2luZG93LmNvbnNvbGVbZV18fChlPXguSU5GTyksd2luZG93LmNvbnNvbGVbZV0uYXBwbHkod2luZG93LmNvbnNvbGUsdCl9fSxEPXcuYmluZChudWxsLHguTE9HKSxBPXcuYmluZChudWxsLHguSU5GTyksUz13LmJpbmQobnVsbCx4LkRFQlVHKSxUPXcuYmluZChudWxsLHguV0FSTiksUD13LmJpbmQobnVsbCx4LkVSUk9SKSxPPXtsb2c6RCxpbmZvOkEsZGVidWc6Uyx3YXJuOlQsZXJyb3I6UCxkZXByZWNhdGlvbjpmdW5jdGlvbigpe3ZhciBlPUk7ST0hMCx3LmFwcGx5KG51bGwsQXJyYXkucHJvdG90eXBlLmNvbmNhdCh4LldBUk4sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpLGV8fChJPSExKX0sZ2V0IG91dHB1dEVuYWJsZWQoKXtyZXR1cm4gSX0sc2V0IG91dHB1dEVuYWJsZWQoZSl7ST1lfSxjcmVhdGVQcmVmaXhlZExvZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD0iWyIrZSsiXSI7cmV0dXJue2xvZzpELmJpbmQobnVsbCx0KSxpbmZvOkEuYmluZChudWxsLHQpLGRlYnVnOlMuYmluZChudWxsLHQpLHdhcm46VC5iaW5kKG51bGwsdCksZXJyb3I6UC5iaW5kKG51bGwsdCl9fX0saj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9LEw9dChmdW5jdGlvbihyKXshZnVuY3Rpb24oZSl7aWYoci5leHBvcnRzPWUoKSwhITApe3ZhciB0PXdpbmRvdy5Db29raWVzLG49d2luZG93LkNvb2tpZXM9ZSgpO24ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuQ29va2llcz10LG59fX0oZnVuY3Rpb24oKXtmdW5jdGlvbiBjKCl7Zm9yKHZhciBlPTAsdD17fTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pdFtyXT1uW3JdfXJldHVybiB0fWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGUucmVwbGFjZSgvKCVbMC05QS1aXXsyfSkrL2csZGVjb2RlVVJJQ29tcG9uZW50KX1mdW5jdGlvbiBlKHUpe2Z1bmN0aW9uIHMoKXt9ZnVuY3Rpb24gbihlLHQsbil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7Im51bWJlciI9PXR5cGVvZihuPWMoe3BhdGg6Ii8ifSxzLmRlZmF1bHRzLG4pKS5leHBpcmVzJiYobi5leHBpcmVzPW5ldyBEYXRlKDEqbmV3IERhdGUrODY0ZTUqbi5leHBpcmVzKSksbi5leHBpcmVzPW4uZXhwaXJlcz9uLmV4cGlyZXMudG9VVENTdHJpbmcoKToiIjt0cnl7dmFyIHI9SlNPTi5zdHJpbmdpZnkodCk7L15bXHtcW10vLnRlc3QocikmJih0PXIpfWNhdGNoKG8pe310PXUud3JpdGU/dS53cml0ZSh0LGUpOmVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodCkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csZGVjb2RlVVJJQ29tcG9uZW50KSxlPWVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZSkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csZGVjb2RlVVJJQ29tcG9uZW50KS5yZXBsYWNlKC9bXChcKV0vZyxlc2NhcGUpO3ZhciBpPSIiO2Zvcih2YXIgYSBpbiBuKW5bYV0mJihpKz0iOyAiK2EsITAhPT1uW2FdJiYoaSs9Ij0iK25bYV0uc3BsaXQoIjsiKVswXSkpO3JldHVybiBkb2N1bWVudC5jb29raWU9ZSsiPSIrdCtpfX1mdW5jdGlvbiB0KGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7Zm9yKHZhciBuPXt9LHI9ZG9jdW1lbnQuY29va2llP2RvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyAiKTpbXSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBhPXJbaV0uc3BsaXQoIj0iKSxvPWEuc2xpY2UoMSkuam9pbigiPSIpO3R8fCciJyE9PW8uY2hhckF0KDApfHwobz1vLnNsaWNlKDEsLTEpKTt0cnl7dmFyIHM9bChhWzBdKTtpZihvPSh1LnJlYWR8fHUpKG8scyl8fGwobyksdCl0cnl7bz1KU09OLnBhcnNlKG8pfWNhdGNoKGMpe31pZihuW3NdPW8sZT09PXMpYnJlYWt9Y2F0Y2goYyl7fX1yZXR1cm4gZT9uW2VdOm59fXJldHVybiBzLnNldD1uLHMuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsITEpfSxzLmdldEpTT049ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSwhMCl9LHMucmVtb3ZlPWZ1bmN0aW9uKGUsdCl7bihlLCIiLGModCx7ZXhwaXJlczotMX0pKX0scy5kZWZhdWx0cz17fSxzLndpdGhDb252ZXJ0ZXI9ZSxzfXJldHVybiBlKGZ1bmN0aW9uKCl7fSl9KX0pLE09e2dldDpMLmdldCxzZXQ6TC5zZXQscmVtb3ZlOkwucmVtb3ZlfSxWPXdpbmRvdyxSPSJjb20uYWRvYmUucmVhY3Rvci4iLEY9ZnVuY3Rpb24ocixlKXt2YXIgaT1SKyhlfHwiIik7cmV0dXJue2dldEl0ZW06ZnVuY3Rpb24oZSl7Y29uc3QgJF9fX29sZF8xYmNmNzE2NGFlZTFlNGFiPXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csImxvY2FsU3RvcmFnZSIpO3RyeXtpZigkX19fb2xkXzFiY2Y3MTY0YWVlMWU0YWIpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX21vY2tfYzdjYWVjNTAxZGNhMjM4Ny5sb2NhbFN0b3JhZ2UpO3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gVltyXS5nZXRJdGVtKGkrZSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtpZigkX19fb2xkXzFiY2Y3MTY0YWVlMWU0YWIpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX29sZF8xYmNmNzE2NGFlZTFlNGFiKX19LHNldEl0ZW06ZnVuY3Rpb24oZSx0KXtjb25zdCAkX19fb2xkX2EyZDBmMzU3OWViMDU3MWM9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e2lmKCRfX19vbGRfYTJkMGYzNTc5ZWIwNTcxYykoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywibG9jYWxTdG9yYWdlIiwkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3LmxvY2FsU3RvcmFnZSk7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBWW3JdLnNldEl0ZW0oaStlLHQpLCEwfWNhdGNoKG4pe3JldHVybiExfX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF9hMmQwZjM1NzllYjA1NzFjKSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLCRfX19vbGRfYTJkMGYzNTc5ZWIwNTcxYyl9fX19LE49Il9zZHNhdF8iLEI9ImRhdGFFbGVtZW50cy4iLFU9ImRhdGFFbGVtZW50Q29va2llc01pZ3JhdGVkIixxPUYoImxvY2FsU3RvcmFnZSIpLHo9Rigic2Vzc2lvblN0b3JhZ2UiLEIpLEg9RigibG9jYWxTdG9yYWdlIixCKSxXPXtQQUdFVklFVzoicGFnZXZpZXciLFNFU1NJT046InNlc3Npb24iLFZJU0lUT1I6InZpc2l0b3IifSxHPXt9LFk9ZnVuY3Rpb24oZSl7dmFyIHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2gobil7fXJldHVybiB0fSxYPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSBXLlBBR0VWSUVXOnJldHVybiB2b2lkKEdbZV09bik7Y2FzZSBXLlNFU1NJT046cmV0dXJuIHZvaWQoKHI9WShuKSkmJnouc2V0SXRlbShlLHIpKTtjYXNlIFcuVklTSVRPUjpyZXR1cm4gdm9pZCgocj1ZKG4pKSYmSC5zZXRJdGVtKGUscikpfX0sSz1mdW5jdGlvbihlLHQpe3ZhciBuPU0uZ2V0KE4rZSk7biE9PXVuZGVmaW5lZCYmWChlLHQsbil9LFE9e3NldFZhbHVlOlgsZ2V0VmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjtzd2l0Y2godCl7Y2FzZSBXLlBBR0VWSUVXOnJldHVybiBHLmhhc093blByb3BlcnR5KGUpP0dbZV06bnVsbDtjYXNlIFcuU0VTU0lPTjpyZXR1cm4gbnVsbD09PShuPXouZ2V0SXRlbShlKSk/bjpKU09OLnBhcnNlKG4pO2Nhc2UgVy5WSVNJVE9SOnJldHVybiBudWxsPT09KG49SC5nZXRJdGVtKGUpKT9uOkpTT04ucGFyc2Uobil9fSxtaWdyYXRlQ29va2llRGF0YTpmdW5jdGlvbih0KXtxLmdldEl0ZW0oVSl8fChPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0soZSx0W2VdLnN0b3JhZ2VEdXJhdGlvbil9KSxxLnNldEl0ZW0oVSwhMCkpfX0sJD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iRmFpbGVkIHRvIGV4ZWN1dGUgZGF0YSBlbGVtZW50IG1vZHVsZSAiK2UubW9kdWxlUGF0aCsiIGZvciBkYXRhIGVsZW1lbnQgIit0KyIuICIrbisocj8iXG4iK3I6IiIpfSxKPWZ1bmN0aW9uKHMsYyx1LGwpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWMoZSk7aWYoIW4pcmV0dXJuIGw/IiI6dW5kZWZpbmVkO3ZhciByLGk9bi5zdG9yYWdlRHVyYXRpb247dHJ5e3I9cy5nZXRNb2R1bGVFeHBvcnRzKG4ubW9kdWxlUGF0aCl9Y2F0Y2gobyl7cmV0dXJuIHZvaWQgTy5lcnJvcigkKG4sZSxvLm1lc3NhZ2Usby5zdGFjaykpfWlmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXt2YXIgYTt0cnl7YT1yKHUobi5zZXR0aW5ncyx0KSx0KX1jYXRjaChvKXtyZXR1cm4gdm9pZCBPLmVycm9yKCQobixlLG8ubWVzc2FnZSxvLnN0YWNrKSl9cmV0dXJuIGkmJihudWxsIT1hP1Euc2V0VmFsdWUoZSxpLGEpOmE9US5nZXRWYWx1ZShlLGkpKSxudWxsPT1hJiZudWxsIT1uLmRlZmF1bHRWYWx1ZSYmKGE9bi5kZWZhdWx0VmFsdWUpLCJzdHJpbmciPT10eXBlb2YgYSYmKG4uY2xlYW5UZXh0JiYoYT1DKGEpKSxuLmZvcmNlTG93ZXJDYXNlJiYoYT1hLnRvTG93ZXJDYXNlKCkpKSxhfU8uZXJyb3IoJChuLGUsIk1vZHVsZSBkaWQgbm90IGV4cG9ydCBhIGZ1bmN0aW9uLiIpKX19LFo9e3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGV4dENvbnRlbnR9LGNsZWFuVGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gQyhlLnRleHRDb250ZW50KX19LGVlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1lLGE9MCxvPXQubGVuZ3RoO2E8bzthKyspe2lmKG51bGw9PWkpcmV0dXJuIHVuZGVmaW5lZDt2YXIgcz10W2FdO2lmKG4mJiJAIj09PXMuY2hhckF0KDApKXt2YXIgYz1zLnNsaWNlKDEpO2k9WltjXShpKX1lbHNlIGlmKGkuZ2V0QXR0cmlidXRlJiYocj1zLm1hdGNoKC9eZ2V0QXR0cmlidXRlXCgoLispXCkkLykpKXt2YXIgdT1yWzFdO2k9aS5nZXRBdHRyaWJ1dGUodSl9ZWxzZSBpPWlbc119cmV0dXJuIGl9LHRlPWZ1bmN0aW9uKGEsbyxzKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbjtpZihvKGUpKW49cyhlLHQpO2Vsc2V7dmFyIHI9ZS5zcGxpdCgiLiIpLGk9ci5zaGlmdCgpOyJ0aGlzIj09PWk/dCYmKG49ZWUodC5lbGVtZW50LHIsITApKToiZXZlbnQiPT09aT90JiYobj1lZSh0LHIpKToidGFyZ2V0Ij09PWk/dCYmKG49ZWUodC50YXJnZXQscikpOm49ZWUoYVtpXSxyKX1yZXR1cm4gbn19LG5lPWZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIi4iKVswXTtyZXR1cm4gQm9vbGVhbihyKGUpfHwidGhpcyI9PT10fHwiZXZlbnQiPT09dHx8InRhcmdldCI9PT10fHxuLmhhc093blByb3BlcnR5KHQpKX19LHJlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17ZXhwb3J0czp7fX07cmV0dXJuIGUuY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsdCxuKSxyLmV4cG9ydHN9LGllPWZ1bmN0aW9uKCl7dmFyIG89e30sbj1mdW5jdGlvbihlKXt2YXIgdD1vW2VdO2lmKCF0KXRocm93IG5ldyBFcnJvcigiTW9kdWxlICIrZSsiIG5vdCBmb3VuZC4iKTtyZXR1cm4gdH0sZT1mdW5jdGlvbigpe09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dHJ5e3IoZSl9Y2F0Y2gobil7dmFyIHQ9IkVycm9yIGluaXRpYWxpemluZyBtb2R1bGUgIitlKyIuICIrbi5tZXNzYWdlKyhuLnN0YWNrPyJcbiIrbi5zdGFjazoiIik7Ty5lcnJvcih0KX19KX0scj1mdW5jdGlvbihlKXt2YXIgdD1uKGUpO3JldHVybiB0Lmhhc093blByb3BlcnR5KCJleHBvcnRzIil8fCh0LmV4cG9ydHM9cmUodC5kZWZpbml0aW9uLnNjcmlwdCx0LnJlcXVpcmUsdC50dXJiaW5lKSksdC5leHBvcnRzfTtyZXR1cm57cmVnaXN0ZXJNb2R1bGU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgYT17ZGVmaW5pdGlvbjp0LGV4dGVuc2lvbk5hbWU6bixyZXF1aXJlOnIsdHVyYmluZTppfTthLnJlcXVpcmU9cixvW2VdPWF9LGh5ZHJhdGVDYWNoZTplLGdldE1vZHVsZUV4cG9ydHM6cixnZXRNb2R1bGVEZWZpbml0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBuKGUpLmRlZmluaXRpb259LGdldE1vZHVsZUV4dGVuc2lvbk5hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSkuZXh0ZW5zaW9uTmFtZX19fSxhZT0hMSxvZT1mdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgZT1yLl9tb25pdG9ycztlJiYoYWV8fChPLndhcm4oIlRoZSBfc2F0ZWxsaXRlLl9tb25pdG9ycyBBUEkgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLiIpLGFlPSEwKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7ZVt0XSYmZVt0XShuKX0pKX19LHNlPWZ1bmN0aW9uKGksYSxvKXt2YXIgbixyLHMsYyx1PVtdLGw9ZnVuY3Rpb24oZSx0LG4pe2lmKCFpKHQpKXJldHVybiBlO3UucHVzaCh0KTt2YXIgcj1hKHQsbik7cmV0dXJuIHUucG9wKCksbnVsbD09ciYmbz8iIjpyfTtyZXR1cm4gbj1mdW5jdGlvbihlLG4pe3ZhciB0PS9eJShbXiVdKyklJC8uZXhlYyhlKTtyZXR1cm4gdD9sKGUsdFsxXSxuKTplLnJlcGxhY2UoLyUoLis/KSUvZyxmdW5jdGlvbihlLHQpe3JldHVybiBsKGUsdCxuKX0pfSxyPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXt9LHI9T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgYT1yW2ldLG89ZVthXTtuW2FdPWMobyx0KX1yZXR1cm4gbn0scz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW4ucHVzaChjKGVbcl0sdCkpO3JldHVybiBufSxjPWZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP24oZSx0KTpBcnJheS5pc0FycmF5KGUpP3MoZSx0KToib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lP3IoZSx0KTplfSxmdW5jdGlvbihlLHQpe3JldHVybiAxMDx1Lmxlbmd0aD8oTy5lcnJvcigiRGF0YSBlbGVtZW50IGNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogIit1LmpvaW4oIiAtPiAiKSksZSk6YyhlLHQpfX0sY2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKWlbYXJndW1lbnRzWzBdXT10O2Vsc2UgaWYoYXJndW1lbnRzWzBdKXt2YXIgbj1hcmd1bWVudHNbMF07Zm9yKHZhciByIGluIG4paVtyXT1uW3JdfX19LHVlPXNldFRpbWVvdXQ7YS5wcm90b3R5cGVbImNhdGNoIl09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhlbihudWxsLGUpfSxhLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHRoaXMuY29uc3RydWN0b3Iocik7cmV0dXJuIG8odGhpcyxuZXcgZChlLHQsbikpLG59LGEucHJvdG90eXBlWyJmaW5hbGx5Il09bixhLmFsbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGEoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiBvKHQsZSl7dHJ5e2lmKGUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSl7dmFyIG49ZS50aGVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiB2b2lkIG4uY2FsbChlLGZ1bmN0aW9uKGUpe28odCxlKX0sYSl9c1t0XT1lLDA9PS0tYyYmaShzKX1jYXRjaChyKXthKHIpfX1pZighdSh0KSlyZXR1cm4gYShuZXcgVHlwZUVycm9yKCJQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5IikpO3ZhciBzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpO2lmKDA9PT1zLmxlbmd0aClyZXR1cm4gaShbXSk7Zm9yKHZhciBjPXMubGVuZ3RoLGU9MDtlPHMubGVuZ3RoO2UrKylvKGUsc1tlXSl9KX0sYS5yZXNvbHZlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1hP3Q6bmV3IGEoZnVuY3Rpb24oZSl7ZSh0KX0pfSxhLnJlamVjdD1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGEoZnVuY3Rpb24oZSx0KXt0KG4pfSl9LGEucmFjZT1mdW5jdGlvbihpKXtyZXR1cm4gbmV3IGEoZnVuY3Rpb24oZSx0KXtpZighdShpKSlyZXR1cm4gdChuZXcgVHlwZUVycm9yKCJQcm9taXNlLnJhY2UgYWNjZXB0cyBhbiBhcnJheSIpKTtmb3IodmFyIG49MCxyPWkubGVuZ3RoO248cjtuKyspYS5yZXNvbHZlKGlbbl0pLnRoZW4oZSx0KX0pfSxhLl9pbW1lZGlhdGVGbj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihlKXtzZXRJbW1lZGlhdGUoZSl9fHxmdW5jdGlvbihlKXt1ZShlLDApfSxhLl91bmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbiBEdChlKXsidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybigiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOiIsZSl9O3ZhciBsZT1lKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6YX0pKSxkZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LlByb21pc2V8fHZvaWQgMCE9PWomJmouUHJvbWlzZXx8bGVbImRlZmF1bHQiXXx8bGUsZmU9ZnVuY3Rpb24odSxuLHIpe3JldHVybiBmdW5jdGlvbihzLHQsYyxlKXtyZXR1cm4gZS50aGVuKGZ1bmN0aW9uKCl7dmFyIGEsbz1zLmRlbGF5TmV4dDtyZXR1cm4gbmV3IGRlKGZ1bmN0aW9uKGUsdCl7dmFyIG49dShzLGMsW2NdKTtpZighbylyZXR1cm4gZSgpO3ZhciByPXMudGltZW91dCxpPW5ldyBkZShmdW5jdGlvbihlLHQpe2E9c2V0VGltZW91dChmdW5jdGlvbigpe3QobmV3IEVycm9yKCJBIHRpbWVvdXQgb2NjdXJyZWQgYmVjYXVzZSB0aGUgYWN0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gIityLzFlMysiIHNlY29uZHMgdG8gY29tcGxldGUuICIpKX0scil9KTtkZS5yYWNlKFtuLGldKS50aGVuKGUsdCl9KVsiY2F0Y2giXShmdW5jdGlvbihlKXtyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGU9bihlKSxyKHMsdCxlKSxkZS5yZWplY3QoZSl9KS50aGVuKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGEpfSl9KX19LHBlPWZ1bmN0aW9uKGMsbixyLGksdSl7cmV0dXJuIGZ1bmN0aW9uKG8sdCxzLGUpe3JldHVybiBlLnRoZW4oZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gbmV3IGRlKGZ1bmN0aW9uKGUsdCl7dmFyIG49YyhvLHMsW3NdKSxyPW8udGltZW91dCxpPW5ldyBkZShmdW5jdGlvbihlLHQpe2E9c2V0VGltZW91dChmdW5jdGlvbigpe3QobmV3IEVycm9yKCJBIHRpbWVvdXQgb2NjdXJyZWQgYmVjYXVzZSB0aGUgY29uZGl0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gIityLzFlMysiIHNlY29uZHMgdG8gY29tcGxldGUuICIpKX0scil9KTtkZS5yYWNlKFtuLGldKS50aGVuKGUsdCl9KVsiY2F0Y2giXShmdW5jdGlvbihlKXtyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGU9bihlKSxpKG8sdCxlKSxkZS5yZWplY3QoZSl9KS50aGVuKGZ1bmN0aW9uKGUpe2lmKGNsZWFyVGltZW91dChhKSwhcihvLGUpKXJldHVybiB1KG8sdCksZGUucmVqZWN0KCl9KX0pfX0sZ2U9ZGUucmVzb2x2ZSgpLG1lPWZ1bmN0aW9uKHIsaSxlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5jb25kaXRpb25zJiZ0LmNvbmRpdGlvbnMuZm9yRWFjaChmdW5jdGlvbihlKXtnZT1yKGUsdCxuLGdlKX0pLHQuYWN0aW9ucyYmdC5hY3Rpb25zLmZvckVhY2goZnVuY3Rpb24oZSl7Z2U9aShlLHQsbixnZSl9KSxnZT0oZ2U9Z2UudGhlbihmdW5jdGlvbigpe2UodCl9KSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX19LGhlPWZ1bmN0aW9uKGUpe3JldHVybiBCb29sZWFuKGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbil9LHZlPWZ1bmN0aW9uKG8scyxjLHUpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuO2lmKGUuY29uZGl0aW9ucylmb3IodmFyIHI9MDtyPGUuY29uZGl0aW9ucy5sZW5ndGg7cisrKXtuPWUuY29uZGl0aW9uc1tyXTt0cnl7dmFyIGk9byhuLHQsW3RdKTtpZihoZShpKSl0aHJvdyBuZXcgRXJyb3IoIlJ1bGUgY29tcG9uZW50IHNlcXVlbmNpbmcgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBjb25kaXRpb24gdG8gZnVuY3Rpb24gcHJvcGVybHkuIik7aWYoIXMobixpKSlyZXR1cm4gYyhuLGUpLCExfWNhdGNoKGEpe3JldHVybiB1KG4sZSxhKSwhMX19cmV0dXJuITB9fSxiZT1mdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbihlLHQpe24oZSx0KSYmcihlLHQpfX0seWU9ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PW4uZ2V0TW9kdWxlRGVmaW5pdGlvbihlLm1vZHVsZVBhdGgpO3JldHVybiB0JiZ0LmRpc3BsYXlOYW1lfHxlLm1vZHVsZVBhdGh9fSxfZT1mdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ydWxlLG49ZS5ldmVudCxyPWkuZ2V0TW9kdWxlRGVmaW5pdGlvbihuLm1vZHVsZVBhdGgpLm5hbWU7cmV0dXJueyR0eXBlOmkuZ2V0TW9kdWxlRXh0ZW5zaW9uTmFtZShuLm1vZHVsZVBhdGgpKyIuIityLCRydWxlOntpZDp0LmlkLG5hbWU6dC5uYW1lfX19fSxDZT1mdW5jdGlvbihzLGMsdSxsLGQsZil7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9ZS5ydWxlLHQ9ZS5ldmVudDt0LnNldHRpbmdzPXQuc2V0dGluZ3N8fHt9O3RyeXt2YXIgaT1kKGUpO2ModCxudWxsLFtmdW5jdGlvbiBhKGUpe3ZhciB0PXUoaSxlKTtuKGZ1bmN0aW9uKCl7cyh0LHIpfSl9XSl9Y2F0Y2gobyl7Zi5lcnJvcihsKHQscixvKSl9fX0seGU9ZnVuY3Rpb24oaSxhLG8scyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1hKGUpO28uZXJyb3IoaShyLHQubmFtZSxuKSkscygicnVsZUFjdGlvbkZhaWxlZCIse3J1bGU6dCxhY3Rpb246ZX0pfX0sa2U9ZnVuY3Rpb24oaSxhLG8scyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1hKGUpO28uZXJyb3IoaShyLHQubmFtZSxuKSkscygicnVsZUNvbmRpdGlvbkZhaWxlZCIse3J1bGU6dCxjb25kaXRpb246ZX0pfX0sRWU9ZnVuY3Rpb24ocixpLGEpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXIoZSk7aS5sb2coJ0NvbmRpdGlvbiAiJytuKyciIGZvciBydWxlICInK3QubmFtZSsnIiB3YXMgbm90IG1ldC4nKSxhKCJydWxlQ29uZGl0aW9uRmFpbGVkIix7cnVsZTp0LGNvbmRpdGlvbjplfSl9fSxJZT1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt0LmxvZygnUnVsZSAiJytlLm5hbWUrJyIgZmlyZWQuJyksbigicnVsZUNvbXBsZXRlZCIse3J1bGU6ZX0pfX0sd2U9ZnVuY3Rpb24oYSxvLHMpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuO2lmKGUuYWN0aW9ucylmb3IodmFyIHI9MDtyPGUuYWN0aW9ucy5sZW5ndGg7cisrKXtuPWUuYWN0aW9uc1tyXTt0cnl7YShuLHQsW3RdKX1jYXRjaChpKXtyZXR1cm4gdm9pZCBvKG4sZSxpKX19cyhlKX19LERlPWZ1bmN0aW9uKG4scixpLGEpe3JldHVybiBmdW5jdGlvbihlLHQpe2EoInJ1bGVUcmlnZ2VyZWQiLHtydWxlOnR9KSxuP2kodCxlKTpyKHQsZSl9fSxBZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuJ0ZhaWxlZCB0byBleGVjdXRlICInK2UrJyIgZm9yICInK3QrJyIgcnVsZS4gJytuLm1lc3NhZ2UrKG4uc3RhY2s/IlxuIituLnN0YWNrOiIiKX0sU2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCYmIWUubmVnYXRlfHwhdCYmZS5uZWdhdGV9LFRlPVtdLFBlPSExLE9lPWZ1bmN0aW9uKGUpe1BlP2UoKTpUZS5wdXNoKGUpfSxqZT1mdW5jdGlvbihlLHQsbil7ZSh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24oT2UsZSl9KSxQZT0hMCxUZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UoKX0pLFRlPVtdfSxMZT1mdW5jdGlvbihlKXtpZihlfHwoZT1uZXcgRXJyb3IoIlRoZSBleHRlbnNpb24gdHJpZ2dlcmVkIGFuIGVycm9yLCBidXQgbm8gZXJyb3IgaW5mb3JtYXRpb24gd2FzIHByb3ZpZGVkLiIpKSwhKGUgaW5zdGFuY2VvZiBFcnJvcikpe3ZhciB0PSJvYmplY3QiPT10eXBlb2YgZT9KU09OLnN0cmluZ2lmeShlKTpTdHJpbmcoZSk7ZT1uZXcgRXJyb3IodCl9cmV0dXJuIGV9LE1lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVmU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxSZT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEZlPWcoKT9PYmplY3QuYXNzaWduOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9cChlKSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7Zm9yKHZhciBhIGluIHQ9T2JqZWN0KGFyZ3VtZW50c1tpXSkpVmUuY2FsbCh0LGEpJiYoclthXT10W2FdKTtpZihNZSl7bj1NZSh0KTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKylSZS5jYWxsKHQsbltvXSkmJihyW25bb11dPXRbbltvXV0pfX1yZXR1cm4gcn0sTmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRmUodD10fHx7fSxlKSx0Lmhhc093blByb3BlcnR5KCJ0eXBlIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJ0eXBlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE8uZGVwcmVjYXRpb24oIkFjY2Vzc2luZyBldmVudC50eXBlIGluIEFkb2JlIExhdW5jaCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gUGxlYXNlIHVzZSBldmVudC4kdHlwZSBpbnN0ZWFkLiIpLHQuJHR5cGV9fSksdH0sQmU9ZnVuY3Rpb24oYyx1KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1jW2VdO2lmKG4pe3ZhciByPW4ubW9kdWxlcztpZihyKWZvcih2YXIgaT1PYmplY3Qua2V5cyhyKSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBvPWlbYV0scz1yW29dO2lmKHMuc2hhcmVkJiZzLm5hbWU9PT10KXJldHVybiB1LmdldE1vZHVsZUV4cG9ydHMobyl9fX19LFVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQ/ZSh0KTp7fX19LHFlPWZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHIpe3ZhciB0PWUuc3BsaXQoIi4iKTt0LnNwbGljZSh0Lmxlbmd0aC0xfHwxLDAsIm1pbiIpLGU9dC5qb2luKCIuIil9cmV0dXJuIG4rZX19LHplPSIuanMiLEhlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnN1YnN0cigwLGUubGFzdEluZGV4T2YoIi8iKSl9LFdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuLTEhPT1lLmluZGV4T2YodCxlLmxlbmd0aC10Lmxlbmd0aCl9LEdlPWZ1bmN0aW9uKGUsdCl7V2UodCx6ZSl8fCh0Kz16ZSk7dmFyIG49dC5zcGxpdCgiLyIpLHI9SGUoZSkuc3BsaXQoIi8iKTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJiIuIiE9PWUmJigiLi4iPT09ZT9yLmxlbmd0aCYmci5wb3AoKTpyLnB1c2goZSkpfSksci5qb2luKCIvIil9LFllPWRvY3VtZW50LFhlPWZ1bmN0aW9uKG4scil7cmV0dXJuIG5ldyBkZShmdW5jdGlvbihlLHQpe3Iub25sb2FkPWZ1bmN0aW9uKCl7ZShyKX0sci5vbmVycm9yPWZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkIHNjcmlwdCAiK24pKX19KX0sS2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dC5zcmM9ZSx0LmFzeW5jPSEwO3ZhciBuPVhlKGUsdCk7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQodCksbn0sUWU9ZnVuY3Rpb24oZSx0LG4scil7dD10fHwiJiIsbj1ufHwiPSI7dmFyIGk9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIGk7dmFyIGE9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBvPTFlMztyJiYibnVtYmVyIj09dHlwZW9mIHIubWF4S2V5cyYmKG89ci5tYXhLZXlzKTt2YXIgcz1lLmxlbmd0aDswPG8mJm88cyYmKHM9byk7Zm9yKHZhciBjPTA7YzxzOysrYyl7dmFyIHUsbCxkLGYscD1lW2NdLnJlcGxhY2UoYSwiJTIwIiksZz1wLmluZGV4T2Yobik7MDw9Zz8odT1wLnN1YnN0cigwLGcpLGw9cC5zdWJzdHIoZysxKSk6KHU9cCxsPSIiKSxkPWRlY29kZVVSSUNvbXBvbmVudCh1KSxmPWRlY29kZVVSSUNvbXBvbmVudChsKSxtKGksZCk/QXJyYXkuaXNBcnJheShpW2RdKT9pW2RdLnB1c2goZik6aVtkXT1baVtkXSxmXTppW2RdPWZ9cmV0dXJuIGl9LCRlPWZ1bmN0aW9uKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBlO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/InRydWUiOiJmYWxzZSI7Y2FzZSJudW1iZXIiOnJldHVybiBpc0Zpbml0ZShlKT9lOiIiO2RlZmF1bHQ6cmV0dXJuIiJ9fSxKZT1mdW5jdGlvbihuLHIsaSxlKXtyZXR1cm4gcj1yfHwiJiIsaT1pfHwiPSIsbnVsbD09PW4mJihuPXVuZGVmaW5lZCksIm9iamVjdCI9PXR5cGVvZiBuP09iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lbmNvZGVVUklDb21wb25lbnQoJGUoZSkpK2k7cmV0dXJuIEFycmF5LmlzQXJyYXkobltlXSk/bltlXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQrZW5jb2RlVVJJQ29tcG9uZW50KCRlKGUpKX0pLmpvaW4ocik6dCtlbmNvZGVVUklDb21wb25lbnQoJGUobltlXSkpfSkuam9pbihyKTplP2VuY29kZVVSSUNvbXBvbmVudCgkZShlKSkraStlbmNvZGVVUklDb21wb25lbnQoJGUobikpOiIifSxaZT10KGZ1bmN0aW9uKGUsdCl7dC5kZWNvZGU9dC5wYXJzZT1RZSx0LmVuY29kZT10LnN0cmluZ2lmeT1KZX0pLGV0PSJAYWRvYmUvcmVhY3Rvci0iLHR0PXtjb29raWU6TSxkb2N1bWVudDpZZSwibG9hZC1zY3JpcHQiOktlLCJvYmplY3QtYXNzaWduIjpGZSxwcm9taXNlOmRlLCJxdWVyeS1zdHJpbmciOntwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPWUudHJpbSgpLnJlcGxhY2UoL15bPyMmXS8sIiIpKSxaZS5wYXJzZShlKX0sc3RyaW5naWZ5OmZ1bmN0aW9uKGUpe3JldHVybiBaZS5zdHJpbmdpZnkoZSl9fSx3aW5kb3c6Vn0sbnQ9ZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKDA9PT1lLmluZGV4T2YoZXQpKXt2YXIgdD1lLnN1YnN0cihldC5sZW5ndGgpLG49dHRbdF07aWYobilyZXR1cm4gbn1pZigwPT09ZS5pbmRleE9mKCIuLyIpfHwwPT09ZS5pbmRleE9mKCIuLi8iKSlyZXR1cm4gcihlKTt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNvbHZlIG1vZHVsZSAiJytlKyciLicpfX0scnQ9ZnVuY3Rpb24oZSxvLHMsYyx1KXt2YXIgbD1lLmV4dGVuc2lvbnMsZD1lLmJ1aWxkSW5mbyxmPWUucHJvcGVydHkuc2V0dGluZ3M7aWYobCl7dmFyIHA9QmUobCxvKTtPYmplY3Qua2V5cyhsKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPWxbcl0sZT1VZShjLGkuc2V0dGluZ3MpO2lmKGkubW9kdWxlcyl7dmFyIHQ9Ty5jcmVhdGVQcmVmaXhlZExvZ2dlcihpLmRpc3BsYXlOYW1lKSxuPXFlKGkuaG9zdGVkTGliRmlsZXNCYXNlVXJsLGQubWluaWZpZWQpLGE9e2J1aWxkSW5mbzpkLGdldERhdGFFbGVtZW50VmFsdWU6dSxnZXRFeHRlbnNpb25TZXR0aW5nczplLGdldEhvc3RlZExpYkZpbGVVcmw6bixnZXRTaGFyZWRNb2R1bGU6cCxsb2dnZXI6dCxwcm9wZXJ0eVNldHRpbmdzOmYscmVwbGFjZVRva2VuczpjLG9uRGVidWdDaGFuZ2VkOnMub25EZWJ1Z0NoYW5nZWQsZ2V0IGRlYnVnRW5hYmxlZCgpe3JldHVybiBzLmdldERlYnVnRW5hYmxlZCgpfX07T2JqZWN0LmtleXMoaS5tb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBlPWkubW9kdWxlc1tuXSx0PW50KGZ1bmN0aW9uKGUpe3ZhciB0PUdlKG4sZSk7cmV0dXJuIG8uZ2V0TW9kdWxlRXhwb3J0cyh0KX0pO28ucmVnaXN0ZXJNb2R1bGUobixlLHIsdCxhKX0pfX0pLG8uaHlkcmF0ZUNhY2hlKCl9cmV0dXJuIG99LGl0PWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIGE9Ty5jcmVhdGVQcmVmaXhlZExvZ2dlcigiQ3VzdG9tIFNjcmlwdCIpO2UudHJhY2s9ZnVuY3Rpb24oZSl7Ty5sb2coJyInK2UrJyIgZG9lcyBub3QgbWF0Y2ggYW55IGRpcmVjdCBjYWxsIGlkZW50aWZpZXJzLicpfSxlLmdldFZpc2l0b3JJZD1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlLnByb3BlcnR5PXtuYW1lOnQucHJvcGVydHkubmFtZX0sZS5jb21wYW55PXQuY29tcGFueSxlLmJ1aWxkSW5mbz10LmJ1aWxkSW5mbyxlLmxvZ2dlcj1hLGUubm90aWZ5PWZ1bmN0aW9uKGUsdCl7c3dpdGNoKE8uZGVwcmVjYXRpb24oIl9zYXRlbGxpdGUubm90aWZ5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIGBfc2F0ZWxsaXRlLmxvZ2dlcmAgQVBJLiIpLHQpe2Nhc2UgMzphLmluZm8oZSk7YnJlYWs7Y2FzZSA0OmEud2FybihlKTticmVhaztjYXNlIDU6YS5lcnJvcihlKTticmVhaztkZWZhdWx0OmEubG9nKGUpfX0sZS5nZXRWYXI9cixlLnNldFZhcj1pLGUuc2V0Q29va2llPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iIixpPXt9O24mJihyPSIsIHsgZXhwaXJlczogIituKyIgfSIsaS5leHBpcmVzPW4pO3ZhciBhPSdfc2F0ZWxsaXRlLnNldENvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLnNldCgiJytlKyciLCAiJyt0KyciJytyKyIpLiI7Ty5kZXByZWNhdGlvbihhKSxNLnNldChlLHQsaSl9LGUucmVhZENvb2tpZT1mdW5jdGlvbihlKXtyZXR1cm4gTy5kZXByZWNhdGlvbignX3NhdGVsbGl0ZS5yZWFkQ29va2llIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCInK2UrJyIpLicpLE0uZ2V0KGUpfSxlLnJlbW92ZUNvb2tpZT1mdW5jdGlvbihlKXtPLmRlcHJlY2F0aW9uKCdfc2F0ZWxsaXRlLnJlbW92ZUNvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLnJlbW92ZSgiJytlKyciKS4nKSxNLnJlbW92ZShlKX0sZS5jb29raWU9TSxlLnBhZ2VCb3R0b209ZnVuY3Rpb24oKXt9LGUuc2V0RGVidWc9bjt2YXIgbz0hMTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX2NvbnRhaW5lciIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfHwoTy53YXJuKCJfc2F0ZWxsaXRlLl9jb250YWluZXIgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLiIpLG89ITApLHR9fSl9LGF0PXdpbmRvdy5fc2F0ZWxsaXRlO2lmKGF0JiYhd2luZG93Ll9fc2F0ZWxsaXRlTG9hZGVkKXt3aW5kb3cuX19zYXRlbGxpdGVMb2FkZWQ9ITA7dmFyIG90PWF0LmNvbnRhaW5lcjtkZWxldGUgYXQuY29udGFpbmVyO3ZhciBzdD1vdC5wcm9wZXJ0eS5zZXR0aW5ncy51bmRlZmluZWRWYXJzUmV0dXJuRW1wdHksY3Q9b3QucHJvcGVydHkuc2V0dGluZ3MucnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkLHV0PW90LmRhdGFFbGVtZW50c3x8e307US5taWdyYXRlQ29va2llRGF0YSh1dCk7dmFyIGx0LGR0PWZ1bmN0aW9uKGUpe3JldHVybiB1dFtlXX0sZnQ9aWUoKSxwdD1KKGZ0LGR0LGZ1bmN0aW9uKCl7cmV0dXJuIGx0LmFwcGx5KG51bGwsYXJndW1lbnRzKX0sc3QpLGd0PXt9LG10PWNlKGd0KSxodD1uZShndCxkdCksdnQ9dGUoZ3QsZHQscHQpO2x0PXNlKGh0LHZ0LHN0KTt2YXIgYnQ9YihGKCJsb2NhbFN0b3JhZ2UiKSxPKTtpdChhdCxvdCxidC5zZXREZWJ1Z0VuYWJsZWQsdnQsbXQpLHJ0KG90LGZ0LGJ0LGx0LHB0KTt2YXIgeXQ9b2UoYXQpLF90PV8oZnQsbHQpLEN0PXllKGZ0KSx4dD1FZShDdCxPLHl0KSxrdD1rZShBZSxDdCxPLHl0KSxFdD14ZShBZSxDdCxPLHl0KSxJdD1JZShPLHl0KSx3dD1DZShEZShjdCxiZSh2ZShfdCxTZSx4dCxrdCksd2UoX3QsRXQsSXQpKSxtZShwZShfdCxMZSxTZSxrdCx4dCksZmUoX3QsTGUsRXQpLEl0KSx5dCksX3QsTmUsQWUsX2UoZnQpLE8pO2plKGgsb3QucnVsZXN8fFtdLHd0KX1yZXR1cm4gYXR9Y29uc29sZS53YXJuKCJBZG9iZSBMYXVuY2ggaXMgdW5zdXBwb3J0ZWQgaW4gSUUgOSBhbmQgYmVsb3cuIil9KCk7X3NhdGVsbGl0ZT0kX19fdmFyXzExYzRiNzBhZDdjZThjZmJ9KSgpfQo="},{"name":"sugarcoat-launch-ENbb9d0de7cc374dc99259df2c4b823cef.min-2eb9609b74432d652877d41a51a8d2ba.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"dmFyIF9zYXRlbGxpdGU7e2NvbnN0ICRfX19tb2NrXzI4OTk0MTMyMzU4ZmI1NDk9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7bGV0IGlzU2VhbGVkPWZhbHNlO2NsYXNzIFN0b3JhZ2V7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfX1nZXQgbGVuZ3RoKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aH1rZXkoaW5kZXgpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7aWYoaW5kZXg8MHx8aW5kZXg+PWtleXMubGVuZ3RoKXtyZXR1cm4gbnVsbH1yZXR1cm4ga2V5c1tpbmRleF19Z2V0SXRlbShrZXkpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcyxrZXkpP3RoaXNba2V5XTpudWxsfXNldEl0ZW0oa2V5LHZhbHVlKXt0aGlzW2tleV09U3RyaW5nKHZhbHVlKX1yZW1vdmVJdGVtKGtleSl7ZGVsZXRlIHRoaXNba2V5XX1jbGVhcigpe2NvbnN0IGtleXM9T2JqZWN0LmtleXModGhpcyk7Zm9yKGNvbnN0IGtleSBvZiBrZXlzKXtkZWxldGUgdGhpc1trZXldfX19ZXhwb3J0cy5TdG9yYWdlPXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6U3RvcmFnZSx3cml0YWJsZTp0cnVlfTtjb25zdCBsb2NhbFN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5sb2NhbFN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSxnZXQoKXtyZXR1cm4gbG9jYWxTdG9yYWdlfX07Y29uc3Qgc2Vzc2lvblN0b3JhZ2U9bmV3IFN0b3JhZ2U7ZXhwb3J0cy5zZXNzaW9uU3RvcmFnZT17Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLGdldCgpe3JldHVybiBzZXNzaW9uU3RvcmFnZX19O2lzU2VhbGVkPXRydWV9KSgkX19fbW9ja18yODk5NDEzMjM1OGZiNTQ5KTsoZnVuY3Rpb24oKXt3aW5kb3cuX3NhdGVsbGl0ZT13aW5kb3cuX3NhdGVsbGl0ZXx8e30sd2luZG93Ll9zYXRlbGxpdGUuY29udGFpbmVyPXtidWlsZEluZm86e21pbmlmaWVkOiEwLGJ1aWxkRGF0ZToiMjAyMS0wNy0wNVQwNToyMzo0NFoiLGVudmlyb25tZW50OiJwcm9kdWN0aW9uIix0dXJiaW5lQnVpbGREYXRlOiIyMDIxLTA0LTI2VDE2OjU0OjI4WiIsdHVyYmluZVZlcnNpb246IjI3LjEuMyJ9LGRhdGFFbGVtZW50czp7TVNDQ19Db25zZW50OntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuISgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdy5tc2NjJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Lm1zY2MuaGFzQ29uc2VudCYmIXdpbmRvdy5tc2NjLmhhc0NvbnNlbnQoKSl9fX0sIldpbmRvd3MgLSBBbGwgUGFnZXMiOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuISFsb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC93aW5kb3dzXC8/L2dpKX19fSwiSlNMTCBSZWRUaWdlciI6e2RlZmF1bHRWYWx1ZToiIixtb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gMDwkKCIjcHJpbWFyeUFyZWFbZGF0YS1tXSIpLmxlbmd0aH19fSxTaXRlQ29uc2VudF9BZHZlcnRpc2luZzp7ZGVmYXVsdFZhbHVlOiIiLG1vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93Lm1zY2MmJiJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93LnNpdGVDb25zZW50fHwoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cubXNjYyYmInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuc2l0ZUNvbnNlbnQ/ISgiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93Lm1zY2MuaGFzQ29uc2VudHx8IXdpbmRvdy5tc2NjLmhhc0NvbnNlbnQoKSk6bnVsbD09PXdpbmRvdy5zaXRlQ29uc2VudHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvdy5zaXRlQ29uc2VudC5nZXRDb25zZW50Rm9yfHwib2JqZWN0IiE9dHlwZW9mIFdjcENvbnNlbnQuY29uc2VudENhdGVnb3JpZXN8fHNpdGVDb25zZW50LmdldENvbnNlbnRGb3IoV2NwQ29uc2VudC5jb25zZW50Q2F0ZWdvcmllcy5BZHZlcnRpc2luZykpfX19LFNpdGVDb25zZW50X1NvY2lhbE1lZGlhOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cubXNjYyYmInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuc2l0ZUNvbnNlbnR8fCgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdy5tc2NjJiYidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdy5zaXRlQ29uc2VudD8hKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cubXNjYy5oYXNDb25zZW50fHwhd2luZG93Lm1zY2MuaGFzQ29uc2VudCgpKTpudWxsPT09d2luZG93LnNpdGVDb25zZW50fHwiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LnNpdGVDb25zZW50LmdldENvbnNlbnRGb3J8fCJvYmplY3QiIT10eXBlb2YgV2NwQ29uc2VudC5jb25zZW50Q2F0ZWdvcmllc3x8c2l0ZUNvbnNlbnQuZ2V0Q29uc2VudEZvcihXY3BDb25zZW50LmNvbnNlbnRDYXRlZ29yaWVzLlNvY2lhbE1lZGlhKSl9fX0sU2l0ZUNvbnNlbnRfQW5hbHl0aWNzOntkZWZhdWx0VmFsdWU6IiIsbW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cubXNjYyYmInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuc2l0ZUNvbnNlbnR8fCgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdy5tc2NjJiYidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdy5zaXRlQ29uc2VudD8hKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cubXNjYy5oYXNDb25zZW50fHwhd2luZG93Lm1zY2MuaGFzQ29uc2VudCgpKTpudWxsPT09d2luZG93LnNpdGVDb25zZW50fHwiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LnNpdGVDb25zZW50LmdldENvbnNlbnRGb3J8fCJvYmplY3QiIT10eXBlb2YgV2NwQ29uc2VudC5jb25zZW50Q2F0ZWdvcmllc3x8c2l0ZUNvbnNlbnQuZ2V0Q29uc2VudEZvcihXY3BDb25zZW50LmNvbnNlbnRDYXRlZ29yaWVzLkFuYWx5dGljcykpfX19LCIxZHNfUGlsb3RfVVJMcyI6e21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTpmdW5jdGlvbigpe3JldHVybiEoIXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5tYXRjaCgvbWljcm9zb2Z0XC5jb20vaSl8fCEod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cL2ZyLWZyXC93aW5kb3dzXC92aWV3LWFsbC1kZXZpY2VzXC8/JC9naSl8fHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC9lbi11c1wvd2luZG93c1wvdmlldy1hbGwtZGV2aWNlc1wvPyQvZ2kpfHx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1wvZnItZnJcL3dpbmRvd3NcLz8kL2dpKXx8d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cL2VuLXVzXC93aW5kb3dzXC9oZWxwLW1lLWNob29zZVwvPyQvaSl8fHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC9lbi11c1wvd2luZG93c1wvd2h5LXdpbmRvd3MtMTAtY29tcHV0ZXJzLWFyZS1yaWdodC1mb3IteW91XC8/JC9pKXx8d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cL2VuLXVzXC93aW5kb3dzXC9jb21wcmVoZW5zaXZlLXNlY3VyaXR5XC8/JC9pKSkpfX19fSxleHRlbnNpb25zOntjb3JlOntkaXNwbGF5TmFtZToiQ29yZSIsbW9kdWxlczp7ImNvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyI6e25hbWU6ImN1c3RvbS1jb2RlIixkaXNwbGF5TmFtZToiQ3VzdG9tIENvZGUiLHNjcmlwdDpmdW5jdGlvbihuKXsidXNlIHN0cmljdCI7bi5leHBvcnRzPWZ1bmN0aW9uKG4pe3JldHVybiBuLnNvdXJjZSgpfX19LCJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy92YWx1ZUNvbXBhcmlzb24uanMiOntuYW1lOiJ2YWx1ZS1jb21wYXJpc29uIixkaXNwbGF5TmFtZToiVmFsdWUgQ29tcGFyaXNvbiIsc2NyaXB0OmZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1mdW5jdGlvbihuKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIG4mJmlzRmluaXRlKG4pfSxhPWZ1bmN0aW9uKG4pe3JldHVybiJzdHJpbmciPT10eXBlb2Ygbnx8biBpbnN0YW5jZW9mIFN0cmluZ30scj1mdW5jdGlvbihuLGUpe3JldHVybiBlJiZhKG4pP24udG9Mb3dlckNhc2UoKTpufSxvPWZ1bmN0aW9uKG4pe3JldHVybiBpKG4pP1N0cmluZyhuKTpufSxzPWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pP051bWJlcihuKTpufSxlPWZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbihuLGUsdCl7cmV0dXJuIG49byhyKG4sdCkpLGU9byhyKGUsdCkpLGEobikmJmEoZSkmJmkobixlKX19LHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIG49cyhuKSxlPXMoZSksaShuKSYmaShlKSYmdChuLGUpfX0sYz17ZXF1YWxzOmZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gcihuLHQpPT1yKGUsdCl9LGRvZXNOb3RFcXVhbDpmdW5jdGlvbigpe3JldHVybiFjLmVxdWFscy5hcHBseShudWxsLGFyZ3VtZW50cyl9LGNvbnRhaW5zOmUoZnVuY3Rpb24obixlKXtyZXR1cm4tMSE9PW4uaW5kZXhPZihlKX0pLGRvZXNOb3RDb250YWluOmZ1bmN0aW9uKCl7cmV0dXJuIWMuY29udGFpbnMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxzdGFydHNXaXRoOmUoZnVuY3Rpb24obixlKXtyZXR1cm4gMD09PW4uaW5kZXhPZihlKX0pLGRvZXNOb3RTdGFydFdpdGg6ZnVuY3Rpb24oKXtyZXR1cm4hYy5zdGFydHNXaXRoLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZW5kc1dpdGg6ZShmdW5jdGlvbihuLGUpe3JldHVybiBuLnN1YnN0cmluZyhuLmxlbmd0aC1lLmxlbmd0aCxuLmxlbmd0aCk9PT1lfSksZG9lc05vdEVuZFdpdGg6ZnVuY3Rpb24oKXtyZXR1cm4hYy5lbmRzV2l0aC5hcHBseShudWxsLGFyZ3VtZW50cyl9LG1hdGNoZXNSZWdleDplKGZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbmV3IFJlZ0V4cChlLHQ/ImkiOiIiKS50ZXN0KG4pfSksZG9lc05vdE1hdGNoUmVnZXg6ZnVuY3Rpb24oKXtyZXR1cm4hYy5tYXRjaGVzUmVnZXguYXBwbHkobnVsbCxhcmd1bWVudHMpfSxsZXNzVGhhbjp0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIG48ZX0pLGxlc3NUaGFuT3JFcXVhbDp0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIG48PWV9KSxncmVhdGVyVGhhbjp0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGU8bn0pLGdyZWF0ZXJUaGFuT3JFcXVhbDp0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGU8PW59KSxpc1RydWU6ZnVuY3Rpb24obil7cmV0dXJuITA9PT1ufSxpc1RydXRoeTpmdW5jdGlvbihuKXtyZXR1cm4gQm9vbGVhbihuKX0saXNGYWxzZTpmdW5jdGlvbihuKXtyZXR1cm4hMT09PW59LGlzRmFsc3k6ZnVuY3Rpb24obil7cmV0dXJuIW59fTtuLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIGNbbi5jb21wYXJpc29uLm9wZXJhdG9yXShuLmxlZnRPcGVyYW5kLG4ucmlnaHRPcGVyYW5kLEJvb2xlYW4obi5jb21wYXJpc29uLmNhc2VJbnNlbnNpdGl2ZSkpfX19LCJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIjp7bmFtZToiZG9tLXJlYWR5IixkaXNwbGF5TmFtZToiRE9NIFJlYWR5IixzY3JpcHQ6ZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT10KCIuL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cyIpO24uZXhwb3J0cz1mdW5jdGlvbihuLGUpe2kucmVnaXN0ZXJEb21SZWFkeVRyaWdnZXIoZSl9fX0sImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiOntuYW1lOiJjdXN0b20tY29kZSIsZGlzcGxheU5hbWU6IkN1c3RvbSBDb2RlIixzY3JpcHQ6ZnVuY3Rpb24obixlLHQsaSl7InVzZSBzdHJpY3QiO3ZhciBhLHIsbyxzPXQoIkBhZG9iZS9yZWFjdG9yLWRvY3VtZW50IiksYz10KCIuL2hlbHBlcnMvZGVjb3JhdGVDb2RlIiksdT10KCIuL2hlbHBlcnMvbG9hZENvZGVTZXF1ZW50aWFsbHkiKSxsPXQoIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZSIpLGQ9KGE9ZnVuY3Rpb24obil7bChzLmJvZHksbix7ZXJyb3I6ZnVuY3Rpb24obil7aS5sb2dnZXIuZXJyb3Iobi5tc2cpfX0pfSxyPVtdLG89ZnVuY3Rpb24oKXtpZihzLmJvZHkpZm9yKDtyLmxlbmd0aDspYShyLnNoaWZ0KCkpO2Vsc2Ugc2V0VGltZW91dChvLDIwKX0sZnVuY3Rpb24obil7ci5wdXNoKG4pLG8oKX0pLHA9ZnVuY3Rpb24oKXtpZihzLmN1cnJlbnRTY3JpcHQpcmV0dXJuIHMuY3VycmVudFNjcmlwdC5hc3luYztmb3IodmFyIG49cy5xdWVyeVNlbGVjdG9yQWxsKCJzY3JpcHQiKSxlPTA7ZTxuLmxlbmd0aDtlKyspe3ZhciB0PW5bZV07aWYoLyhsYXVuY2h8c2F0ZWxsaXRlTGliKS1bXlwvXSsuanMoXD8uKik/JC8udGVzdCh0LnNyYykpcmV0dXJuIHQuYXN5bmN9cmV0dXJuITB9KCk7bi5leHBvcnRzPWZ1bmN0aW9uKG4sZSl7dmFyIHQ9e3NldHRpbmdzOm4sZXZlbnQ6ZX0saT10LnNldHRpbmdzLnNvdXJjZTtpZihpKXJldHVybiB0LnNldHRpbmdzLmlzRXh0ZXJuYWw/dShpKS50aGVuKGZ1bmN0aW9uKG4pe24mJmQoYyh0LG4pKX0pOnZvaWQocHx8ImxvYWRpbmciIT09cy5yZWFkeVN0YXRlP2QoYyh0LGkpKTpzLndyaXRlP3Mud3JpdGUoYyh0LGkpKTpkKGModCxpKSkpfX19LCJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIjp7bmFtZToicGF0aCIsZGlzcGxheU5hbWU6IlBhdGggV2l0aG91dCBRdWVyeSBTdHJpbmciLHNjcmlwdDpmdW5jdGlvbihuLGUsdCl7InVzZSBzdHJpY3QiO3ZhciBpPXQoIkBhZG9iZS9yZWFjdG9yLWRvY3VtZW50IiksYT10KCIuLi9oZWxwZXJzL3RleHRNYXRjaCIpO24uZXhwb3J0cz1mdW5jdGlvbihuKXt2YXIgdD1pLmxvY2F0aW9uLnBhdGhuYW1lO3JldHVybiBuLnBhdGhzLnNvbWUoZnVuY3Rpb24obil7dmFyIGU9bi52YWx1ZUlzUmVnZXg/bmV3IFJlZ0V4cChuLnZhbHVlLCJpIik6bi52YWx1ZTtyZXR1cm4gYSh0LGUpfSl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyI6e25hbWU6ImxpYnJhcnktbG9hZGVkIixkaXNwbGF5TmFtZToiTGlicmFyeSBMb2FkZWQgKFBhZ2UgVG9wKSIsc2NyaXB0OmZ1bmN0aW9uKG4sZSx0KXsidXNlIHN0cmljdCI7dmFyIGk9dCgiLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMiKTtuLmV4cG9ydHM9ZnVuY3Rpb24obixlKXtpLnJlZ2lzdGVyTGlicmFyeUxvYWRlZFRyaWdnZXIoZSl9fX0sImNvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9wYWdlTGlmZWN5Y2xlRXZlbnRzLmpzIjp7c2NyaXB0OmZ1bmN0aW9uKG4sZSx0KXsidXNlIHN0cmljdCI7dmFyIGk9dCgiQGFkb2JlL3JlYWN0b3Itd2luZG93IiksYT10KCJAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCIpLHI9LTEhPT1pLm5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1TSUUgMTAiKSxvPSJXSU5ET1dfTE9BREVEIixzPSJET01fUkVBRFkiLGM9IlBBR0VfQk9UVE9NIix1PVtjLHMsb10sbD1mdW5jdGlvbihuLGUpe3JldHVybntlbGVtZW50Om4sdGFyZ2V0Om4sbmF0aXZlRXZlbnQ6ZX19LGQ9e307dS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Rbbl09W119KTt2YXIgcD1mdW5jdGlvbihuLGUpe3Uuc2xpY2UoMCxnKG4pKzEpLmZvckVhY2goZnVuY3Rpb24obil7bShlLG4pfSl9LGY9ZnVuY3Rpb24oKXtyZXR1cm4iY29tcGxldGUiPT09YS5yZWFkeVN0YXRlP286ImludGVyYWN0aXZlIj09PWEucmVhZHlTdGF0ZT9yP251bGw6czp2b2lkIDB9LGc9ZnVuY3Rpb24obil7cmV0dXJuIHUuaW5kZXhPZihuKX0sbT1mdW5jdGlvbihlLG4pe2Rbbl0uZm9yRWFjaChmdW5jdGlvbihuKXt2KGUsbil9KSxkW25dPVtdfSx2PWZ1bmN0aW9uKG4sZSl7dmFyIHQ9ZS50cmlnZ2VyLGk9ZS5zeW50aGV0aWNFdmVudEZuO3QoaT9pKG4pOm51bGwpfTtpLl9zYXRlbGxpdGU9aS5fc2F0ZWxsaXRlfHx7fSxpLl9zYXRlbGxpdGUucGFnZUJvdHRvbT1wLmJpbmQobnVsbCxjKSxhLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHAuYmluZChudWxsLHMpLCEwKSxpLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHAuYmluZChudWxsLG8pLCEwKSxpLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgbj1mKCk7biYmcChuKX0sMCksbi5leHBvcnRzPXtyZWdpc3RlckxpYnJhcnlMb2FkZWRUcmlnZ2VyOmZ1bmN0aW9uKG4pe24oKX0scmVnaXN0ZXJQYWdlQm90dG9tVHJpZ2dlcjpmdW5jdGlvbihuKXtkW2NdLnB1c2goe3RyaWdnZXI6bn0pfSxyZWdpc3RlckRvbVJlYWR5VHJpZ2dlcjpmdW5jdGlvbihuKXtkW3NdLnB1c2goe3RyaWdnZXI6bixzeW50aGV0aWNFdmVudEZuOmwuYmluZChudWxsLGEpfSl9LHJlZ2lzdGVyV2luZG93TG9hZGVkVHJpZ2dlcjpmdW5jdGlvbihuKXtkW29dLnB1c2goe3RyaWdnZXI6bixzeW50aGV0aWNFdmVudEZuOmwuYmluZChudWxsLGkpfSl9fX19LCJjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2RlY29yYXRlQ29kZS5qcyI6e3NjcmlwdDpmdW5jdGlvbihuLGUsdCxpKXsidXNlIHN0cmljdCI7dmFyIGE9MCxyPWZ1bmN0aW9uKG4pe3JldHVybiBuLnNldHRpbmdzLmlzRXh0ZXJuYWx9LG89ZnVuY3Rpb24obixlKXtyZXR1cm4iPHNjcmlwdD5cbiIrZSsiXG48XC9zY3JpcHQ+In0scz1mdW5jdGlvbihlLG4pe3ZhciB0PSJfX3J1blNjcmlwdCIrICsrYTtyZXR1cm4gX3NhdGVsbGl0ZVt0XT1mdW5jdGlvbihuKXtjb25zdCAkX19fb2xkX2E1NWI3MzEyMjExMDRkNDk9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiU3RvcmFnZSIpO3RyeXtpZigkX19fb2xkX2E1NWI3MzEyMjExMDRkNDkpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlN0b3JhZ2UiLCRfX19tb2NrXzI4OTk0MTMyMzU4ZmI1NDkuU3RvcmFnZSk7cmV0dXJuIGZ1bmN0aW9uKCl7bi5jYWxsKGUuZXZlbnQuZWxlbWVudCxlLmV2ZW50LGUuZXZlbnQudGFyZ2V0KSxkZWxldGUgX3NhdGVsbGl0ZVt0XX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF9hNTViNzMxMjIxMTA0ZDQ5KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJTdG9yYWdlIiwkX19fb2xkX2E1NWI3MzEyMjExMDRkNDkpfX0sJzxzY3JpcHQ+X3NhdGVsbGl0ZVsiJyt0KyciXShmdW5jdGlvbihldmVudCwgdGFyZ2V0KSB7XG4nK24rIlxufSk7PFwvc2NyaXB0PiJ9LGM9e2phdmFzY3JpcHQ6ZnVuY3Rpb24obixlKXtyZXR1cm4gbi5zZXR0aW5ncy5nbG9iYWw/byhuLGUpOnMobixlKX0saHRtbDpmdW5jdGlvbihuLGUpe3JldHVybiByKG4pP2kucmVwbGFjZVRva2VucyhlLG4uZXZlbnQpOmV9fTtuLmV4cG9ydHM9ZnVuY3Rpb24obixlKXtyZXR1cm4gY1tuLnNldHRpbmdzLmxhbmd1YWdlXShuLGUpfX19LCJjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2xvYWRDb2RlU2VxdWVudGlhbGx5LmpzIjp7c2NyaXB0OmZ1bmN0aW9uKG4sZSx0KXsidXNlIHN0cmljdCI7dmFyIGk9dCgiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLGE9dCgiLi9nZXRTb3VyY2VCeVVybCIpLHI9aS5yZXNvbHZlKCk7bi5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBpKGZ1bmN0aW9uKHQpe3ZhciBuPWEoZSk7aS5hbGwoW24scl0pLnRoZW4oZnVuY3Rpb24obil7dmFyIGU9blswXTt0KGUpfSl9KTtyZXR1cm4gcj1ufX19LCJjb3JlL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZS5qcyI6e3NjcmlwdDpmdW5jdGlvbih0LGkpeyFmdW5jdGlvbiBhKG4sZSl7Im9iamVjdCI9PXR5cGVvZiBpJiYib2JqZWN0Ij09dHlwZW9mIHQ/dC5leHBvcnRzPWUoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKToib2JqZWN0Ij09dHlwZW9mIGk/aS5wb3N0c2NyaWJlPWUoKTpuLnBvc3RzY3JpYmU9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkobil7aWYoYVtuXSlyZXR1cm4gYVtuXS5leHBvcnRzO3ZhciBlPWFbbl09e2V4cG9ydHM6e30saWQ6bixsb2FkZWQ6ITF9O3JldHVybiB0W25dLmNhbGwoZS5leHBvcnRzLGUsZS5leHBvcnRzLGkpLGUubG9hZGVkPSEwLGUuZXhwb3J0c312YXIgYT17fTtyZXR1cm4gaS5tPXQsaS5jPWEsaS5wPSIiLGkoMCl9KFtmdW5jdGlvbihuLGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkobil7cmV0dXJuIG4mJm4uX19lc01vZHVsZT9uOntkZWZhdWx0Om59fXZhciBhPWkodCgxKSk7bi5leHBvcnRzPWFbImRlZmF1bHQiXX0sZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKG4pe2lmKG4mJm4uX19lc01vZHVsZSlyZXR1cm4gbjt2YXIgZT17fTtpZihudWxsIT1uKWZvcih2YXIgdCBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHQpJiYoZVt0XT1uW3RdKTtyZXR1cm4gZVsiZGVmYXVsdCJdPW4sZX1mdW5jdGlvbiBhKG4pe3JldHVybiBuJiZuLl9fZXNNb2R1bGU/bjp7ZGVmYXVsdDpufX1mdW5jdGlvbiB1KCl7fWZ1bmN0aW9uIGwoKXt2YXIgbj1jLnNoaWZ0KCk7aWYobil7dmFyIGU9by5sYXN0KG4pO2UuYWZ0ZXJEZXF1ZXVlKCksbi5zdHJlYW09ci5hcHBseSh1bmRlZmluZWQsbiksZS5hZnRlclN0cmVhbVN0YXJ0KCl9fWZ1bmN0aW9uIHIobixlLGkpe2Z1bmN0aW9uIGEobil7bj1pLmJlZm9yZVdyaXRlKG4pLG0ud3JpdGUobiksaS5hZnRlcldyaXRlKG4pfShtPW5ldyBmWyJkZWZhdWx0Il0obixpKSkuaWQ9ZysrLG0ubmFtZT1pLm5hbWV8fG0uaWQsZC5zdHJlYW1zW20ubmFtZV09bTt2YXIgdD1uLm93bmVyRG9jdW1lbnQscj17Y2xvc2U6dC5jbG9zZSxvcGVuOnQub3Blbix3cml0ZTp0LndyaXRlLHdyaXRlbG46dC53cml0ZWxufTtwKHQse2Nsb3NlOnUsb3Blbjp1LHdyaXRlOmZ1bmN0aW9uIHMoKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxlPUFycmF5KG4pLHQ9MDt0PG47dCsrKWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBhKGUuam9pbigiIikpfSx3cml0ZWxuOmZ1bmN0aW9uIGMoKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxlPUFycmF5KG4pLHQ9MDt0PG47dCsrKWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBhKGUuam9pbigiIikrIlxuIil9fSk7dmFyIG89bS53aW4ub25lcnJvcnx8dTtyZXR1cm4gbS53aW4ub25lcnJvcj1mdW5jdGlvbihuLGUsdCl7aS5lcnJvcih7bXNnOm4rIiAtICIrZSsiOiAiK3R9KSxvLmFwcGx5KG0ud2luLFtuLGUsdF0pfSxtLndyaXRlKGUsZnVuY3Rpb24oKXtwKHQsciksbS53aW4ub25lcnJvcj1vLGkuZG9uZSgpLG09bnVsbCxsKCl9KSxtfWZ1bmN0aW9uIGQobixlLHQpe2lmKG8uaXNGdW5jdGlvbih0KSl0PXtkb25lOnR9O2Vsc2UgaWYoImNsZWFyIj09PXQpcmV0dXJuIGM9W10sbT1udWxsLHZvaWQoZz0wKTt0PW8uZGVmYXVsdHModCxzKTt2YXIgaT1bbj0vXiMvLnRlc3Qobik/d2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4uc3Vic3RyKDEpKTpuLmpxdWVyeT9uWzBdOm4sZSx0XTtyZXR1cm4gbi5wb3N0c2NyaWJlPXtjYW5jZWw6ZnVuY3Rpb24gYSgpe2kuc3RyZWFtP2kuc3RyZWFtLmFib3J0KCk6aVsxXT11fX0sdC5iZWZvcmVFbnF1ZXVlKGkpLGMucHVzaChpKSxtfHxsKCksbi5wb3N0c2NyaWJlfWUuX19lc01vZHVsZT0hMDt2YXIgcD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihuKXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgdD1hcmd1bWVudHNbZV07Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihuW2ldPXRbaV0pfXJldHVybiBufTtlWyJkZWZhdWx0Il09ZDt2YXIgZj1hKHQoMikpLG89aSh0KDQpKSxzPXthZnRlckFzeW5jOnUsYWZ0ZXJEZXF1ZXVlOnUsYWZ0ZXJTdHJlYW1TdGFydDp1LGFmdGVyV3JpdGU6dSxhdXRvRml4OiEwLGJlZm9yZUVucXVldWU6dSxiZWZvcmVXcml0ZVRva2VuOmZ1bmN0aW9uIHYobil7cmV0dXJuIG59LGJlZm9yZVdyaXRlOmZ1bmN0aW9uIHcobil7cmV0dXJuIG59LGRvbmU6dSxlcnJvcjpmdW5jdGlvbiBoKG4pe3Rocm93IG5ldyBFcnJvcihuLm1zZyl9LHJlbGVhc2VBc3luYzohMX0sZz0wLGM9W10sbT1udWxsO3AoZCx7c3RyZWFtczp7fSxxdWV1ZTpjLFdyaXRlU3RyZWFtOmZbImRlZmF1bHQiXX0pfSxmdW5jdGlvbihuLGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkobil7aWYobiYmbi5fX2VzTW9kdWxlKXJldHVybiBuO3ZhciBlPXt9O2lmKG51bGwhPW4pZm9yKHZhciB0IGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdCkmJihlW3RdPW5bdF0pO3JldHVybiBlWyJkZWZhdWx0Il09bixlfWZ1bmN0aW9uIGEobil7cmV0dXJuIG4mJm4uX19lc01vZHVsZT9uOntkZWZhdWx0Om59fWZ1bmN0aW9uIGIobixlKXtpZighKG4gaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiB5KG4sZSl7dmFyIHQ9aitlLGk9bi5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIFMuZXhpc3R5KGkpP1N0cmluZyhpKTppfWZ1bmN0aW9uIF8obixlLHQpe3ZhciBpPTI8YXJndW1lbnRzLmxlbmd0aCYmdCE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06bnVsbCxhPWorZTtTLmV4aXN0eShpKSYmIiIhPT1pP24uc2V0QXR0cmlidXRlKGEsaSk6bi5yZW1vdmVBdHRyaWJ1dGUoYSl9ZS5fX2VzTW9kdWxlPSEwO3ZhciBDPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciB0PWFyZ3VtZW50c1tlXTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKG5baV09dFtpXSl9cmV0dXJuIG59LGs9YSh0KDMpKSxTPWkodCg0KSksVD0hMSxqPSJkYXRhLXBzLSIsTD0icHMtc3R5bGUiLHg9InBzLXNjcmlwdCIscj1mdW5jdGlvbigpe2Z1bmN0aW9uIGkobixlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJmUhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnt9O2IodGhpcyxpKSx0aGlzLnJvb3Q9bix0aGlzLm9wdGlvbnM9dCx0aGlzLmRvYz1uLm93bmVyRG9jdW1lbnQsdGhpcy53aW49dGhpcy5kb2MuZGVmYXVsdFZpZXd8fHRoaXMuZG9jLnBhcmVudFdpbmRvdyx0aGlzLnBhcnNlcj1uZXcga1siZGVmYXVsdCJdKCIiLHthdXRvRml4OnQuYXV0b0ZpeH0pLHRoaXMuYWN0dWFscz1bbl0sdGhpcy5wcm94eUhpc3Rvcnk9IiIsdGhpcy5wcm94eVJvb3Q9dGhpcy5kb2MuY3JlYXRlRWxlbWVudChuLm5vZGVOYW1lKSx0aGlzLnNjcmlwdFN0YWNrPVtdLHRoaXMud3JpdGVRdWV1ZT1bXSxfKHRoaXMucHJveHlSb290LCJwcm94eW9mIiwwKX1yZXR1cm4gaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24gdCgpe3ZhciBuO2Zvcigobj10aGlzLndyaXRlUXVldWUpLnB1c2guYXBwbHkobixhcmd1bWVudHMpOyF0aGlzLmRlZmVycmVkUmVtb3RlJiZ0aGlzLndyaXRlUXVldWUubGVuZ3RoOyl7dmFyIGU9dGhpcy53cml0ZVF1ZXVlLnNoaWZ0KCk7Uy5pc0Z1bmN0aW9uKGUpP3RoaXMuX2NhbGxGdW5jdGlvbihlKTp0aGlzLl93cml0ZUltcGwoZSl9fSxpLnByb3RvdHlwZS5fY2FsbEZ1bmN0aW9uPWZ1bmN0aW9uIGEobil7dmFyIGU9e3R5cGU6ImZ1bmN0aW9uIix2YWx1ZTpuLm5hbWV8fG4udG9TdHJpbmcoKX07dGhpcy5fb25TY3JpcHRTdGFydChlKSxuLmNhbGwodGhpcy53aW4sdGhpcy5kb2MpLHRoaXMuX29uU2NyaXB0RG9uZShlKX0saS5wcm90b3R5cGUuX3dyaXRlSW1wbD1mdW5jdGlvbiByKG4pe3RoaXMucGFyc2VyLmFwcGVuZChuKTtmb3IodmFyIGU9dm9pZCAwLHQ9dm9pZCAwLGk9dm9pZCAwLGE9W107KGU9dGhpcy5wYXJzZXIucmVhZFRva2VuKCkpJiYhKHQ9Uy5pc1NjcmlwdChlKSkmJiEoaT1TLmlzU3R5bGUoZSkpOykoZT10aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbihlKSkmJmEucHVzaChlKTswPGEubGVuZ3RoJiZ0aGlzLl93cml0ZVN0YXRpY1Rva2VucyhhKSx0JiZ0aGlzLl9oYW5kbGVTY3JpcHRUb2tlbihlKSxpJiZ0aGlzLl9oYW5kbGVTdHlsZVRva2VuKGUpfSxpLnByb3RvdHlwZS5fd3JpdGVTdGF0aWNUb2tlbnM9ZnVuY3Rpb24gbyhuKXt2YXIgZT10aGlzLl9idWlsZENodW5rKG4pO3JldHVybiBlLmFjdHVhbD8oZS5odG1sPXRoaXMucHJveHlIaXN0b3J5K2UuYWN0dWFsLHRoaXMucHJveHlIaXN0b3J5Kz1lLnByb3h5LHRoaXMucHJveHlSb290LmlubmVySFRNTD1lLmh0bWwsVCYmKGUucHJveHlJbm5lckhUTUw9dGhpcy5wcm94eVJvb3QuaW5uZXJIVE1MKSx0aGlzLl93YWxrQ2h1bmsoKSxUJiYoZS5hY3R1YWxJbm5lckhUTUw9dGhpcy5yb290LmlubmVySFRNTCksZSk6bnVsbH0saS5wcm90b3R5cGUuX2J1aWxkQ2h1bms9ZnVuY3Rpb24gbChuKXtmb3IodmFyIGU9dGhpcy5hY3R1YWxzLmxlbmd0aCx0PVtdLGk9W10sYT1bXSxyPW4ubGVuZ3RoLG89MDtvPHI7bysrKXt2YXIgcz1uW29dLGM9cy50b1N0cmluZygpO2lmKHQucHVzaChjKSxzLmF0dHJzKXtpZighL15ub3NjcmlwdCQvaS50ZXN0KHMudGFnTmFtZSkpe3ZhciB1PWUrKztpLnB1c2goYy5yZXBsYWNlKC8oXC8/PikvLCIgIitqKyJpZD0iK3UrIiAkMSIpKSxzLmF0dHJzLmlkIT09eCYmcy5hdHRycy5pZCE9PUwmJmEucHVzaCgiYXRvbWljVGFnIj09PXMudHlwZT8iIjoiPCIrcy50YWdOYW1lKyIgIitqKyJwcm94eW9mPSIrdSsocy51bmFyeT8iIC8+IjoiPiIpKX19ZWxzZSBpLnB1c2goYyksYS5wdXNoKCJlbmRUYWciPT09cy50eXBlP2M6IiIpfXJldHVybnt0b2tlbnM6bixyYXc6dC5qb2luKCIiKSxhY3R1YWw6aS5qb2luKCIiKSxwcm94eTphLmpvaW4oIiIpfX0saS5wcm90b3R5cGUuX3dhbGtDaHVuaz1mdW5jdGlvbiBzKCl7Zm9yKHZhciBuPXZvaWQgMCxlPVt0aGlzLnByb3h5Um9vdF07Uy5leGlzdHkobj1lLnNoaWZ0KCkpOyl7dmFyIHQ9MT09PW4ubm9kZVR5cGU7aWYoIXR8fCF5KG4sInByb3h5b2YiKSl7dCYmXyh0aGlzLmFjdHVhbHNbeShuLCJpZCIpXT1uLCJpZCIpO3ZhciBpPW4ucGFyZW50Tm9kZSYmeShuLnBhcmVudE5vZGUsInByb3h5b2YiKTtpJiZ0aGlzLmFjdHVhbHNbaV0uYXBwZW5kQ2hpbGQobil9ZS51bnNoaWZ0LmFwcGx5KGUsUy50b0FycmF5KG4uY2hpbGROb2RlcykpfX0saS5wcm90b3R5cGUuX2hhbmRsZVNjcmlwdFRva2VuPWZ1bmN0aW9uIGMobil7dmFyIGU9dGhpcyx0PXRoaXMucGFyc2VyLmNsZWFyKCk7dCYmdGhpcy53cml0ZVF1ZXVlLnVuc2hpZnQodCksbi5zcmM9bi5hdHRycy5zcmN8fG4uYXR0cnMuU1JDLChuPXRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKG4pKSYmKG4uc3JjJiZ0aGlzLnNjcmlwdFN0YWNrLmxlbmd0aD90aGlzLmRlZmVycmVkUmVtb3RlPW46dGhpcy5fb25TY3JpcHRTdGFydChuKSx0aGlzLl93cml0ZVNjcmlwdFRva2VuKG4sZnVuY3Rpb24oKXtlLl9vblNjcmlwdERvbmUobil9KSl9LGkucHJvdG90eXBlLl9oYW5kbGVTdHlsZVRva2VuPWZ1bmN0aW9uIHUobil7dmFyIGU9dGhpcy5wYXJzZXIuY2xlYXIoKTtlJiZ0aGlzLndyaXRlUXVldWUudW5zaGlmdChlKSxuLnR5cGU9bi5hdHRycy50eXBlfHxuLmF0dHJzLlRZUEV8fCJ0ZXh0L2NzcyIsKG49dGhpcy5vcHRpb25zLmJlZm9yZVdyaXRlVG9rZW4obikpJiZ0aGlzLl93cml0ZVN0eWxlVG9rZW4obiksZSYmdGhpcy53cml0ZSgpfSxpLnByb3RvdHlwZS5fd3JpdGVTdHlsZVRva2VuPWZ1bmN0aW9uIGQobil7dmFyIGU9dGhpcy5fYnVpbGRTdHlsZShuKTt0aGlzLl9pbnNlcnRDdXJzb3IoZSxMKSxuLmNvbnRlbnQmJihlLnN0eWxlU2hlZXQmJiFlLnNoZWV0P2Uuc3R5bGVTaGVldC5jc3NUZXh0PW4uY29udGVudDplLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKG4uY29udGVudCkpKX0saS5wcm90b3R5cGUuX2J1aWxkU3R5bGU9ZnVuY3Rpb24gZShuKXt2YXIgdD10aGlzLmRvYy5jcmVhdGVFbGVtZW50KG4udGFnTmFtZSk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJ0eXBlIixuLnR5cGUpLFMuZWFjaEtleShuLmF0dHJzLGZ1bmN0aW9uKG4sZSl7dC5zZXRBdHRyaWJ1dGUobixlKX0pLHR9LGkucHJvdG90eXBlLl9pbnNlcnRDdXJzb3I9ZnVuY3Rpb24gcChuLGUpe3RoaXMuX3dyaXRlSW1wbCgnPHNwYW4gaWQ9IicrZSsnIi8+Jyk7dmFyIHQ9dGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQoZSk7dCYmdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLHQpfSxpLnByb3RvdHlwZS5fb25TY3JpcHRTdGFydD1mdW5jdGlvbiBmKG4pe24ub3V0ZXJXcml0ZXM9dGhpcy53cml0ZVF1ZXVlLHRoaXMud3JpdGVRdWV1ZT1bXSx0aGlzLnNjcmlwdFN0YWNrLnVuc2hpZnQobil9LGkucHJvdG90eXBlLl9vblNjcmlwdERvbmU9ZnVuY3Rpb24gZyhuKXtuPT09dGhpcy5zY3JpcHRTdGFja1swXT8odGhpcy5zY3JpcHRTdGFjay5zaGlmdCgpLHRoaXMud3JpdGUuYXBwbHkodGhpcyxuLm91dGVyV3JpdGVzKSwhdGhpcy5zY3JpcHRTdGFjay5sZW5ndGgmJnRoaXMuZGVmZXJyZWRSZW1vdGUmJih0aGlzLl9vblNjcmlwdFN0YXJ0KHRoaXMuZGVmZXJyZWRSZW1vdGUpLHRoaXMuZGVmZXJyZWRSZW1vdGU9bnVsbCkpOnRoaXMub3B0aW9ucy5lcnJvcih7bXNnOiJCYWQgc2NyaXB0IG5lc3Rpbmcgb3Igc2NyaXB0IGZpbmlzaGVkIHR3aWNlIn0pfSxpLnByb3RvdHlwZS5fd3JpdGVTY3JpcHRUb2tlbj1mdW5jdGlvbiBtKG4sZSl7dmFyIHQ9dGhpcy5fYnVpbGRTY3JpcHQobiksaT10aGlzLl9zaG91bGRSZWxlYXNlKHQpLGE9dGhpcy5vcHRpb25zLmFmdGVyQXN5bmM7bi5zcmMmJih0LnNyYz1uLnNyYyx0aGlzLl9zY3JpcHRMb2FkSGFuZGxlcih0LGk/YTpmdW5jdGlvbigpe2UoKSxhKCl9KSk7dHJ5e3RoaXMuX2luc2VydEN1cnNvcih0LHgpLHQuc3JjJiYhaXx8ZSgpfWNhdGNoKHIpe3RoaXMub3B0aW9ucy5lcnJvcihyKSxlKCl9fSxpLnByb3RvdHlwZS5fYnVpbGRTY3JpcHQ9ZnVuY3Rpb24gdihuKXt2YXIgdD10aGlzLmRvYy5jcmVhdGVFbGVtZW50KG4udGFnTmFtZSk7cmV0dXJuIFMuZWFjaEtleShuLmF0dHJzLGZ1bmN0aW9uKG4sZSl7dC5zZXRBdHRyaWJ1dGUobixlKX0pLG4uY29udGVudCYmKHQudGV4dD1uLmNvbnRlbnQpLHR9LGkucHJvdG90eXBlLl9zY3JpcHRMb2FkSGFuZGxlcj1mdW5jdGlvbiB3KGUsdCl7ZnVuY3Rpb24gaSgpe2U9ZS5vbmxvYWQ9ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZS5vbmVycm9yPW51bGx9ZnVuY3Rpb24gYSgpe2koKSxudWxsIT10JiZ0KCksdD1udWxsfWZ1bmN0aW9uIHIobil7aSgpLG8obiksbnVsbCE9dCYmdCgpLHQ9bnVsbH1mdW5jdGlvbiBuKG4sZSl7dmFyIHQ9blsib24iK2VdO251bGwhPXQmJihuWyJfb24iK2VdPXQpfXZhciBvPXRoaXMub3B0aW9ucy5lcnJvcjtuKGUsImxvYWQiKSxuKGUsImVycm9yIiksQyhlLHtvbmxvYWQ6ZnVuY3Rpb24gcygpe2lmKGUuX29ubG9hZCl0cnl7ZS5fb25sb2FkLmFwcGx5KHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX1jYXRjaChuKXtyKHttc2c6Im9ubG9hZCBoYW5kbGVyIGZhaWxlZCAiK24rIiBAICIrZS5zcmN9KX1hKCl9LG9uZXJyb3I6ZnVuY3Rpb24gYygpe2lmKGUuX29uZXJyb3IpdHJ5e2UuX29uZXJyb3IuYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfWNhdGNoKG4pe3JldHVybiB2b2lkIHIoe21zZzoib25lcnJvciBoYW5kbGVyIGZhaWxlZCAiK24rIiBAICIrZS5zcmN9KX1yKHttc2c6InJlbW90ZSBzY3JpcHQgZmFpbGVkICIrZS5zcmN9KX0sb25yZWFkeXN0YXRlY2hhbmdlOmZ1bmN0aW9uIHUoKXsvXihsb2FkZWR8Y29tcGxldGUpJC8udGVzdChlLnJlYWR5U3RhdGUpJiZhKCl9fSl9LGkucHJvdG90eXBlLl9zaG91bGRSZWxlYXNlPWZ1bmN0aW9uIGgobil7cmV0dXJuIS9ec2NyaXB0JC9pLnRlc3Qobi5ub2RlTmFtZSl8fCEhKHRoaXMub3B0aW9ucy5yZWxlYXNlQXN5bmMmJm4uc3JjJiZuLmhhc0F0dHJpYnV0ZSgiYXN5bmMiKSl9LGl9KCk7ZVsiZGVmYXVsdCJdPXJ9LGZ1bmN0aW9uKHQpeyFmdW5jdGlvbiBpKG4sZSl7dC5leHBvcnRzPWUoKX0oMCxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBpKG4pe2lmKGFbbl0pcmV0dXJuIGFbbl0uZXhwb3J0czt2YXIgZT1hW25dPXtleHBvcnRzOnt9LGlkOm4sbG9hZGVkOiExfTtyZXR1cm4gdFtuXS5jYWxsKGUuZXhwb3J0cyxlLGUuZXhwb3J0cyxpKSxlLmxvYWRlZD0hMCxlLmV4cG9ydHN9dmFyIGE9e307cmV0dXJuIGkubT10LGkuYz1hLGkucD0iIixpKDApfShbZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKG4pe3JldHVybiBuJiZuLl9fZXNNb2R1bGU/bjp7ZGVmYXVsdDpufX12YXIgYT1pKHQoMSkpO24uZXhwb3J0cz1hWyJkZWZhdWx0Il19LGZ1bmN0aW9uKG4sZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShuKXtyZXR1cm4gbiYmbi5fX2VzTW9kdWxlP246e2RlZmF1bHQ6bn19ZnVuY3Rpb24gYShuKXtpZihuJiZuLl9fZXNNb2R1bGUpcmV0dXJuIG47dmFyIGU9e307aWYobnVsbCE9bilmb3IodmFyIHQgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKGVbdF09blt0XSk7cmV0dXJuIGVbImRlZmF1bHQiXT1uLGV9ZnVuY3Rpb24gbChuLGUpe2lmKCEobiBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWUuX19lc01vZHVsZT0hMDt2YXIgZD1hKHQoMikpLHA9YSh0KDMpKSxmPWkodCg2KSkscj10KDUpLGc9e2NvbW1lbnQ6L148IS0tLyxlbmRUYWc6L148XC8vLGF0b21pY1RhZzovXjxccyooc2NyaXB0fHN0eWxlfG5vc2NyaXB0fGlmcmFtZXx0ZXh0YXJlYSlbXHNcLz5dL2ksc3RhcnRUYWc6L148LyxjaGFyczovXltePF0vfSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhuLGUpe3ZhciB0PXRoaXMsaT0wPGFyZ3VtZW50cy5sZW5ndGgmJm4hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOiIiLGE9MTxhcmd1bWVudHMubGVuZ3RoJiZlIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTp7fTtsKHRoaXMsYyksdGhpcy5zdHJlYW09aTt2YXIgcj0hMSxvPXt9O2Zvcih2YXIgcyBpbiBkKWQuaGFzT3duUHJvcGVydHkocykmJihhLmF1dG9GaXgmJihvW3MrIkZpeCJdPSEwKSxyPXJ8fG9bcysiRml4Il0pO3I/KHRoaXMuX3JlYWRUb2tlbj0oMCxmWyJkZWZhdWx0Il0pKHRoaXMsbyxmdW5jdGlvbigpe3JldHVybiB0Ll9yZWFkVG9rZW5JbXBsKCl9KSx0aGlzLl9wZWVrVG9rZW49KDAsZlsiZGVmYXVsdCJdKSh0aGlzLG8sZnVuY3Rpb24oKXtyZXR1cm4gdC5fcGVla1Rva2VuSW1wbCgpfSkpOih0aGlzLl9yZWFkVG9rZW49dGhpcy5fcmVhZFRva2VuSW1wbCx0aGlzLl9wZWVrVG9rZW49dGhpcy5fcGVla1Rva2VuSW1wbCl9cmV0dXJuIGMucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbiBlKG4pe3RoaXMuc3RyZWFtKz1ufSxjLnByb3RvdHlwZS5wcmVwZW5kPWZ1bmN0aW9uIHQobil7dGhpcy5zdHJlYW09bit0aGlzLnN0cmVhbX0sYy5wcm90b3R5cGUuX3JlYWRUb2tlbkltcGw9ZnVuY3Rpb24gaSgpe3ZhciBuPXRoaXMuX3BlZWtUb2tlbkltcGwoKTtpZihuKXJldHVybiB0aGlzLnN0cmVhbT10aGlzLnN0cmVhbS5zbGljZShuLmxlbmd0aCksbn0sYy5wcm90b3R5cGUuX3BlZWtUb2tlbkltcGw9ZnVuY3Rpb24gYSgpe2Zvcih2YXIgbiBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkobikmJmdbbl0udGVzdCh0aGlzLnN0cmVhbSkpe3ZhciBlPXBbbl0odGhpcy5zdHJlYW0pO2lmKGUpcmV0dXJuInN0YXJ0VGFnIj09PWUudHlwZSYmL3NjcmlwdHxzdHlsZS9pLnRlc3QoZS50YWdOYW1lKT9udWxsOihlLnRleHQ9dGhpcy5zdHJlYW0uc3Vic3RyKDAsZS5sZW5ndGgpLGUpfX0sYy5wcm90b3R5cGUucGVla1Rva2VuPWZ1bmN0aW9uIG4oKXtyZXR1cm4gdGhpcy5fcGVla1Rva2VuKCl9LGMucHJvdG90eXBlLnJlYWRUb2tlbj1mdW5jdGlvbiByKCl7cmV0dXJuIHRoaXMuX3JlYWRUb2tlbigpfSxjLnByb3RvdHlwZS5yZWFkVG9rZW5zPWZ1bmN0aW9uIG8obil7Zm9yKHZhciBlPXZvaWQgMDtlPXRoaXMucmVhZFRva2VuKCk7KWlmKG5bZS50eXBlXSYmITE9PT1uW2UudHlwZV0oZSkpcmV0dXJufSxjLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBzKCl7dmFyIG49dGhpcy5zdHJlYW07cmV0dXJuIHRoaXMuc3RyZWFtPSIiLG59LGMucHJvdG90eXBlLnJlc3Q9ZnVuY3Rpb24gdSgpe3JldHVybiB0aGlzLnN0cmVhbX0sY30oKTtmb3IodmFyIHMgaW4oZVsiZGVmYXVsdCJdPW8pLnRva2VuVG9TdHJpbmc9ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoKX0sby5lc2NhcGVBdHRyaWJ1dGVzPWZ1bmN0aW9uKG4pe3ZhciBlPXt9O2Zvcih2YXIgdCBpbiBuKW4uaGFzT3duUHJvcGVydHkodCkmJihlW3RdPSgwLHIuZXNjYXBlUXVvdGVzKShuW3RdLG51bGwpKTtyZXR1cm4gZX0sby5zdXBwb3J0cz1kKWQuaGFzT3duUHJvcGVydHkocykmJihvLmJyb3dzZXJIYXNGbGF3PW8uYnJvd3Nlckhhc0ZsYXd8fCFkW3NdJiZzKX0sZnVuY3Rpb24obixlKXsidXNlIHN0cmljdCI7dmFyIHQ9IShlLl9fZXNNb2R1bGU9ITApLGk9ITEsYT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3ZhciByPSI8UD48ST48L1A+PC9JPiI7YS5pbm5lckhUTUw9cixlLnRhZ1NvdXA9dD1hLmlubmVySFRNTCE9PXJ9Y2F0Y2gobyl7ZS50YWdTb3VwPXQ9ITF9dHJ5e2EuaW5uZXJIVE1MPSI8UD48aT48UD48L1A+PC9pPjwvUD4iLGUuc2VsZkNsb3NlPWk9Mj09PWEuY2hpbGROb2Rlcy5sZW5ndGh9Y2F0Y2gobyl7ZS5zZWxmQ2xvc2U9aT0hMX1hPW51bGwsZS50YWdTb3VwPXQsZS5zZWxmQ2xvc2U9aX0sZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKG4pe3ZhciBlPW4uaW5kZXhPZigiLS1ceDNlIik7aWYoMDw9ZSlyZXR1cm4gbmV3IGwuQ29tbWVudFRva2VuKG4uc3Vic3RyKDQsZS0xKSxlKzMpfWZ1bmN0aW9uIGEobil7dmFyIGU9bi5pbmRleE9mKCI8Iik7cmV0dXJuIG5ldyBsLkNoYXJzVG9rZW4oMDw9ZT9lOm4ubGVuZ3RoKX1mdW5jdGlvbiByKG4pe3ZhciBvLHMsYztpZigtMSE9PW4uaW5kZXhPZigiPiIpKXt2YXIgZT1uLm1hdGNoKGQuc3RhcnRUYWcpO2lmKGUpe3ZhciB0PShvPXt9LHM9e30sYz1lWzJdLGVbMl0ucmVwbGFjZShkLmF0dHIsZnVuY3Rpb24obixlLHQsaSxhLHIpe3R8fGl8fGF8fHI/YXJndW1lbnRzWzVdPyhvW2FyZ3VtZW50c1s1XV09IiIsc1thcmd1bWVudHNbNV1dPSEwKTpvW2VdPWFyZ3VtZW50c1syXXx8YXJndW1lbnRzWzNdfHxhcmd1bWVudHNbNF18fGQuZmlsbEF0dHIudGVzdChlKSYmZXx8IiI6b1tlXT0iIixjPWMucmVwbGFjZShuLCIiKX0pLHt2Om5ldyBsLlN0YXJ0VGFnVG9rZW4oZVsxXSxlWzBdLmxlbmd0aCxvLHMsISFlWzNdLGMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpKX0pO2lmKCJvYmplY3QiPT09KHZvaWQgMD09PXQ/InVuZGVmaW5lZCI6dSh0KSkpcmV0dXJuIHQudn19fWZ1bmN0aW9uIG8obil7dmFyIGU9cihuKTtpZihlKXt2YXIgdD1uLnNsaWNlKGUubGVuZ3RoKTtpZih0Lm1hdGNoKG5ldyBSZWdFeHAoIjwvXFxzKiIrZS50YWdOYW1lKyJcXHMqPiIsImkiKSkpe3ZhciBpPXQubWF0Y2gobmV3IFJlZ0V4cCgiKFtcXHNcXFNdKj8pPC9cXHMqIitlLnRhZ05hbWUrIlxccyo+IiwiaSIpKTtpZihpKXJldHVybiBuZXcgbC5BdG9taWNUYWdUb2tlbihlLnRhZ05hbWUsaVswXS5sZW5ndGgrZS5sZW5ndGgsZS5hdHRycyxlLmJvb2xlYW5BdHRycyxpWzFdKX19fWZ1bmN0aW9uIHMobil7dmFyIGU9bi5tYXRjaChkLmVuZFRhZyk7aWYoZSlyZXR1cm4gbmV3IGwuRW5kVGFnVG9rZW4oZVsxXSxlWzBdLmxlbmd0aCl9ZS5fX2VzTW9kdWxlPSEwO3ZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbn06ZnVuY3Rpb24obil7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJm4uY29uc3RydWN0b3I9PT1TeW1ib2wmJm4hPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBufTtlLmNvbW1lbnQ9aSxlLmNoYXJzPWEsZS5zdGFydFRhZz1yLGUuYXRvbWljVGFnPW8sZS5lbmRUYWc9czt2YXIgbD10KDQpLGQ9e3N0YXJ0VGFnOi9ePChbXC1BLVphLXowLTlfXSspKCg/OlxzK1tcd1wtXSsoPzpccyo9P1xzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyooXC8/KT4vLGVuZFRhZzovXjxcLyhbXC1BLVphLXowLTlfXSspW14+XSo+LyxhdHRyOi8oPzooW1wtQS1aYS16MC05X10rKVxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpfCg/OihbXC1BLVphLXowLTlfXSspKFxzfCQpKykvZyxmaWxsQXR0cjovXihjaGVja2VkfGNvbXBhY3R8ZGVjbGFyZXxkZWZlcnxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxub2hyZWZ8bm9yZXNpemV8bm9zaGFkZXxub3dyYXB8cmVhZG9ubHl8c2VsZWN0ZWQpJC9pfX0sZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKG4sZSl7aWYoIShuIGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZS5fX2VzTW9kdWxlPSEwLGUuRW5kVGFnVG9rZW49ZS5BdG9taWNUYWdUb2tlbj1lLlN0YXJ0VGFnVG9rZW49ZS5UYWdUb2tlbj1lLkNoYXJzVG9rZW49ZS5Db21tZW50VG9rZW49ZS5Ub2tlbj11bmRlZmluZWQ7dmFyIGM9dCg1KSxpPWUuVG9rZW49ZnVuY3Rpb24gaShuLGUpe3ModGhpcyxpKSx0aGlzLnR5cGU9bix0aGlzLmxlbmd0aD1lLHRoaXMudGV4dD0iIn0sYT0oZS5Db21tZW50VG9rZW49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4sZSl7cyh0aGlzLHQpLHRoaXMudHlwZT0iY29tbWVudCIsdGhpcy5sZW5ndGg9ZXx8KG4/bi5sZW5ndGg6MCksdGhpcy50ZXh0PSIiLHRoaXMuY29udGVudD1ufXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiBuKCl7cmV0dXJuIlx4M2MhLS0iK3RoaXMuY29udGVudH0sdH0oKSxlLkNoYXJzVG9rZW49ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKG4pe3ModGhpcyxlKSx0aGlzLnR5cGU9ImNoYXJzIix0aGlzLmxlbmd0aD1uLHRoaXMudGV4dD0iIn1yZXR1cm4gZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24gbigpe3JldHVybiB0aGlzLnRleHR9LGV9KCksZS5UYWdUb2tlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIobixlLHQsaSxhKXtzKHRoaXMsciksdGhpcy50eXBlPW4sdGhpcy5sZW5ndGg9dCx0aGlzLnRleHQ9IiIsdGhpcy50YWdOYW1lPWUsdGhpcy5hdHRycz1pLHRoaXMuYm9vbGVhbkF0dHJzPWEsdGhpcy51bmFyeT0hMSx0aGlzLmh0bWw1VW5hcnk9ITF9cmV0dXJuIHIuZm9ybWF0VGFnPWZ1bmN0aW9uIG8obixlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJmUhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOm51bGwsaT0iPCIrbi50YWdOYW1lO2Zvcih2YXIgYSBpbiBuLmF0dHJzKWlmKG4uYXR0cnMuaGFzT3duUHJvcGVydHkoYSkpe2krPSIgIithO3ZhciByPW4uYXR0cnNbYV07InVuZGVmaW5lZCIhPXR5cGVvZiBuLmJvb2xlYW5BdHRycyYmInVuZGVmaW5lZCIhPXR5cGVvZiBuLmJvb2xlYW5BdHRyc1thXXx8KGkrPSc9IicrKDAsYy5lc2NhcGVRdW90ZXMpKHIpKyciJyl9cmV0dXJuIG4ucmVzdCYmKGkrPSIgIituLnJlc3QpLG4udW5hcnkmJiFuLmh0bWw1VW5hcnk/aSs9Ii8+IjppKz0iPiIsdCE9PXVuZGVmaW5lZCYmbnVsbCE9PXQmJihpKz10KyI8LyIrbi50YWdOYW1lKyI+IiksaX0scn0oKSk7ZS5TdGFydFRhZ1Rva2VuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhuLGUsdCxpLGEscil7cyh0aGlzLG8pLHRoaXMudHlwZT0ic3RhcnRUYWciLHRoaXMubGVuZ3RoPWUsdGhpcy50ZXh0PSIiLHRoaXMudGFnTmFtZT1uLHRoaXMuYXR0cnM9dCx0aGlzLmJvb2xlYW5BdHRycz1pLHRoaXMuaHRtbDVVbmFyeT0hMSx0aGlzLnVuYXJ5PWEsdGhpcy5yZXN0PXJ9cmV0dXJuIG8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIG4oKXtyZXR1cm4gYS5mb3JtYXRUYWcodGhpcyl9LG99KCksZS5BdG9taWNUYWdUb2tlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIobixlLHQsaSxhKXtzKHRoaXMsciksdGhpcy50eXBlPSJhdG9taWNUYWciLHRoaXMubGVuZ3RoPWUsdGhpcy50ZXh0PSIiLHRoaXMudGFnTmFtZT1uLHRoaXMuYXR0cnM9dCx0aGlzLmJvb2xlYW5BdHRycz1pLHRoaXMudW5hcnk9ITEsdGhpcy5odG1sNVVuYXJ5PSExLHRoaXMuY29udGVudD1hfXJldHVybiByLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiBuKCl7cmV0dXJuIGEuZm9ybWF0VGFnKHRoaXMsdGhpcy5jb250ZW50KX0scn0oKSxlLkVuZFRhZ1Rva2VuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuLGUpe3ModGhpcyx0KSx0aGlzLnR5cGU9ImVuZFRhZyIsdGhpcy5sZW5ndGg9ZSx0aGlzLnRleHQ9IiIsdGhpcy50YWdOYW1lPW59cmV0dXJuIHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIG4oKXtyZXR1cm4iPC8iK3RoaXMudGFnTmFtZSsiPiJ9LHR9KCl9LGZ1bmN0aW9uKG4sZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQobixlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJmUhPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOiIiO3JldHVybiBuP24ucmVwbGFjZSgvKFteIl0qKSIvZyxmdW5jdGlvbihuLGUpe3JldHVybi9cXC8udGVzdChlKT9lKyciJzplKydcXCInfSk6dH1lLl9fZXNNb2R1bGU9ITAsZS5lc2NhcGVRdW90ZXM9dH0sZnVuY3Rpb24obixlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShuKXtyZXR1cm4gbiYmInN0YXJ0VGFnIj09PW4udHlwZSYmKG4udW5hcnk9aS50ZXN0KG4udGFnTmFtZSl8fG4udW5hcnksbi5odG1sNVVuYXJ5PSEvXC8+JC8udGVzdChuLnRleHQpKSxufWZ1bmN0aW9uIGwobixlKXt2YXIgdD1uLnN0cmVhbSxpPXUoZSgpKTtyZXR1cm4gbi5zdHJlYW09dCxpfWZ1bmN0aW9uIGQobixlKXt2YXIgdD1lLnBvcCgpO24ucHJlcGVuZCgiPC8iK3QudGFnTmFtZSsiPiIpfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtyZXR1cm4gbi5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV19LG4ubGFzdFRhZ05hbWVFcT1mdW5jdGlvbihuKXt2YXIgZT10aGlzLmxhc3QoKTtyZXR1cm4gZSYmZS50YWdOYW1lJiZlLnRhZ05hbWUudG9VcHBlckNhc2UoKT09PW4udG9VcHBlckNhc2UoKX0sbi5jb250YWluc1RhZ05hbWU9ZnVuY3Rpb24obil7Zm9yKHZhciBlLHQ9MDtlPXRoaXNbdF07dCsrKWlmKGUudGFnTmFtZT09PW4pcmV0dXJuITA7cmV0dXJuITF9LG59ZnVuY3Rpb24gdCh0LGksZSl7ZnVuY3Rpb24gYSgpe3ZhciBuPWwodCxlKTtuJiZvW24udHlwZV0mJm9bbi50eXBlXShuKX12YXIgcj1wKCksbz17c3RhcnRUYWc6ZnVuY3Rpb24gcyhuKXt2YXIgZT1uLnRhZ05hbWU7IlRSIj09PWUudG9VcHBlckNhc2UoKSYmci5sYXN0VGFnTmFtZUVxKCJUQUJMRSIpPyh0LnByZXBlbmQoIjxUQk9EWT4iKSxhKCkpOmkuc2VsZkNsb3NlRml4JiZmLnRlc3QoZSkmJnIuY29udGFpbnNUYWdOYW1lKGUpP3IubGFzdFRhZ05hbWVFcShlKT9kKHQscik6KHQucHJlcGVuZCgiPC8iK24udGFnTmFtZSsiPiIpLGEoKSk6bi51bmFyeXx8ci5wdXNoKG4pfSxlbmRUYWc6ZnVuY3Rpb24gYyhuKXtyLmxhc3QoKT9pLnRhZ1NvdXBGaXgmJiFyLmxhc3RUYWdOYW1lRXEobi50YWdOYW1lKT9kKHQscik6ci5wb3AoKTppLnRhZ1NvdXBGaXgmJihlKCksYSgpKX19O3JldHVybiBmdW5jdGlvbiBuKCl7cmV0dXJuIGEoKSx1KGUoKSl9fWUuX19lc01vZHVsZT0hMCxlWyJkZWZhdWx0Il09dDt2YXIgaT0vXihBUkVBfEJBU0V8QkFTRUZPTlR8QlJ8Q09MfEZSQU1FfEhSfElNR3xJTlBVVHxJU0lOREVYfExJTkt8TUVUQXxQQVJBTXxFTUJFRCkkL2ksZj0vXihDT0xHUk9VUHxERHxEVHxMSXxPUFRJT05TfFB8VER8VEZPT1R8VEh8VEhFQUR8VFIpJC9pfV0pfSl9LGZ1bmN0aW9uKG4sZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkobil7cmV0dXJuIG51bGwhPW59ZnVuY3Rpb24gdChuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbn1mdW5jdGlvbiBhKG4sZSx0KXt2YXIgaT12b2lkIDAsYT1uJiZuLmxlbmd0aHx8MDtmb3IoaT0wO2k8YTtpKyspZS5jYWxsKHQsbltpXSxpKX1mdW5jdGlvbiByKG4sZSx0KXtmb3IodmFyIGkgaW4gbiluLmhhc093blByb3BlcnR5KGkpJiZlLmNhbGwodCxpLG5baV0pfWZ1bmN0aW9uIG8odCxuKXtyZXR1cm4gdD10fHx7fSxyKG4sZnVuY3Rpb24obixlKXtpKHRbbl0pfHwodFtuXT1lKX0pLHR9ZnVuY3Rpb24gcyhuKXt0cnl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pfWNhdGNoKGkpe3ZhciBlPSh0PVtdLGEobixmdW5jdGlvbihuKXt0LnB1c2gobil9KSx7djp0fSk7aWYoIm9iamVjdCI9PT0odm9pZCAwPT09ZT8idW5kZWZpbmVkIjpwKGUpKSlyZXR1cm4gZS52fXZhciB0fWZ1bmN0aW9uIGMobil7cmV0dXJuIG5bbi5sZW5ndGgtMV19ZnVuY3Rpb24gdShuLGUpe3JldHVybiEoIW58fCJzdGFydFRhZyIhPT1uLnR5cGUmJiJhdG9taWNUYWciIT09bi50eXBlfHwhKCJ0YWdOYW1lImluIG4pfHwhfm4udGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZSkpfWZ1bmN0aW9uIGwobil7cmV0dXJuIHUobiwic2NyaXB0Iil9ZnVuY3Rpb24gZChuKXtyZXR1cm4gdShuLCJzdHlsZSIpfWUuX19lc01vZHVsZT0hMDt2YXIgcD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG59OmZ1bmN0aW9uKG4pe3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZuLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZuIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygbn07ZS5leGlzdHk9aSxlLmlzRnVuY3Rpb249dCxlLmVhY2g9YSxlLmVhY2hLZXk9cixlLmRlZmF1bHRzPW8sZS50b0FycmF5PXMsZS5sYXN0PWMsZS5pc1RhZz11LGUuaXNTY3JpcHQ9bCxlLmlzU3R5bGU9ZH1dKX0pfX0sImNvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZ2V0U291cmNlQnlVcmwuanMiOntzY3JpcHQ6ZnVuY3Rpb24obixlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT10KCJAYWRvYmUvcmVhY3Rvci1sb2FkLXNjcmlwdCIpLGE9dCgiQGFkb2JlL3JlYWN0b3ItcHJvbWlzZSIpLHI9e30sbz17fSxzPWZ1bmN0aW9uKG4pe3JldHVybiBvW25dfHwob1tuXT1pKG4pKSxvW25dfTtfc2F0ZWxsaXRlLl9fcmVnaXN0ZXJTY3JpcHQ9ZnVuY3Rpb24obixlKXtyW25dPWV9LG4uZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcltlXT9hLnJlc29sdmUocltlXSk6bmV3IGEoZnVuY3Rpb24obil7cyhlKS50aGVuKGZ1bmN0aW9uKCl7bihyW2VdKX0sZnVuY3Rpb24oKXtuKCl9KX0pfX19LCJjb3JlL3NyYy9saWIvaGVscGVycy90ZXh0TWF0Y2guanMiOntzY3JpcHQ6ZnVuY3Rpb24obil7InVzZSBzdHJpY3QiO24uZXhwb3J0cz1mdW5jdGlvbihuLGUpe2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIEFyZ3VtZW50OiBQYXR0ZXJuIGlzIG5vdCBwcmVzZW50Iik7cmV0dXJuIG51bGwhPW4mJigic3RyaW5nIj09dHlwZW9mIGU/bj09PWU6ZSBpbnN0YW5jZW9mIFJlZ0V4cCYmZS50ZXN0KG4pKX19fX0saG9zdGVkTGliRmlsZXNCYXNlVXJsOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vZXh0ZW5zaW9ucy9FUDA0NjE3Yjk5ZTA0ODQxYjk5OTE0ODdkMDRjOGRiNDZjLyJ9fSxjb21wYW55OntvcmdJZDoiRUE3NkFERTk1Nzc2RDJFQzdGMDAwMTAxQEFkb2JlT3JnIn0scHJvcGVydHk6e25hbWU6IldpbmRvd3MiLHNldHRpbmdzOntkb21haW5zOlsibWljcm9zb2Z0LmNvbSJdLHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eTohMSxydWxlQ29tcG9uZW50U2VxdWVuY2luZ0VuYWJsZWQ6ITF9fSxydWxlczpbe2lkOiJSTGFmZDJhOTRkNWMxMTQyOGY5NDRjOTMzOTA3ZDI0ZWEyIixuYW1lOiJHbG9iYWwgSlNMTCBSVCBUYWciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy92YWx1ZUNvbXBhcmlzb24uanMiLHNldHRpbmdzOntjb21wYXJpc29uOntvcGVyYXRvcjoiaXNUcnVlIn0sbGVmdE9wZXJhbmQ6IiVKU0xMIFJlZFRpZ2VyJSJ9fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntnbG9iYWw6ITEsc291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkNjMzgxZWExMDRkOWI0ZDg3OGJiYTQyODQ1MTUxOWMzZS1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19LHttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkM2ZGViNWE3NzBjYzg0OGU4YjFlZjM3NjFiMmRmNTRiMi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTGU3MjIxZTRkY2ExNDQ3MmY4MDk0MDQ1YTk4MDQ1MDA5IixuYW1lOiJHbG9iYWwgRmFjZWJvb2siLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1NX1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzk1ZDU5NTRkZWRhMjRhYTc4MGUyYmQ4N2E2ZWFiZjhmLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMMzA2YmM5ZmI3ZDYyNDdlY2E3MzA0MjNjZTNmODBjMjQiLG5hbWU6Ikdsb2JhbCBMaW5rZWRJbiIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDNjliMzEwMDhjNTBlNDQzMThlMDY0ZGYxYmQ5ZGU3Mjgtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkwwMjM4YjhkMDdlMTc0NzM0OWY2MzVkYTRiMGYwODAxNCIsbmFtZToiR2xvYmFsIFR3aXR0ZXIiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzhjOTU3OTg5YzMzZDQ3ZTdhOGJhMThmN2VjOGRkOTM2LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMYWJlNmMwMDE3ZmNjNDZkMThiZGM3ZTM5M2JiODJhNjAiLG5hbWU6Ikdvb2dsZSBDb252ZXJzaW9uIC0gRGV2aWNlcyBPZmZlcnMiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiLyh3aW5kb3dzXFwvZGV2aWNlLW9mZmVycy0uKikiLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkNiOGI0NjFmMjU3ZjI0NWY5YjQ5YTFjNDczZDk3MTQzZi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDY0M2VlNTYwNmQ5YTRjNjFiNjY3YTUxZjg3MmNjZWI1IixuYW1lOiJKU0xMIFZpZGVvIE9uZVBsYXllciIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjYwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDNWY4MTIxMzVlNjRmNDhhZDg1ZWExMDAwMzRiYzYwYTItc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkwwYjZkNDQ1M2Y0ZTM0ZGZiYmJhNGZiYTVmZGZlMDAwMCIsbmFtZToiR29vZ2xlIENvbnZlcnNpb24gLSBEZXZpY2VzIFBEUHMiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiL3dpbmRvd3NcXC9mZWF0dXJlZC1kZXZpY2VzIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDZjIxN2I1MTRlNDUzNDIxYThjNTZmMzdiMjZkMjQ2Nzgtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkwzMWI3ZDhjNWU3YTU0ODI5YWIwNjJjZGE0NWViYmU2NSIsbmFtZToiV2luZG93cyBKU0xMIFRhZ2dpbmciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjozfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhbHVlQ29tcGFyaXNvbi5qcyIsc2V0dGluZ3M6e2NvbXBhcmlzb246e29wZXJhdG9yOiJpc0ZhbHNlIn0sbGVmdE9wZXJhbmQ6IiVKU0xMIFJlZFRpZ2VyJSJ9fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQ2U3NDQ2MDNhNTdkYjQyNzU4MGIyMGRkYjRiOGFlYWEyLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzVjZDA3Njc2Y2JjYTQ3OTQ4OGE3ZjdkNTcxOTAwNzAzLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzA3NjZkMmFlZDcwZDQ0MWJiZjQ2ZjY0ZTRmYTlmN2Q3LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzQzN2I5ZjQxYzYxYjQ0YWI4NGFhMDk4ODZhZjRlZDJmLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX0se21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQ2NkZTljMWM0YjNjYTRjM2ViNDU0YmJmMTI5MjRlN2QyLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMZTcwMzcxMzAzN2E3NDA3MDg5ZjczOTZkOTgyNWMxODciLG5hbWU6Ikdsb2JhbCBEQ00iLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1NX1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiXFwvd2luZG93c1xcLyhtaWNyb3NvZnRcXC1lZGdlfGRldmljZXN8ZmVhdHVyZWQtZGV2aWNlc3x2aWV3LWFsbHxkZXNrdG9wc3x3aW5kb3dzLWxhcHRvcHN8Mi1pbi0xc3xnYW1pbmctcGNzfHdpbmRvd3MtbWl4ZWQtcmVhbGl0eS1kZXZpY2VzfGxlbm92by1vZmZlcnN8cHJvbW90aW9uc3xkby13aGF0LXlvdS1sb3ZlLWJldHRlcnxwYy1vZmZlcnMtLiopIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDNGYzYTQ1ODFmMWNjNDIwZGIwNWYyMDYzMzRmMWY0YjQtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw0NmU0NGU4Y2M3OTE0ZWY1YTFiMGY5NjBmNTExOGYzOCIsbmFtZToiUGFnZSAtIFBjT2ZmZXJzIC0gT0NJRCBvLTIwIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTV9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcL2VuLXVzXFwvd2luZG93c1xcL3BjLW9mZmVycy0iLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkNkZjk1YTRkZmY1NzQ0MmE3YmFhNTYxOTYxNjM2YjMwNi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDU2MmRlOWUwMGI1MDRmYWU4MTFmMjM0MWEyNmJmYWJhIixuYW1lOiJHbG9iYWwgRnJhbWV3b3JrIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjoxfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZTonLy8jIHNvdXJjZVVSTD13ZGdHRnJhbWV3b3JrXG4vKipcbiAqIFdERyBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBBbmFseXRpY3MgdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiA2LjVcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nID09IG51bGwpIHtcbiAgd2luZG93LndkZ3RhZ2dpbmcgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8vdmFyaWFibGVzXG4gICAgdmFyIF9wcml2YXRlID0ge307XG4gICAgdmFyIF9wdWJsaWMgPSB7fTtcbiAgICBfcHJpdmF0ZS5kYXRhID0ge307XG4gICAgX3ByaXZhdGUudGFnc0luZm9MaXN0ID0gW107XG4gICAgX3ByaXZhdGUudGFnc0V4ZWN1dGVkID0gW107XG4gICAgX3ByaXZhdGUuZGVidWdMb2dUb0NvbnNvbGUgPSBmYWxzZTtcbiAgICBfcHJpdmF0ZS5kZWJ1Z0xvZ01zZ3MgPSBbXTtcbiAgICBfcHJpdmF0ZS5zdG9yYWdlU3VwcG9ydCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLndjcENvbnNlbnRSZXN1bHQgPSB7fTtcbiAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tEb25lID0gZmFsc2U7XG4gICAgX3ByaXZhdGUud2NwQ29uc2VudENoZWNraW5nID0gZmFsc2U7XG4gICAgX3ByaXZhdGUud2NwQ2hlY2sgPSAwO1xuICAgIF9wdWJsaWMudXRpbCA9IHt9O1xuICAgIF9wcml2YXRlLnFXY3BDb25zZW50Q2FsbGJhY2sgPSBbXTtcblxuICAgIC8qIFByaXZhdGUgZnVuY3Rpb25zICovXG4gICAgX3ByaXZhdGUuY2hlY2tUYWdUeXBlID0gZnVuY3Rpb24gKGVsZW0sIHRhZ190eXBlKSB7XG4gICAgICBpZiAoZWxlbSA9PSB1bmRlZmluZWQgfHwgZWxlbSA9PSBudWxsIHx8IHRhZ190eXBlID09IHVuZGVmaW5lZCB8fCB0YWdfdHlwZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChfcHVibGljLnV0aWwuaXNqUXVlcnlMb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KGVsZW0pLmlzKHRhZ190eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbGVtLnRhZ05hbWUgPT0gdGFnX3R5cGUudG9VcHBlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX3ByaXZhdGUuaW5pdGlhbGl6ZVdjcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfcHVibGljLnV0aWwuY29uc2VudFJlcXVpcmVkKCkpIHtcbiAgICAgICAgX3ByaXZhdGUud2NwQ29uc2VudFJlc3VsdCA9IHsgUmVxdWlyZWQ6IHRydWUsIEFuYWx5dGljczogZmFsc2UsIFNvY2lhbE1lZGlhOiBmYWxzZSwgQWR2ZXJ0aXNpbmc6IGZhbHNlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL3doZW4gbWV0YSB0YWcgImNvbnNlbnRSZXF1aXJlZCIgaXMgZmFsc2Ugb3IgbWxkY2MgaXMgTVNDQzpOUlxuICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50UmVzdWx0ID0geyBSZXF1aXJlZDogdHJ1ZSwgQW5hbHl0aWNzOiB0cnVlLCBTb2NpYWxNZWRpYTogdHJ1ZSwgQWR2ZXJ0aXNpbmc6IHRydWUgfTtcbiAgICAgICAgX3ByaXZhdGUud2NwQ29uc2VudENoZWNrRG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gZm9yIHJlZCB0aWdlciBjb25zZW50IGRlY2lzaW9uc1xuICAgICAgKiBhd2EuZ2V0Q29uZmlnKCkuY2FsbGJhY2sudXNlckNvbnNlbnREZXRhaWxzQ2FsbGJhY2soKVxuICAgICovXG5cbiAgICAvKlxuICAgICAqIFJ1bnMgYSBsb29wIHRvIGRlY2lkZSBpZiB3Y3AgaXMgYXZhaWxhYmxlXG4gICAgICovXG4gICAgX3ByaXZhdGUuZG9XY3BMb29wVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfcHVibGljLnV0aWwuY29uc2VudFJlcXVpcmVkKCkpIHtcbiAgICAgICAgaWYgKF9wcml2YXRlLndjcENvbnNlbnRDaGVja0RvbmUgPT0gZmFsc2UpIHtcbiAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tpbmcgPSB0cnVlO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm1sZGNjICE9ICJ1bmRlZmluZWQiKSB7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1sZGNjICE9ICJNU0NDOk5SIikge1xuICAgICAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50UmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIFJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIEFuYWx5dGljczogKC9jMT0yL2lnKS50ZXN0KHdpbmRvdy5tbGRjYyksXG4gICAgICAgICAgICAgICAgU29jaWFsTWVkaWE6ICgvYzI9Mi9pZykudGVzdCh3aW5kb3cubWxkY2MpLFxuICAgICAgICAgICAgICAgIEFkdmVydGlzaW5nOiAoL2MzPTIvaWcpLnRlc3Qod2luZG93Lm1sZGNjKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIF9wcml2YXRlLndjcENvbnNlbnRDaGVja2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgLy9wcm9jZXNzaW5nIHdjcCBjYWxsYmFjayBxdWV1ZVxuICAgICAgICAgICAgd2hpbGUgKF9wcml2YXRlLnFXY3BDb25zZW50Q2FsbGJhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlLnFXY3BDb25zZW50Q2FsbGJhY2sucG9wKCkuYXBwbHkodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93LldjcENvbnNlbnQgIT0gInVuZGVmaW5lZCIpIHtcbiAgICAgICAgICAgIFdjcENvbnNlbnQub25Jbml0Q2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50UmVzdWx0ID0gd2luZG93LnNpdGVDb25zZW50ID8gd2luZG93LnNpdGVDb25zZW50LmdldENvbnNlbnQoKSA6IF9wcml2YXRlLndjcENvbnNlbnRSZXN1bHQ7XG4gICAgICAgICAgICAgIF9wcml2YXRlLndjcENvbnNlbnRDaGVja0RvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgLy9wcm9jZXNzaW5nIHdjcCBjYWxsYmFjayBxdWV1ZVxuICAgICAgICAgICAgICB3aGlsZSAoX3ByaXZhdGUucVdjcENvbnNlbnRDYWxsYmFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfcHJpdmF0ZS5xV2NwQ29uc2VudENhbGxiYWNrLnBvcCgpLmFwcGx5KHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKF9wcml2YXRlLndjcENoZWNrIDwgMjApIHtcbiAgICAgICAgICAgIF9wcml2YXRlLndjcENoZWNrKys7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgX3ByaXZhdGUuZG9XY3BMb29wVGltZW91dCgpIH0sIDUwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9wcml2YXRlLndjcENvbnNlbnRSZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgX3ByaXZhdGUud2NwQ29uc2VudENoZWNrRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vcHJvY2Vzc2luZyB3Y3AgY2FsbGJhY2sgcXVldWVcbiAgICAgICAgICAgIHdoaWxlIChfcHJpdmF0ZS5xV2NwQ29uc2VudENhbGxiYWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZS5xV2NwQ29uc2VudENhbGxiYWNrLnBvcCgpLmFwcGx5KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gY29uc2VudCBpcyBub3QgcmVxdWlyZWRcbiAgICAgICAgX3ByaXZhdGUud2NwQ29uc2VudFJlc3VsdCA9IHsgUmVxdWlyZWQ6IHRydWUsIEFuYWx5dGljczogdHJ1ZSwgU29jaWFsTWVkaWE6IHRydWUsIEFkdmVydGlzaW5nOiB0cnVlIH07XG4gICAgICAgIF9wcml2YXRlLndjcENvbnNlbnRDaGVja0RvbmUgPSB0cnVlO1xuICAgICAgICBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyogUHVibGljIGZ1bmN0aW9ucyAqL1xuICAgIC8qXG4gICAgICogQWRkcyBhIFRhZyBpbmZvcm1hdGlvbi4gVG8gYmUgY2FsbGVkIG9uIGVhY2ggdGFnIGxvYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgIE5hbWUgb2YgdGhlIHRhZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB2ZXJzaW9uIFZlcnNpb24gb2YgdGhlIHRhZy4gRm9ybWF0IHl5eXlNTU1kZC12e251bWJlcn0uXG4gICAgICovXG4gICAgX3B1YmxpYy5hZGRUYWdJbmZvID0gZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24pIHtcbiAgICAgIF9wcml2YXRlLnRhZ3NJbmZvTGlzdC5wdXNoKG5hbWUgKyAiOiAiICsgdmVyc2lvbik7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyBsb2FkZWQgdGFncyBpbmZvIGxpc3QuIFxuICAgICAqL1xuICAgIF9wdWJsaWMuZ2V0VGFnc0luZm9MaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9wcml2YXRlLnRhZ3NJbmZvTGlzdDtcbiAgICB9O1xuICAgIC8qIFB1YmxpYyBmdW5jdGlvbnMgKi9cbiAgICAvKlxuICAgICAqIEFkZHMgYSBUYWcgZXhlY3V0ZWQgaW5mb3JtYXRpb24uIFRvIGJlIGNhbGxlZCBvbiBlYWNoIHRhZyBsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgbmFtZSAgICBOYW1lIG9mIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgdmVyc2lvbiBWZXJzaW9uIG9mIHRoZSB0YWcuIEZvcm1hdCB5eXl5TU1NZGQtdntudW1iZXJ9LlxuICAgICAqL1xuICAgIF9wdWJsaWMuYWRkVGFnRXhlY3V0ZWQgPSBmdW5jdGlvbiAobmFtZSwgZXZlbnQpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgIlZpZXciO1xuICAgICAgX3ByaXZhdGUudGFnc0V4ZWN1dGVkLnB1c2goe1xuICAgICAgICAibmFtZSI6IG5hbWUsXG4gICAgICAgICJldmVudCI6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBHZXRzIGxvYWRlZCB0YWdzIGV4ZWN1dGVkIGxpc3QuIFxuICAgICAqL1xuICAgIF9wdWJsaWMuZ2V0VGFnc0V4ZWN1dGVkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS50YWdzRXhlY3V0ZWQ7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogU2V0cyBkYXRhIGxheWVyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgbmFtZSAgIERhdGEgTmFtZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB2YWx1ZSAgRGF0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnNldERhdGEgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgIF9wcml2YXRlLmRhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBHZXRzIGRhdGEgbGF5ZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgRGF0YSBOYW1lLlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fSByZXR1cm5zIGRhdGEgbGF5ZXIgdmFsdWUuXG4gICAgICovXG4gICAgX3B1YmxpYy5nZXREYXRhID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS5kYXRhW25hbWVdO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgYWxsIGRhdGEgbGF5ZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fSByZXR1cm5zIGRhdGEgbGF5ZXIgdmFsdWUuXG4gICAgICovXG4gICAgX3B1YmxpYy5nZXRBbGxEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9wcml2YXRlLmRhdGE7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QdWJsaWMgVXRpbGl0eSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICAgIC8qXG4gICAgICogUmV0dXJucyBib29sZWFuIG9mIGpRdWVyeSBpcyBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmlzalF1ZXJ5TG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICh0eXBlb2YgalF1ZXJ5ID09PSAiZnVuY3Rpb24iKTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUmV0dXJucyBib29sZWFuIG9mIGpRdWVyeSBpcyBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmluc3RhbmNlT2ZqUXVlcnkgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgaWYgKF9wdWJsaWMudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiAoZWxlbSBpbnN0YW5jZW9mIGpRdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgICAvKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZWxlbWVudCBpcyBIVE1MIExpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgICBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuaXNBID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS5jaGVja1RhZ1R5cGUoZWxlbSwgIkEiKTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIEhUTUwgQlVUVE9OLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9ICAgZWxlbSAgICAgRE9NIGVsZW1lbnQuXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmlzQnV0dG9uID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS5jaGVja1RhZ1R5cGUoZWxlbSwgIkJVVFRPTiIpO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgSFRNTCBJTlBVVC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSAgIGVsZW0gICAgIERPTSBlbGVtZW50LlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5pc0lucHV0ID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS5jaGVja1RhZ1R5cGUoZWxlbSwgIklOUFVUIik7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIEdldHMgaWYgdGhlIGVsZW1lbnQgaXMgSFRNTCBJTlBVVC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSAgIGVsZW0gICAgIERPTSBlbGVtZW50LlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5nZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICBpZiAoX3B1YmxpYy51dGlsLmluc3RhbmNlT2ZqUXVlcnkoZWxlbSkpIHtcbiAgICAgICAgZWxlbSA9IGVsZW1bMF07XG4gICAgICB9XG4gICAgICB2YXIgZVR4dDtcbiAgICAgIGlmIChfcHVibGljLnV0aWwuaXNqUXVlcnlMb2FkZWQoKSkge1xuICAgICAgICBlVHh0ID0galF1ZXJ5KGVsZW0pLnRleHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVUeHQgPSBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVUeHQ7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIEdldHMgYXR0cmlidXRlIHZhbHVlIGZyb20gRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgICBET00gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBhdHRyICAgICBBdHRyaWJ1dGUgTmFtZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuZ2V0QXR0ciA9IGZ1bmN0aW9uIChlbGVtLCBhdHRyKSB7XG4gICAgICBpZiAoX3B1YmxpYy51dGlsLmlzalF1ZXJ5TG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGpRdWVyeShlbGVtKS5hdHRyKGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFNldHMgYXR0cmlidXRlIHZhbHVlIHRvIGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgICBET00gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBhdHRyICAgICBBdHRyaWJ1dGUgTmFtZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB2YWwgICAgIEF0dHJpYnV0ZSBWYWx1ZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuc2V0QXR0ciA9IGZ1bmN0aW9uIChlbGVtLCBhdHRyLCB2YWwpIHtcbiAgICAgIGlmIChfcHVibGljLnV0aWwuaXNqUXVlcnlMb2FkZWQoKSkge1xuICAgICAgICBqUXVlcnkoZWxlbSkuYXR0cihhdHRyLCB2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qXG4gICAgICogUGFyc2VzIEpTT04gc3RyaW5nIGludG8gYSBKU09OIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIGpzb25TdHJpbmcgICAgIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5wYXJzZUpTT04gPSBmdW5jdGlvbiAoanNvblN0cmluZykge1xuICAgICAgaWYgKF9wdWJsaWMudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiBqUXVlcnkucGFyc2VKU09OKGpzb25TdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogVHJpZ2dlcnMgY3VzdG9tIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9ICAgZWxlbSAgICAgRE9NIGVsZW1lbnQgb24gd2hpY2ggY3VzdG9tIGV2ZW50IHRyaWdnZXJlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBldmVudE5hbWUgICAgIEN1c3RvbSBldmVudCBOYW1lLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC50cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbiAoZWxlbSwgZXZlbnROYW1lKSB7XG4gICAgICB2YXIgZXZlbnQ7XG4gICAgICBpZiAoZWxlbSA9PSB1bmRlZmluZWQgfHwgZWxlbSA9PSBudWxsKSB7XG4gICAgICAgIGVsZW0gPSBkb2N1bWVudDtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudE5hbWUgPT0gdW5kZWZpbmVkIHx8IGV2ZW50TmFtZSA9PSBudWxsIHx8IHR5cGVvZiBldmVudE5hbWUgIT09ICJzdHJpbmciKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChfcHVibGljLnV0aWwuaXNqUXVlcnlMb2FkZWQoKSkge1xuICAgICAgICBqUXVlcnkoZWxlbSkudHJpZ2dlcihldmVudE5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpO1xuICAgICAgICAgIGV2ZW50LmluaXRFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGV2ZW50LmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgICBlbGVtLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgICAgICAgICBldmVudC5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID0gZXZlbnROYW1lO1xuICAgICAgICAgIGVsZW0uZmlyZUV2ZW50KCJvbiIgKyBldmVudC5ldmVudFR5cGUsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgLypcbiAgICAgKiBMb2FkcyBhIEphdmFTY3JpcHQgZmlsZSBmcm9tIHNwZWNpZmllZCBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB1cmwgICAgIFVSTCBvZiBKYXZhU2NyaXB0IGZpbGUuXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmluc2VydFNjcmlwdCA9IGZ1bmN0aW9uICh1cmwsIGFzeW5jKSB7XG4gICAgICBhc3luYyA9IGFzeW5jIHx8IGZhbHNlO1xuICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcJ3NjcmlwdFwnKTtcbiAgICAgIHNjcmlwdC50eXBlID0gXCd0ZXh0L2phdmFzY3JpcHRcJztcbiAgICAgIHNjcmlwdC5hc3luYyA9IGFzeW5jO1xuICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnaGVhZFwnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIExvYWRzIGEgSmF2YVNjcmlwdCBmaWxlIGZyb20gc3BlY2lmaWVkIFVSTCBhbmQgZXhlY3V0ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBvbiBsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgIHVybCAgICAgICBVUkwgb2YgSmF2YVNjcmlwdCBmaWxlLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259ICBjYWxsYmFjayAgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmluc2VydFNjcmlwdENhbGxiYWNrID0gZnVuY3Rpb24gKHVybCwgY2FsbGJhY2ssIGFzeW5jKSB7XG4gICAgICBhc3luYyA9IGFzeW5jIHx8IGZhbHNlO1xuICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcJ3NjcmlwdFwnKTtcbiAgICAgIHNjcmlwdC50eXBlID0gXCd0ZXh0L2phdmFzY3JpcHRcJztcbiAgICAgIHNjcmlwdC5hc3luYyA9IGFzeW5jO1xuICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgIGlmICh0eXBlb2YgKGNhbGxiYWNrKSA9PT0gImZ1bmN0aW9uIikge1xuICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ2hlYWRcJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBMb2FkcyBhbiBpbWFnZSBmcm9tIHNwZWNpZmljIHNvdXJjZSBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgc3JjICAgICAgIEltYWdlIHNvdXJjZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwucmVxdWVzdEltYWdlID0gZnVuY3Rpb24gKHNyYykge1xuICAgICAgbmV3IEltYWdlKDAsIDApLnNyYyA9IHNyYztcbiAgICB9O1xuICAgIC8qXG4gICAgICogRW5hYmxlIGRlYnVnIHRvIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuZW5hYmxlRGVidWdUb0NvbnNvbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcHJpdmF0ZS5kZWJ1Z0xvZ1RvQ29uc29sZSA9IHRydWU7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIExvZ3MgdGhlIGRlYnVnIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBtc2cgICBsb2cgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuZGVidWdMb2cgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgICBfcHJpdmF0ZS5kZWJ1Z0xvZ01zZ3MucHVzaChtc2cpO1xuICAgICAgaWYgKF9wcml2YXRlLmRlYnVnTG9nTXNncy5sZW5ndGggPiA1MCkge1xuICAgICAgICBfcHJpdmF0ZS5kZWJ1Z0xvZ01zZ3Muc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChfcHJpdmF0ZS5kZWJ1Z0xvZ1RvQ29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgfVxuICAgIH07XG4gICAgLypcbiAgICAgKiBHZXRzIGFsbCBkZWJ1ZyBsb2dzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJldHVybnMgc3RyaW5nIGFycmF5LlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5nZXREZWJ1Z0xvZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3ByaXZhdGUuZGVidWdMb2dNc2dzO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBUcmltIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByZXR1cm5zIHN0cmluZy5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwudHJpbSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICBpZiAoX3B1YmxpYy51dGlsLmlzalF1ZXJ5TG9hZGVkKCkgJiYgalF1ZXJ5LnRyaW0pIHtcbiAgICAgICAgdmFsID0galF1ZXJ5LnRyaW0odmFsKTtcbiAgICAgIH0gZWxzZSBpZiAoU3RyaW5nLnByb3RvdHlwZS50cmltKSB7XG4gICAgICAgIHZhbCA9IHZhbC50cmltKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCBcJ1wnKTtcbiAgICAgIH1cbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC9cXHNcXHMrL2csIFwnIFwnKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyB0cmltbWVkIGFuZCBsb3dlciBjYXNlIHZhbHVlLiBSZXR1cm5zIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSB2YWx1ZSBpcyBudWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgdmFsICAgc3RyaW5nIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIGRlZiAgIGRlZmF1bHQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgc3RyaW5nIHZhbHVlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC50bGNTdHIgPSBmdW5jdGlvbiAodmFsLCBkZWYpIHtcbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHZhbCA9IGRlZiB8fCAiIjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PSAic3RyaW5nIikge1xuICAgICAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PSAib2JqZWN0IiAmJiBfcHVibGljLnV0aWwuaW5zdGFuY2VPZmpRdWVyeShlbGVtKSkge1xuICAgICAgICB2YWwgPSB2YWwudGV4dCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSB2YWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdmFsID0gZGVmIHx8ICIiO1xuICAgICAgfVxuICAgICAgdmFsID0gX3B1YmxpYy51dGlsLnRyaW0odmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIEdldHMgZXNjYXBlICg+KSwgdHJpbW1lZCBhbmQgbG93ZXIgY2FzZSB2YWx1ZS4gUmV0dXJucyBkZWZhdWx0IHZhbHVlIGluIGNhc2UgdmFsdWUgaXMgbnVsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHZhbCAgIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBkZWYgICBkZWZhdWx0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHN0cmluZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuZXRsY1N0ciA9IGZ1bmN0aW9uICh2YWwsIGRlZikge1xuICAgICAgdmFsID0gX3B1YmxpYy51dGlsLnRsY1N0cih2YWwsIGRlZik7XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvXFw+L2lnLCAiIik7XG4gICAgICBpZiAoIXZhbCkge1xuICAgICAgICB2YWwgPSBkZWYgfHwgIiI7XG4gICAgICB9XG4gICAgICB2YWwgPSBfcHVibGljLnV0aWwudHJpbSh2YWwpO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuICAgIC8qXG4gICAqIEV4Y2x1ZGVzIHNlbGVjdG9yIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgIGVsZW0gICBFbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gICBzZWwgICBzZWxlY3Rvci5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIGNvbnRlbnQgdmFsdWUuXG4gICAqL1xuICAgIF9wdWJsaWMudXRpbC5leGNsdWRlU2VsZWN0b3IgPSBmdW5jdGlvbiAoZWxlbSwgc2VsKSB7XG4gICAgICBpZiAoZWxlbSAmJiBzZWwgJiYgd2luZG93LndkZ3RhZ2dpbmcudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiBqUXVlcnkoZWxlbSkuY2xvbmUoKS5maW5kKHNlbCkucmVtb3ZlKCkuZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBHZXRzIG1ldGEgdGFnIGNvbnRlbnQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgbWV0YSB0YWcgbmFtZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyBjb250ZW50IHZhbHVlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5nZXRNZXRhVGFnQ29udGVudCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAoX3B1YmxpYy51dGlsLmlzalF1ZXJ5TG9hZGVkKCkgJiYgbmFtZSkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KCJtZXRhW25hbWU9XCciICsgbmFtZSArICJcJ10iKS5hdHRyKCJjb250ZW50IikgfHwgbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm1ldGFbbmFtZT1cJyIgKyBuYW1lICsgIlwnXSIpKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJtZXRhW25hbWU9XCciICsgbmFtZSArICJcJ10iKS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFNldHMgbWV0YSB0YWcgY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG5hbWUgICAgIG1ldGEgdGFnIG5hbWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgY29udGVudCAgY29udGVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuc2V0TWV0YVRhZyA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZW50KSB7XG4gICAgICBpZiAoIW5hbWUgfHwgIWNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF9wdWJsaWMudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICAgIGlmIChqUXVlcnkoIm1ldGFbbmFtZT1cJyIgKyBuYW1lICsgIlwnXSIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBqUXVlcnkoIm1ldGFbbmFtZT1cJyIgKyBuYW1lICsgIlwnXSIpLmF0dHIoImNvbnRlbnQiLCBjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqUXVlcnkoImhlYWQiKS5hcHBlbmQoIjxtZXRhIG5hbWU9XCciICsgbmFtZSArICJcJyBjb250ZW50PVwnIiArIGNvbnRlbnQgKyAiXCc+Iik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm1ldGFbbmFtZT1cJyIgKyBuYW1lICsgIlwnXSIpKSB7XG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigibWV0YVtuYW1lPVwnIiArIG5hbWUgKyAiXCddIikuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnbWV0YVwnKTtcbiAgICAgICAgICBtZXRhLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIG1ldGEuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCdoZWFkXCcpWzBdLmFwcGVuZENoaWxkKG1ldGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogQ3JlYXRlcyBjb29raWUgd2l0aCBwcm92aWRlZCBuYW1lLCB2YWx1ZSAmIGV4cGlyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgICBOYW1lIG9mIGNvb2tpZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB2YWx1ZSAgICBWYWx1ZSBvZiBjb29raWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9ICAgY29udGVudCAgTm8gb2YgZXhwaXJhdGlvbiBkYXlzLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5jcmVhdGVDb29raWUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGRheXMpIHtcbiAgICAgIHZhciBleHBpcmVzO1xuICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTtcbiAgICAgICAgZXhwaXJlcyA9ICI7IGV4cGlyZXM9IiArIGRhdGUudG9HTVRTdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGlyZXMgPSAiIjtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyB2YWx1ZSArIGV4cGlyZXMgKyAiOyBwYXRoPS8iO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgY29va2llIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgbmFtZSAgIE5hbWUgb2YgY29va2llLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIGNvb2tpZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwucmVhZENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgbmFtZUVRID0gbmFtZSArICI9IjtcbiAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdChcJztcJyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gY2FbaV07XG4gICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PSBcJyBcJylcbiAgICAgICAgICBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xuICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT09IDApXG4gICAgICAgICAgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIERlbGV0ZXMgdGhlIGNvb2tpZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG5hbWUgICAgIE5hbWUgb2YgY29va2llLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5kZWxldGVDb29raWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3B1YmxpYy51dGlsLmNyZWF0ZUNvb2tpZShuYW1lLCAiIiwgLTEpO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgUXVlcnkgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZSBmcm9tIGEgcHJvdmlkZWQgVVJMIG9yIGN1cnJlbnQgcGFnZSBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgTmFtZSBvZiBRdWVyeXN0cmluZyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgdXJsICAgVVJMLiBJZiBub3QgcHJvdmlkZWQsIGN1cnJlbnQgcGFnZSBVUkwgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyBRdWVyeXN0cmluZyBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmdldFF1ZXJ5UGFyYW0gPSBmdW5jdGlvbiAobmFtZSwgdXJsKSB7XG4gICAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5yZXBsYWNlKG5ldyBSZWdFeHAoIl4oPzouKlsmXFxcXD9dIiArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKS5yZXBsYWNlKC9bXFwuXFwrXFwqXS9nLCAiXFxcXCQmIikgKyAiKD86XFxcXD0oW14mXSopKT8pPy4qJCIsICJpIiksICIkMSIpKTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBTZXRzIExvY2Fsc3RvcmFnZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG5hbWUgICAgIE5hbWUgb2YgbG9jYWxzdG9yYWdlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHZhbHVlICAgIFZhbHVlIG9mIGxvY2Fsc3RvcmFnZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuc2V0TG9jYWxTdG9yYWdlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICBpZiAoX3ByaXZhdGUuc3RvcmFnZVN1cHBvcnQgJiYgbmFtZSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyBMb2NhbHN0b3JhZ2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgTmFtZSBvZiBMb2NhbHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgTG9jYWxzdG9yYWdlIHZhbHVlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5yZWFkTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBfcHJpdmF0ZS5zdG9yYWdlU3VwcG9ydCA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpIDogbnVsbDtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBEZWxldGVzIHRoZSBMb2NhbHN0b3JhZ2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgICBOYW1lIG9mIExvY2Fsc3RvcmFnZS5cbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuZGVsZXRlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIGlmIChfcHJpdmF0ZS5zdG9yYWdlU3VwcG9ydCAmJiBuYW1lKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFNldHMgU2Vzc2lvbnN0b3JhZ2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgICBOYW1lIG9mIFNlc3Npb25zdG9yYWdlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHZhbHVlICAgIFZhbHVlIG9mIFNlc3Npb25zdG9yYWdlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5zZXRTZXNzaW9uU3RvcmFnZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKF9wcml2YXRlLnN0b3JhZ2VTdXBwb3J0ICYmIG5hbWUpIHtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyBTZXNzaW9uc3RvcmFnZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG5hbWUgICBOYW1lIG9mIFNlc3Npb25zdG9yYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIFNlc3Npb25zdG9yYWdlIHZhbHVlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5yZWFkU2Vzc2lvblN0b3JhZ2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIF9wcml2YXRlLnN0b3JhZ2VTdXBwb3J0ID8gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShuYW1lKSA6IG51bGw7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogRGVsZXRlcyB0aGUgU2Vzc2lvbnN0b3JhZ2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgICBOYW1lIG9mIFNlc3Npb25zdG9yYWdlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5kZWxldGVTZXNzaW9uU3RvcmFnZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAoX3ByaXZhdGUuc3RvcmFnZVN1cHBvcnQgJiYgbmFtZSkge1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEV4dGVuZHMgSlNPTiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgb2JqMSAgICAgRmlyc3QgT2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG9iajIgICAgIFNlY29uZCBPYmplY3QuXG4gICAgICpcbiAgICAgKiBSZXR1cm4gZmlyc3Qgb2JqZWN0XG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmV4dGVuZE9iaiA9IGZ1bmN0aW9uIChvYmoxLCBvYmoyKSB7XG4gICAgICBpZiAod2luZG93LndkZ3RhZ2dpbmcudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICAgIGpRdWVyeS5leHRlbmQob2JqMSwgb2JqMik7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5hc3NpZ24pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvYmoxLCBvYmoyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7XG4gICAgICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajE7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyBNU0NDIENvbnNlbnQgc3RhdHVzXG4gICAgICpcbiAgICAgKiByZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBfcHVibGljLnV0aWwuaXNNU0NDQ29uc2VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHJldHVybnMgdHJ1ZSBvciBmYWxzZVxuICAgICAgLy8gSWYgbXNjYyBvYmplY3QgaXMgcHJlc2VudCwgcmV0dXJuIG1zY2MuaGFzQ29udGVudCgpIHZhbHVlLlxuICAgICAgLy8gSWYgaW4gYW4gaWZyYW1lIC0gcmV0dXJuIGZhbHNlXG4gICAgICB0cnkge1xuICAgICAgICBpZiAod2luZG93LnNlbGYgIT09IHdpbmRvdy50b3ApIHtcbiAgICAgICAgICByZXR1cm4gIjAiO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vaWYgdGhlcmUgaXMgYW4gZXJyb3IgaXQgd2lsbCBiZSBhIGNyb3NzIGRvbWFpbiBlcnJvciBjYXVzZWQgYnkgYmVpbmcgaW4gYW4gaWZyYW1lXG4gICAgICAgIHJldHVybiAiMCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgKHdpbmRvdy5tc2NjKSAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mICh3aW5kb3cubXNjYy5oYXNDb25zZW50KSA9PT0gImZ1bmN0aW9uIiAmJiAhd2luZG93Lm1zY2MuaGFzQ29uc2VudCgpKSB7XG4gICAgICAgIHJldHVybiAiMCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gIjEiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgQ29uc2VudCByZXF1aXJlZCBzdGF0dXNcbiAgICAgKlxuICAgICAqIHJldHVybnMgdHJ1ZSBvciBmYWxzZVxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5jb25zZW50UmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyByZXR1cm5zIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gZGF0YSB3ZSB3aWxsIGdldCBmcm9tIHRoZSBwYWdlXG4gICAgICAvL2xvZ2ljIHcuci50IENvbnRlbnQgdGVhbSBpbXBsZW1lbnRhdGlvbiBmb3IgY29uc2VudCByZXF1aXJlZFxuICAgICAgaWYgKF9wdWJsaWMudXRpbC5nZXRNZXRhVGFnQ29udGVudCgiY29uc2VudFJlcXVpcmVkIikgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gKF9wdWJsaWMudXRpbC5nZXRNZXRhVGFnQ29udGVudCgiY29uc2VudFJlcXVpcmVkIikudG9Mb3dlckNhc2UoKSA9PSAidHJ1ZSIpXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cubWxkY2MgIT0gInVuZGVmaW5lZCIpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cubWxkY2MgIT0gIk1TQ0M6TlIiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9GYWxsYmFjayBsb2dpYyBmb3IgZGV2IHRlc3RpbmdcbiAgICAgICAgcmV0dXJuIChfcHVibGljLnV0aWwuZ2V0UXVlcnlQYXJhbSgiY29uc2VudCIpID09ICJmYWxzZSIgPyBmYWxzZSA6IHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgd2NwIGNvbnNlbnQgY2hlY2sgZG9uZVxuICAgICAqXG4gICAgICogcmV0dXJucyB0cnVlIG9yIGZhbHNlXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmdldFdjcENvbnNlbnRDaGVja0RvbmUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHJldHVybiBfcHJpdmF0ZS53Y3BDb25zZW50Q2hlY2tEb25lO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgd2NwIGNvbnNlbnQgcmVzdWx0XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IHJldHVybnMgQ29uc2VudCByZXN1bHQgb2JqZWN0LlxuICAgICAqL1xuICAgIF9wdWJsaWMudXRpbC5nZXRXY3BDb25zZW50UmVzdWx0ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICByZXR1cm4gX3ByaXZhdGUud2NwQ29uc2VudFJlc3VsdDtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBJbml0aWF0ZXMgV0NQIGNvbnNlbnQgY2hlY2tcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge29iamVjdH0gcmV0dXJucyBDb25zZW50IHJlc3VsdCBvYmplY3QuXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmRvV2NwQ29uc2VudENoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF9wcml2YXRlLndjcENvbnNlbnRDaGVja2luZyA9PSBmYWxzZSkge1xuICAgICAgICBfcHJpdmF0ZS5kb1djcExvb3BUaW1lb3V0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvKlxuICAgICAqIEFkZCBjYWxsYmFjayBmdW5jdGlvbiBvbiBXQ1AgY29uc2VudCBhdmFpbGFsZVxuICAgICAqXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmFkZFdjcENvbnNlbnRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7XG4gICAgICAgIF9wcml2YXRlLnFXY3BDb25zZW50Q2FsbGJhY2sucHVzaChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcblxuXG4gICAgLypcbiAgICAgKiBHZXRzIFByb2R1Y3QgaW5mb3JtYXRpb24gZnJvbSBET00gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSAgIGVsZW0gICAgIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fSByZXR1cm5zIFByb2R1Y3QgSW5mbyBvYmplY3QuXG4gICAgICovXG4gICAgX3B1YmxpYy51dGlsLmdldFByb2R1Y3RJbmZvID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChfcHVibGljLnV0aWwuaW5zdGFuY2VPZmpRdWVyeShlbGVtKSkge1xuICAgICAgICAgIGVsZW0gPSBlbGVtWzBdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcmlnaW5hbF9lbGVtID0gZWxlbTtcbiAgICAgICAgdmFyIGlzSnF1ZXJ5TG9hZGVkID0gdGhpcy5pc2pRdWVyeUxvYWRlZCgpO1xuICAgICAgICB2YXIgaXNBID0gdGhpcy5pc0EoZWxlbSk7XG4gICAgICAgIHZhciBkYXRhX2pzX2hyZWYgPSB0aGlzLmdldEF0dHIoZWxlbSwgImRhdGEtanMtaHJlZiIpO1xuICAgICAgICBpZiAoIWlzQSAmJiBkYXRhX2pzX2hyZWYgJiYgZGF0YV9qc19ocmVmICE9ICIiKSB7XG4gICAgICAgICAgdmFyIGRhdGFfanNfaHJlZl9lbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQSIpO1xuICAgICAgICAgIGRhdGFfanNfaHJlZl9lbGVtLmhyZWYgPSBkYXRhX2pzX2hyZWY7XG4gICAgICAgICAgZGF0YV9qc19ocmVmX2VsZW0uc2V0QXR0cmlidXRlKCJkYXRhLWpzLWhyZWYtZmxhZyIsICJ0cnVlIik7XG4gICAgICAgICAgZWxlbSA9IGRhdGFfanNfaHJlZl9lbGVtO1xuICAgICAgICAgIGlzQSA9IHRoaXMuaXNBKGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9kdWN0SW5mbyA9IHtcbiAgICAgICAgICAiaWQiOiBudWxsLFxuICAgICAgICAgICJza3UiOiBudWxsLFxuICAgICAgICAgICJuYW1lIjogbnVsbCxcbiAgICAgICAgICAicmV0YWlsZXIiOiBudWxsLFxuICAgICAgICAgICJjdGEiOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHZhciB0bXA7XG4gICAgICAgIGlmIChpc0EpIHtcbiAgICAgICAgICB2YXIgcGF0aG5hbWUgPSBlbGVtLnBhdGhuYW1lO1xuICAgICAgICAgIHZhciBzZWFyY2ggPSBlbGVtLnNlYXJjaDtcbiAgICAgICAgICBpZiAocGF0aG5hbWUubWF0Y2goL29uZXJmXFwvc2lnbmluL2kpKSB7XG4gICAgICAgICAgICB2YXIgdGVtcF9BID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO1xuICAgICAgICAgICAgdGVtcF9BLmhyZWYgPSB0aGlzLmdldFF1ZXJ5UGFyYW0oInJ1Iiwgc2VhcmNoKTtcbiAgICAgICAgICAgIGlmICh0ZW1wX0EpIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWUgPSB0ZW1wX0EucGF0aG5hbWUgfHwgIiI7XG4gICAgICAgICAgICAgIHNlYXJjaCA9IHRlbXBfQS5zZWFyY2ggfHwgIiI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXRobmFtZS5tYXRjaCgvcHJvZHVjdElEL2kpKSB7XG4gICAgICAgICAgICB0bXAgPSBwYXRobmFtZS5zcGxpdCgicHJvZHVjdElEIik7XG4gICAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IHRtcC5sZW5ndGggPiAwID8gdG1wWzFdIDogbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaC5tYXRjaCgvcGlkXFw9L2kpKSB7XG4gICAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IHRoaXMuZ2V0UXVlcnlQYXJhbSgicGlkIiwgc2VhcmNoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLm1hdGNoKC9cXC9zdG9yZVxcLyhifGR8Y29uZmlnfGJ1eXxwfGNvbmZpZ3VyZSlcXC8vaSkpIHtcbiAgICAgICAgICAgIHRtcCA9IHBhdGhuYW1lLnN1YnN0cmluZyhwYXRobmFtZS5pbmRleE9mKCIvc3RvcmUiKSkuc3BsaXQoIi8iKTtcbiAgICAgICAgICAgIHByb2R1Y3RJbmZvLm5hbWUgPSAodG1wLmxlbmd0aCA+PSA0ID8gdG1wWzNdIDogbnVsbCk7XG4gICAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9ICh0bXAubGVuZ3RoID4gNCA/IHRtcFs0XSA6IG51bGwpO1xuICAgICAgICAgICAgcHJvZHVjdEluZm8uc2t1ID0gKHRtcC5sZW5ndGggPiA1ID8gdG1wWzVdIDogbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXRobmFtZS5tYXRjaCgvXFwvKC4uXFwtLi5cXC8pP3BcXC8vaSkpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0VXJsID0gcGF0aG5hbWUuc3BsaXQoXCcvXCcpO1xuICAgICAgICAgICAgaWYgKHBhcnRVcmwubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgICAgcHJvZHVjdEluZm8uaWQgPSAocGFydFVybC5sZW5ndGggPT0gNCA/IHBhdGhuYW1lLnNwbGl0KFwnL1wnKVszXSA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRVcmwubGVuZ3RoID09IDUpIHtcbiAgICAgICAgICAgICAgaWYgKHBhdGhuYW1lLm1hdGNoKC9eXFwvKHB8ZClcXC8vaSkpIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0SW5mby5za3UgPSAocGFydFVybC5sZW5ndGggPT0gNSA/IHBhdGhuYW1lLnNwbGl0KFwnL1wnKVs0XSA6IG51bGwpO1xuICAgICAgICAgICAgICAgIHByb2R1Y3RJbmZvLmlkID0gKHBhcnRVcmwubGVuZ3RoID09IDUgPyBwYXRobmFtZS5zcGxpdChcJy9cJylbM10gOiBudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IChwYXJ0VXJsLmxlbmd0aCA9PSA1ID8gcGF0aG5hbWUuc3BsaXQoXCcvXCcpWzRdIDogbnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJ0VXJsLmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgICAgIHByb2R1Y3RJbmZvLnNrdSA9IChwYXJ0VXJsLmxlbmd0aCA9PSA2ID8gcGF0aG5hbWUuc3BsaXQoXCcvXCcpWzVdIDogbnVsbCk7XG4gICAgICAgICAgICAgIHByb2R1Y3RJbmZvLmlkID0gKHBhcnRVcmwubGVuZ3RoID09IDYgPyBwYXRobmFtZS5zcGxpdChcJy9cJylbNF0gOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLm1hdGNoKC9cXC9zdG9yZVxcL2NvbmZpZ3VyZVxcL3hib3gtZGVzaWduLWxhYi9pZykpIHtcbiAgICAgICAgICAgIHRtcCA9IHBhdGhuYW1lLnN1YnN0cmluZyhwYXRobmFtZS5pbmRleE9mKCIvc3RvcmUiKSkuc3BsaXQoIi8iKTtcbiAgICAgICAgICAgIHByb2R1Y3RJbmZvLmlkID0gdG1wLmxlbmd0aCA+IDQgPyB0bXBbNF0gOiBudWxsO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF0aG5hbWUubWF0Y2goL1xcL3N0b3JlXFwvYnVpbGQvKSkge1xuICAgICAgICAgICAgcHJvZHVjdEluZm8uaWQgPSBwYXRobmFtZS5zcGxpdChcJy9cJylbNV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHByb2R1Y3RJbmZvLnNrdSA9PSBudWxsICYmIHNlYXJjaC5tYXRjaCgvc2lkXFw9L2kpKSB7XG4gICAgICAgICAgICBwcm9kdWN0SW5mby5za3UgPSB0aGlzLmdldFF1ZXJ5UGFyYW0oInNpZCIsIHNlYXJjaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXRobmFtZS5tYXRjaCgvXFwvcFxcLy9pKSkge1xuICAgICAgICAgICAgcHJvZHVjdEluZm8ubmFtZSA9IHBhdGhuYW1lLnNwbGl0KCIvcC8iKVsxXS5zcGxpdCgiLyIpWzBdLnJlcGxhY2UoL1xcLS9nLCAiICIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF0aG5hbWUubWF0Y2goL1xcL2RcXC8vaSkpIHtcbiAgICAgICAgICAgIHByb2R1Y3RJbmZvLm5hbWUgPSBwYXRobmFtZS5zcGxpdCgiL2QvIilbMV0uc3BsaXQoIi8iKVswXS5yZXBsYWNlKC9cXC0vZywgIiAiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJChlbGVtKS5hdHRyKCJkYXRhLWpzLWhyZWYtZmxhZyIpICYmICQoZWxlbSkuYXR0cigiZGF0YS1qcy1ocmVmLWZsYWciKSA9PSAidHJ1ZSIpIHtcbiAgICAgICAgICBlbGVtID0gb3JpZ2luYWxfZWxlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLWJpLW5hbWUiKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLmN0YSA9IF9wdWJsaWMudXRpbC50cmltKHRoaXMuZ2V0QXR0cihlbGVtLCAiZGF0YS1iaS1uYW1lIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldEF0dHIoZWxlbSwgImRhdGEtbSIpKSB7XG4gICAgICAgICAgdmFyIGRhdGFfbSA9IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0pxdWVyeUxvYWRlZCkge1xuICAgICAgICAgICAgICBkYXRhX20gPSBqUXVlcnkucGFyc2VKU09OKHRoaXMuZ2V0QXR0cihlbGVtLCAiZGF0YS1tIikgfHwgInt9Iik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEpTT04gJiYgSlNPTi5wYXJzZSkge1xuICAgICAgICAgICAgICBkYXRhX20gPSBKU09OLnBhcnNlKHRoaXMuZ2V0QXR0cihlbGVtLCAiZGF0YS1tIikgfHwgInt9Iik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfcHVibGljLnV0aWwuZGVidWdMb2coIkVycm9yIGluIGdldFByb2R1Y3RJbmZvIC0gIiArIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhX20pIHtcbiAgICAgICAgICAgIGlmIChwcm9kdWN0SW5mby5pZCA9PSBudWxsICYmIGRhdGFfbS5wcm9kaWQpIHtcbiAgICAgICAgICAgICAgcHJvZHVjdEluZm8uaWQgPSBkYXRhX20ucHJvZGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2R1Y3RJbmZvLnJldGFpbGVyID09IG51bGwgJiYgZGF0YV9tLnBydG5tKSB7XG4gICAgICAgICAgICAgIHByb2R1Y3RJbmZvLnJldGFpbGVyID0gZGF0YV9tLnBydG5tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2R1Y3RJbmZvLmN0YSA9PSBudWxsICYmIGRhdGFfbS5jTikge1xuICAgICAgICAgICAgICBwcm9kdWN0SW5mby5jdGEgPSBfcHVibGljLnV0aWwudHJpbShkYXRhX20uY04pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2R1Y3RJbmZvLmN0YSA9PSBudWxsICYmIGRhdGFfbS5jb250ZW50TmFtZSkge1xuICAgICAgICAgICAgICBwcm9kdWN0SW5mby5jdGEgPSBfcHVibGljLnV0aWwudHJpbShkYXRhX20uY29udGVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBQcm9kdWN0IElkKHUyNSkgKi9cbiAgICAgICAgaWYgKHByb2R1Y3RJbmZvLmlkID09IG51bGwgJiYgdGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLWJpZ2lkIikpIHtcbiAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IHRoaXMuZ2V0QXR0cihlbGVtLCAiZGF0YS1iaWdpZCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9kdWN0SW5mby5pZCA9PSBudWxsICYmIHRoaXMuZ2V0QXR0cihlbGVtLCAiZGF0YS1wcm9kdWN0aWQiKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLmlkID0gdGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLXByb2R1Y3RpZCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9kdWN0SW5mby5pZCA9PSBudWxsICYmIHRoaXMuZ2V0QXR0cihlbGVtLCAicHJvZHVjdGJ1eXhtbGlkIikpIHtcbiAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IHRoaXMuZ2V0QXR0cihlbGVtLCAicHJvZHVjdGJ1eXhtbGlkIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2R1Y3RJbmZvLmlkID09IG51bGwgJiYgdGhpcy5nZXRBdHRyKGVsZW0sICJwcy1za3UiKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLmlkID0gdGhpcy5nZXRBdHRyKGVsZW0sICJwcy1za3UiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZHVjdEluZm8uaWQgPT0gbnVsbCAmJiAodGhpcy5nZXRBdHRyKGVsZW0sICJvbmNsaWNrIikgJiYgLyh4Ym94Q29udGV4dHVhbFN0b3JlfE9wZW5XaXRoRXhwKS9pLnRlc3QodGhpcy5nZXRBdHRyKGVsZW0sICJvbmNsaWNrIikpKSkge1xuICAgICAgICAgIHZhciBzdHJpbmdNYXRjaCA9IHRoaXMuZ2V0QXR0cihlbGVtLCAib25jbGljayIpLm1hdGNoKC8oW1xcd10rKVxcKFtcJyJdPyhbXFx3XSspP1tcJyJdPyw/W1wnIl0/KFtcXHddKyk/W1wnIl0/XFwpLyk7XG4gICAgICAgICAgdmFyIHByb2R1Y3RJZEluZGV4ID0ge1xuICAgICAgICAgICAgIm9wZW4iOiAyLFxuICAgICAgICAgICAgIm9wZW53aXRoZXhwIjogM1xuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIGZ1bmNJbmRleCA9IDE7XG4gICAgICAgICAgaWYgKHN0cmluZ01hdGNoICYmIHN0cmluZ01hdGNoW2Z1bmNJbmRleF0pIHtcbiAgICAgICAgICAgIHZhciBmdW5jTmFtZSA9IHRoaXMudHJpbShzdHJpbmdNYXRjaFtmdW5jSW5kZXhdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgdmFyIHByb2RJZCA9IHN0cmluZ01hdGNoW3Byb2R1Y3RJZEluZGV4W2Z1bmNOYW1lXV07XG4gICAgICAgICAgICBwcm9kdWN0SW5mby5pZCA9IHByb2RJZCA/IHByb2RJZCA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIFByb2R1Y3QgTmFtZSh1MjYpICovXG4gICAgICAgIGlmIChpc0pxdWVyeUxvYWRlZCAmJiBqUXVlcnkoZWxlbSkucGFyZW50cygiLm0tcHJvZHVjdC1wbGFjZW1lbnQtaXRlbSIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgdE5hbWUgPSBqUXVlcnkoZWxlbSkucGFyZW50cygiLm0tcHJvZHVjdC1wbGFjZW1lbnQtaXRlbSIpLmZpbmQoIltpdGVtcHJvcD1cJ25hbWVcJ10iKTtcbiAgICAgICAgICBpZiAodE5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvZHVjdEluZm8ubmFtZSA9IHRoaXMudHJpbSh0TmFtZS50ZXh0KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLW5hbWUiKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLm5hbWUgPSB0aGlzLmdldEF0dHIoZWxlbSwgImRhdGEtbmFtZSIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0pxdWVyeUxvYWRlZCAmJiBqUXVlcnkoZWxlbSkucGFyZW50cygiLnBzLW9ubGluZS1zZWxsZXItc2VsZWN0W2RhdGEtbmFtZV0iKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJvZHVjdEluZm8ubmFtZSA9IGpRdWVyeShlbGVtKS5wYXJlbnRzKCIucHMtb25saW5lLXNlbGxlci1zZWxlY3RbZGF0YS1uYW1lXTpmaXJzdCIpLmF0dHIoImRhdGEtbmFtZSIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUmV0YWlsZXIgTmFtZSh1NTYpICovXG4gICAgICAgIGlmICh0aGlzLmdldEF0dHIoZWxlbSwgImRhdGEtYmktcHJ0bm0iKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLnJldGFpbGVyID0gdGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLWJpLXBydG5tIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcm9kdWN0SW5mby5yZXRhaWxlciA9PSBudWxsIHx8IHByb2R1Y3RJbmZvLnJldGFpbGVyID09ICIiKSAmJiAodGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLXJldGFpbGVyIikgJiYgdGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLXJldGFpbGVyIikgIT09ICIiKSkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLnJldGFpbGVyID0gdGhpcy5nZXRBdHRyKGVsZW0sICJkYXRhLXJldGFpbGVyIikgfHwgIiI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcm9kdWN0SW5mby5yZXRhaWxlciA9PSBudWxsIHx8IHByb2R1Y3RJbmZvLnJldGFpbGVyID09ICIiKSAmJiBpc0pxdWVyeUxvYWRlZCAmJiBqUXVlcnkoZWxlbSkucGFyZW50cygiW2RhdGEtcmV0YWlsZXJdW2RhdGEtcmV0YWlsZXIhPVwnXCddIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByb2R1Y3RJbmZvLnJldGFpbGVyID0galF1ZXJ5KGVsZW0pLnBhcmVudHMoIltkYXRhLXJldGFpbGVyXTpmaXJzdCIpLmF0dHIoImRhdGEtcmV0YWlsZXIiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvZHVjdEluZm87XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX3B1YmxpYy51dGlsLmRlYnVnTG9nKCJFcnJvciBpbiBnZXRQcm9kdWN0SW5mbyAtICIgKyBlcnIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHVibGljLnV0aWwudHJhY2tUYXJnZXRBbmFseXRpY3MgPSBmdW5jdGlvbiAodG50UmVzKSB7XG4gICAgICBpZiAodG50UmVzKSB7XG4gICAgICAgIHZhciB0bnRSZXNwb25zZSA9IHRudFJlcztcbiAgICAgICAgdmFyIGF0Q29udGVudFVwZGF0ZVJUO1xuICAgICAgICAvL0NvbnRlbnRVcGRhdGUgRXZlbnQgd2l0aCBUTlRBXG4gICAgICAgIHZhciBhdENvbnRlbnRVcGRhdGUgPSB7XG4gICAgICAgICAgYWN0aW9uVHlwZTogIkEiLFxuICAgICAgICAgIGJlaGF2aW9yOiAiMTIiLFxuICAgICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgICBwYWdlVGFnczoge1xuICAgICAgICAgICAgdG50YTogKHRudFJlc3BvbnNlLmFuYWx5dGljc0RldGFpbHMgJiYgdG50UmVzcG9uc2UuYW5hbHl0aWNzRGV0YWlsc1swXSAmJiB0bnRSZXNwb25zZS5hbmFseXRpY3NEZXRhaWxzWzBdLnBheWxvYWQgPyB0bnRSZXNwb25zZS5hbmFseXRpY3NEZXRhaWxzWzBdLnBheWxvYWQudG50YSA6IFwnXCcpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgRmlyZUpzbGxDYWxscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3ZGd0YWdnaW5nLmpzbGwucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVGcm9tQXJyYXkoYXRDb250ZW50VXBkYXRlKTtcbiAgICAgICAgICBpZiAodG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgdHRfYWN0aXZpdHlDb3VudCA9IHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zLmxlbmd0aDtcbiAgICAgICAgICAgIC8vQ29udGVudFVwZGF0ZSBFdmVudCB3aXRoIFRhcmdldCBGcmllbmRseSBuYW1lc1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0dF9hY3Rpdml0eUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgLy9KU0xMIENvbnRlbnQgVXBkYXRlXG4gICAgICAgICAgICAgIC8vYXdhLmN0LmNhcHR1cmVDb250ZW50VXBkYXRlKFxuICAgICAgICAgICAgICBhdENvbnRlbnRVcGRhdGVSVCA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiAiQSIsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6ICIxMiIsXG4gICAgICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICAgICAgICAgIHBhZ2VUYWdzOiB7XG4gICAgICAgICAgICAgICAgICBhdF9hY3Rpdml0eV9uYW1lOiAodG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnNbaV0gPyB0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXVsiYWN0aXZpdHkubmFtZSJdIDogXCdcJyksIC8vZnJpZW5kbHkgbmFtZSB0YXJnZXQgYWN0aXZpdHlcbiAgICAgICAgICAgICAgICAgIGF0X2V4cF9uYW1lOiAodG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnNbaV0gPyB0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXVsiZXhwZXJpZW5jZS5uYW1lIl0gOiBcJ1wnKSwgLy8gZnJpZW5kbHkgbmFtZSB0YXJnZXQgZXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgYXRfYWN0aXZpdHlfaWQ6ICh0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXSA/IHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldWyJhY3Rpdml0eS5pZCJdIDogXCdcJyksXG4gICAgICAgICAgICAgICAgICBhdF9leHBfaWQ6ICh0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXSA/IHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldWyJleHBlcmllbmNlLmlkIl0gOiBcJ1wnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3ZGd0YWdnaW5nLmpzbGwucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVGcm9tQXJyYXkoYXRDb250ZW50VXBkYXRlUlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYXdhID09PSBcJ29iamVjdFwnKSB7XG4gICAgICAgICAgRmlyZUpzbGxDYWxscygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJhd2FSZWFkeSIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIEZpcmVKc2xsQ2FsbHMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBGaXJlT0RTQ2FsbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2RndGFnZ2luZy5vbmVkcy5wcm9jZXNzQ3VzdG9tQ29udGVudFVwZGF0ZUZyb21BcnJheShhdENvbnRlbnRVcGRhdGUpO1xuICAgICAgICAgIGlmICh0bnRSZXNwb25zZS5yZXNwb25zZVRva2VucyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciB0dF9hY3Rpdml0eUNvdW50ID0gdG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnMubGVuZ3RoO1xuICAgICAgICAgICAgLy9Db250ZW50VXBkYXRlIEV2ZW50IHdpdGggVGFyZ2V0IEZyaWVuZGx5IG5hbWVzXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR0X2FjdGl2aXR5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAvL0pTTEwgQ29udGVudCBVcGRhdGVcbiAgICAgICAgICAgICAgLy9hd2EuY3QuY2FwdHVyZUNvbnRlbnRVcGRhdGUoXG4gICAgICAgICAgICAgIGF0Q29udGVudFVwZGF0ZVJUID0ge1xuICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6ICJBIixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjogIjEyIixcbiAgICAgICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgICAgICAgICAgcGFnZVRhZ3M6IHtcbiAgICAgICAgICAgICAgICAgIGF0X2FjdGl2aXR5X25hbWU6ICh0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXSA/IHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldWyJhY3Rpdml0eS5uYW1lIl0gOiBcJ1wnKSwgLy9mcmllbmRseSBuYW1lIHRhcmdldCBhY3Rpdml0eVxuICAgICAgICAgICAgICAgICAgYXRfZXhwX25hbWU6ICh0bnRSZXNwb25zZS5yZXNwb25zZVRva2Vuc1tpXSA/IHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldWyJleHBlcmllbmNlLm5hbWUiXSA6IFwnXCcpLCAvLyBmcmllbmRseSBuYW1lIHRhcmdldCBleHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBhdF9hY3Rpdml0eV9pZDogKHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldID8gdG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnNbaV1bImFjdGl2aXR5LmlkIl0gOiBcJ1wnKSxcbiAgICAgICAgICAgICAgICAgIGF0X2V4cF9pZDogKHRudFJlc3BvbnNlLnJlc3BvbnNlVG9rZW5zW2ldID8gdG50UmVzcG9uc2UucmVzcG9uc2VUb2tlbnNbaV1bImV4cGVyaWVuY2UuaWQiXSA6IFwnXCcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdkZ3RhZ2dpbmcub25lZHMucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVGcm9tQXJyYXkoYXRDb250ZW50VXBkYXRlUlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cub2RzID09PSBcJ29iamVjdFwnKSB7XG4gICAgICAgICAgRmlyZU9EU0NhbGxzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgJChkb2N1bWVudCkub24oIm9kc1JlYWR5IiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgRmlyZU9EU0NhbGxzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vSW5pdGlsaXphdGlvblxuICAgIF9wcml2YXRlLnN0b3JhZ2VTdXBwb3J0ID0gKHR5cGVvZiAoU3RvcmFnZSkgIT09ICJ1bmRlZmluZWQiKTtcbiAgICBfcHJpdmF0ZS5pbml0aWFsaXplV2NwKCk7XG5cbiAgICBpZiAoIV9wdWJsaWMudXRpbC5pc2pRdWVyeUxvYWRlZCgpKSB7XG4gICAgICBfcHVibGljLnV0aWwuZGVidWdMb2coInRhZ2dpbmdfY29yZTogalF1ZXJ5IG5vdCBsb2FkZWQiKTtcbiAgICB9XG4gICAgX3B1YmxpYy5hZGRUYWdJbmZvKCJXREdUYWdnaW5nIiwgIjIwMThtYXkxMS12MS4xIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSgpKTtcbn1cblxuLyoqXG4gKiBNTFNEIFBJOiBDb29raWUgSW5zaWdodHMgVHJhY2tpbmcuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHNpbmNlICAgMDQtMTAtMjAyMVxuICogQHZlcnNpb24gMS4xXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPT0gbnVsbCkge1xuICAoZnVuY3Rpb24gKHdkZywgdHUsICQpIHtcbiAgICB2YXIgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiIjtcbiAgICB3aW5kb3cud2RndGFnZ2luZy5nZXRDb29raWVTdGF0dXNJbnNpZ2h0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBNU0NDQ29va2llVmFsdWUgPSB0dS5yZWFkQ29va2llKCJNU0NDIik7XG4gICAgICBpZiAodHUuZ2V0TWV0YVRhZ0NvbnRlbnQoImNvbnNlbnRSZXF1aXJlZCIpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR1LmdldE1ldGFUYWdDb250ZW50KCJjb25zZW50UmVxdWlyZWQiKS50b0xvd2VyQ2FzZSgpID09ICJmYWxzZSIpIHtcbiAgICAgICAgICBDb29raWVTdGF0dXNJbnNpZ2h0cyA9IChNU0NDQ29va2llVmFsdWUgIT0gbnVsbCAmJiBNU0NDQ29va2llVmFsdWUubWF0Y2goL2MxPTItYzI9Mi1jMz0yL2lnKSAhPSBudWxsICYmIE1TQ0NDb29raWVWYWx1ZS5tYXRjaCgvYzE9Mi1jMj0yLWMzPTIvaWcpLmxlbmd0aCA+PSAxKSA/ICJhbmx5dGNzLEFjY2VwdDtzb2NpYWwsQWNjZXB0O2FkdmVydCxBY2NlcHQiIDogIk1TQ0M6TlIiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR1LmdldE1ldGFUYWdDb250ZW50KCJjb25zZW50UmVxdWlyZWQiKS50b0xvd2VyQ2FzZSgpID09ICJ0cnVlIikge1xuICAgICAgICAgIGlmIChNU0NDQ29va2llVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiYW5seXRjcyxJZ25yZDtzb2NpYWwsSWducmQ7YWR2ZXJ0LElnbnJkIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoTVNDQ0Nvb2tpZVZhbHVlLm1hdGNoKC9jaWQvaWcpICE9IG51bGwgJiYgTVNDQ0Nvb2tpZVZhbHVlLm1hdGNoKC9jaWQvaWcpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICB2YXIgTVNDQ0Nvb2tpZVNwbGl0ID0gTVNDQ0Nvb2tpZVZhbHVlLnNwbGl0KCItIik7XG4gICAgICAgICAgICB2YXIgY1ZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgdmFyIGNvbnZlcnRWYWwgPSB7IDA6ICJJZ25yZCIsIDE6ICJSZWplY3QiLCAyOiAiQWNjZXB0IiB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTVNDQ0Nvb2tpZVNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBjVmFsID0gTVNDQ0Nvb2tpZVNwbGl0W2ldLnNwbGl0KCI9Iik7XG4gICAgICAgICAgICAgIGNWYWx1ZXNbY1ZhbFswXV0gPSBjb252ZXJ0VmFsW2NWYWxbMV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiYW5seXRjcywiICsgY1ZhbHVlc1tcJ2MxXCddICsgIjtzb2NpYWwsIiArIGNWYWx1ZXNbXCdjMlwnXSArICI7YWR2ZXJ0LCIgKyBjVmFsdWVzW1wnYzNcJ107XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiQ1ZhbHVlcyBOb3QgUHJlc2VudCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93Lm1sZGNjICE9ICJ1bmRlZmluZWQiKSB7XG4gICAgICAgIGlmICh3aW5kb3cubWxkY2MgPT0gIk1TQ0M6TlIiKSB7XG4gICAgICAgICAgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiTVNDQzpOUiI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2luZG93Lm1sZGNjLm1hdGNoKC9NU0NDOmMxL2lnKSAhPSBudWxsICYmIHdpbmRvdy5tbGRjYy5tYXRjaCgvTVNDQzpjMS9pZykubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICB2YXIgTVNDQ0Nvb2tpZVNwbGl0ID0gd2luZG93Lm1sZGNjLnNwbGl0KCI6IilbMV0uc3BsaXQoIi0iKTtcbiAgICAgICAgICB2YXIgY1ZhbHVlcyA9IHt9O1xuICAgICAgICAgIHZhciBjb252ZXJ0VmFsID0geyAwOiAiSWducmQiLCAxOiAiUmVqZWN0IiwgMjogIkFjY2VwdCIgfVxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNU0NDQ29va2llU3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjVmFsID0gTVNDQ0Nvb2tpZVNwbGl0W2ldLnNwbGl0KCI9Iik7XG4gICAgICAgICAgICBjVmFsdWVzW2NWYWxbMF1dID0gY29udmVydFZhbFtjVmFsWzFdXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgQ29va2llU3RhdHVzSW5zaWdodHMgPSAiYW5seXRjcywiICsgY1ZhbHVlc1tcJ2MxXCddICsgIjtzb2NpYWwsIiArIGNWYWx1ZXNbXCdjMlwnXSArICI7YWR2ZXJ0LCIgKyBjVmFsdWVzW1wnYzNcJ107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy9BZGRlZCBmb3IgdGVzdGluZ1xuICAgICAgICAgIENvb2tpZVN0YXR1c0luc2lnaHRzID0gIkNWYWx1ZXMgTm90IFByZXNlbnQiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy9BZGRlZCBmb3IgdGVzdGluZ1xuICAgICAgICBDb29raWVTdGF0dXNJbnNpZ2h0cyA9ICJDVmFsdWVzIE5vdCBQcmVzZW50IjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb29raWVTdGF0dXNJbnNpZ2h0cztcbiAgICB9XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsLCB3aW5kb3cualF1ZXJ5KTtcbn1cblxuLyoqXG4gKiBXREcgSlNMTCBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBKU0xMIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuIEpTTEwgdmVyc2lvbiA0LngueC5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAc2luY2UgICAwNC0zMC0yMDE4XG4gKiBAdmVyc2lvbiAxLjFcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgSlNMTCBmcmFtZXdvcmtcbiAgICovXG4gIHdpbmRvdy53ZGd0YWdnaW5nLmpzbGwgPSAoZnVuY3Rpb24gKHdkZywgdHUsIHRkKSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL2F6NzI1MTc1LnZvLm1zZWNuZC5uZXQvc2NyaXB0cy9qc2xsLSI7XG4gICAgX3ByaXZhdGUuYmFzZVZlcnNpb24gPSAiNCI7XG4gICAgX3ByaXZhdGUuSlNMTFJlYWR5ID0gZmFsc2U7XG4gICAgX3ByaXZhdGUuSlNMTExvYWRlZCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLnFDdXN0b21FdmVudHMgPSBbXTtcbiAgICBfcHJpdmF0ZS5xQ3VzdG9tVXBkYXRlcyA9IFtdO1xuICAgIF9wcml2YXRlLnFDdXN0b21FdmVudHNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICBfcHJpdmF0ZS5xQ3VzdG9tVXBkYXRlc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLnByZVBhZ2VWaWV3ID0gbnVsbDtcbiAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXcgPSBudWxsO1xuICAgIF9wcml2YXRlLmluaXRDb3VudGVyID0gMDtcbiAgICBfcHJpdmF0ZS5qY29uZmlnID0ge1xuICAgICAgYXV0b0NhcHR1cmU6IHtcbiAgICAgICAgc2Nyb2xsOiAidHJ1ZSIsXG4gICAgICAgIGxpbmVhZ2U6ICJ0cnVlIlxuICAgICAgfSxcbiAgICAgIGNvcmVEYXRhOiB7XG4gICAgICAgIGFwcElkOiAiTk9UIixcbiAgICAgICAgcmVxdWVzdFVyaTogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIH0sXG4gICAgICBjYWxsYmFjazoge31cbiAgICB9O1xuICAgIF9wcml2YXRlLnRhZ05hbWUgPSAiSlNMTCI7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIEV4ZWN1dGVzIGEgQ2FsbGJhY2sgZnVuY3Rpb24gYmVmb3JlIEpTTEwgcGFnZSB2aWV3XG4gICAgICovXG4gICAgX3ByaXZhdGUucHJlUGFnZVZpZXdDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0eXBlb2YgX3ByaXZhdGUucHJlUGFnZVZpZXcgPT09ICJmdW5jdGlvbiIpIHtcbiAgICAgICAgX3ByaXZhdGUucHJlUGFnZVZpZXcoX3ByaXZhdGUuamNvbmZpZyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogRXhlY3V0ZXMgYSBDYWxsYmFjayBmdW5jdGlvbiBhZnRlciBKU0xMIHBhZ2Ugdmlld1xuICAgICAqL1xuICAgIF9wcml2YXRlLnBvc3RQYWdlVmlld0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHR5cGVvZiBfcHJpdmF0ZS5wb3N0UGFnZVZpZXcgPT09ICJmdW5jdGlvbiIpIHtcbiAgICAgICAgX3ByaXZhdGUucG9zdFBhZ2VWaWV3KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZXMgYW5kIHNlbmRzIEpTTEwgcGFnZSB2aWV3IGNhbGxcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5kb0luaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcHJpdmF0ZS5wcmVQYWdlVmlld0NhbGxiYWNrKCk7XG4gICAgICB2YXIgd2NwUmVzdWx0ID0gdHUuZ2V0V2NwQ29uc2VudFJlc3VsdCgpO1xuICAgICAgX3ByaXZhdGUuamNvbmZpZy5zeW5jTXVpZCA9ICh3Y3BSZXN1bHQgIT0gbnVsbCkgPyAod2NwUmVzdWx0LkFuYWx5dGljcyAmJiB3Y3BSZXN1bHQuU29jaWFsTWVkaWEgJiYgd2NwUmVzdWx0LkFkdmVydGlzaW5nKSA6IGZhbHNlO1xuICAgICAgX3ByaXZhdGUuamNvbmZpZy5jYWxsYmFjay51c2VyQ29uc2VudERldGFpbHNDYWxsYmFjayA9ICh3Y3BSZXN1bHQgIT0gbnVsbCkgPyBmdW5jdGlvbiAoKSB7IHJldHVybiB0dS5nZXRXY3BDb25zZW50UmVzdWx0KCk7IH0gOiBudWxsO1xuICAgICAgd2luZG93LmF3YS5pbml0KF9wcml2YXRlLmpjb25maWcpO1xuICAgICAgdHUudHJpZ2dlckV2ZW50KGRvY3VtZW50LCAiYXdhUmVhZHkiKTtcbiAgICAgIF9wcml2YXRlLkpTTExSZWFkeSA9IHRydWU7XG4gICAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXdDYWxsYmFjaygpO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9wcml2YXRlLnByb2Nlc3NDdXN0b21FdmVudFF1ZXVlKCk7XG4gICAgICAgIF9wcml2YXRlLnByb2Nlc3NDdXN0b21Db250ZW50VXBkYXRlUXVldWUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEluaXRpYWxpemVzIEpTTEwgb24gV0NQIGNvbnNlbnQgXG4gICAgICovXG4gICAgX3B1YmxpYy53Y3BJbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHdpbmRvdy5hd2EpIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuYXdhLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBpZiAodHUuZ2V0V2NwQ29uc2VudENoZWNrRG9uZSgpID09IHRydWUpIHtcbiAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHUuZGVidWdMb2coIkpTTEwgTGlicmFyeSBub3QgbG9hZGVkIik7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFByZXBzIHRvIGluaXRpYWxpemUgYW5kIHNlbmQgSlNMTCBwYWdlIHZpZXcgY2FsbFxuICAgICAqL1xuICAgIF9wcml2YXRlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAod2luZG93LmF3YSkge1xuICAgICAgICBpZiAoIXdpbmRvdy5hd2EuaXNJbml0aWFsaXplZCkge1xuICAgICAgICAgIGlmICghdHUuY29uc2VudFJlcXVpcmVkKCkpIHtcbiAgICAgICAgICAgIC8vaW5pdCBub3dcbiAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHUuZ2V0V2NwQ29uc2VudENoZWNrRG9uZSgpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHR1LmRvV2NwQ29uc2VudENoZWNrKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR1LmdldFdjcENvbnNlbnRDaGVja0RvbmUoKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHUuYWRkV2NwQ29uc2VudENhbGxiYWNrKF9wdWJsaWMud2NwSW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0dS5kZWJ1Z0xvZygiSlNMTCBMaWJyYXJ5IG5vdCBsb2FkZWQiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBQcm9jZXNzZXMgQ3VzdG9tIEpTTEwgZXZlbnQgcXVldWVcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5wcm9jZXNzQ3VzdG9tRXZlbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpID0gX3ByaXZhdGUucUN1c3RvbUV2ZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUV2ZW50RnJvbUFycmF5KF9wcml2YXRlLnFDdXN0b21FdmVudHNbaV0pO1xuICAgICAgfVxuICAgICAgX3ByaXZhdGUucUN1c3RvbUV2ZW50c1Byb2Nlc3NlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogUHJvY2Vzc2VzIEN1c3RvbSBKU0xMIHVwZGF0ZXMgcXVldWVcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5wcm9jZXNzQ3VzdG9tQ29udGVudFVwZGF0ZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGkgPSBfcHJpdmF0ZS5xQ3VzdG9tVXBkYXRlcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVGcm9tQXJyYXkoX3ByaXZhdGUucUN1c3RvbVVwZGF0ZXNbaV0pO1xuICAgICAgfVxuICAgICAgX3ByaXZhdGUucUN1c3RvbVVwZGF0ZXNQcm9jZXNzZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBFeGVjdXRlcyBpbml0IHNldFRpbWVvdXQgaW4gY2FzZSBKU0xMIGlzIGxvYWRpbmdcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5pbml0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfcHJpdmF0ZS5pbml0Q291bnRlciA8IDYxKSB7XG4gICAgICAgIF9wcml2YXRlLmluaXRDb3VudGVyKys7XG4gICAgICAgIGlmICh0eXBlb2YgYXdhICE9PSAidW5kZWZpbmVkIikge1xuICAgICAgICAgIF9wcml2YXRlLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KF9wcml2YXRlLmluaXRUaW1lb3V0LCA1MDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVB1YmxpYyBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICBcbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gSlNMTCBldmVudCBmcm9tIGFycmF5IG9yIGFkZHMgaXQgdG8gcXVldWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIGluQXJyYXkgICAgSlNTTCBldmVudCBhcnJheS5cbiAgICAgKi9cbiAgICBfcHVibGljLnByb2Nlc3NDdXN0b21FdmVudEZyb21BcnJheSA9IGZ1bmN0aW9uIChpbkFycmF5KSB7XG4gICAgICBpZiAodHlwZW9mIGluQXJyYXkgPT0gInVuZGVmaW5lZCIgfHwgaW5BcnJheSA9PT0gbnVsbCB8fCBpbkFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0dS5kZWJ1Z0xvZygicHJvY2Vzc0N1c3RvbUV2ZW50RnJvbUFycmF5IGNhbGxlZCB3aXRoIG5vIGluQXJyYXkiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF9wcml2YXRlLkpTTExSZWFkeSAmJiB3aW5kb3cuYXdhICYmIHdpbmRvdy5hd2EuaXNJbml0aWFsaXplZCkge1xuICAgICAgICBhd2EuY3QuY2FwdHVyZUNvbnRlbnRQYWdlQWN0aW9uKGluQXJyYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3ByaXZhdGUucUN1c3RvbUV2ZW50cy5wdXNoKGluQXJyYXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gSlNMTCB1cGRhdGUgZnJvbSBhcnJheSBvciBhZGRzIGl0IHRvIHF1ZXVlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBpbkFycmF5ICAgIEpTU0wgVXBkYXRlIGFycmF5LlxuICAgICAqL1xuICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVGcm9tQXJyYXkgPSBmdW5jdGlvbiAoaW5BcnJheSkge1xuICAgICAgaWYgKHR5cGVvZiBpbkFycmF5ID09ICJ1bmRlZmluZWQiIHx8IGluQXJyYXkgPT09IG51bGwgfHwgaW5BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdHUuZGVidWdMb2coInByb2Nlc3NDdXN0b21FdmVudEZyb21BcnJheSBjYWxsZWQgd2l0aCBubyBpbkFycmF5Iik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF9wcml2YXRlLkpTTExSZWFkeSAmJiB3aW5kb3cuYXdhICYmIHdpbmRvdy5hd2EuaXNJbml0aWFsaXplZCkge1xuICAgICAgICBhd2EuY3QuY2FwdHVyZUNvbnRlbnRVcGRhdGUoaW5BcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcHJpdmF0ZS5xQ3VzdG9tVXBkYXRlcy5wdXNoKGluQXJyYXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gSlNMTCBldmVudCBxdWV1ZVxuICAgICAqL1xuICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUV2ZW50UXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcHJpdmF0ZS5wcm9jZXNzQ3VzdG9tRXZlbnRRdWV1ZSgpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gSlNMTCB1cGRhdGVzIHF1ZXVlXG4gICAgICovXG4gICAgX3B1YmxpYy5wcm9jZXNzQ3VzdG9tQ29udGVudFVwZGF0ZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3ByaXZhdGUucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVRdWV1ZSgpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEdldHMgSlNMTCByZWFkeW5lc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm5zIEpTTEwgcmVhZHluZXNzLlxuICAgICAqL1xuICAgIF9wdWJsaWMuSXNKU0xMUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3ByaXZhdGUuSlNMTFJlYWR5O1xuICAgIH07XG4gICAgLypcbiAgICAgKiBMb2FkcyBKU0xMIEJhc2UgdGFnIGFuZCBzZW5kcyBhIHBhZ2Ugdmlld1xuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9ICAgY29uZmlnICAgICAgICAgICBKU0xMIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBFeGFtcGxlIGFzIGJlbG93XG4gICAgICAgICAge1xuICAgICAgICAgICAgImFwcElkIjoiU09NRSBJRCIsIC0gSlNMTCBBcHAgSURcbiAgICAgICAgICAgICJwcmVQYWdlVmlldyI6ZnVuY3Rpb24oKXsgLy9zb21lY29kZSB9LCAtIGNhbGxiYWNrIGZ1bmN0aW9uIHByZSBwYWdlIHZpZXdcbiAgICAgICAgICAgICJwb3N0UGFnZVZpZXciOmZ1bmN0aW9uKCl7IC8vc29tZWNvZGUgfSwgIC0gY2FsbGJhY2sgZnVuY3Rpb24gcG9zdCBwYWdlIHZpZXdcbiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjQiIC0gSlNMTCBsaWJyYXJ5IFZlcnNpb24sXG4gICAgICAgICAgICAiY29yZURhdGEiOnsgfSAtIE92ZXJyaWRlIGNvcmVkYXRhIHZhbHVlc1xuICAgICAgICAgIH1cbiAgICAgKi9cbiAgICBfcHVibGljLmxvYWQgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBfcHJpdmF0ZS5pbml0Q291bnRlciA9IDA7XG4gICAgICBpZiAoY29uZmlnID09IHVuZGVmaW5lZCB8fCBjb25maWcgPT0gbnVsbCkge1xuICAgICAgICB0dS5kZWJ1Z0xvZygiSlNMTCBjb25maWd1cmF0aW9uIG1pc3NpbmciKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGxvYWQgPSAoY29uZmlnLmxvYWQgPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5sb2FkID09IG51bGwpIHx8IGNvbmZpZy5sb2FkO1xuICAgICAgdmFyIGluaXQgPSAoY29uZmlnLmluaXQgPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5pbml0ID09IG51bGwpIHx8IGNvbmZpZy5pbml0O1xuICAgICAgdmFyIGFzeW5jID0gKGNvbmZpZy5hc3luYyA9PSB1bmRlZmluZWQgfHwgY29uZmlnLmFzeW5jID09IG51bGwpIHx8IGNvbmZpZy5hc3luYztcbiAgICAgIGlmIChpbml0KSB7XG4gICAgICAgIGlmIChjb25maWcuYXBwSWQgPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5hcHBJZCA9PSBudWxsKSB7XG4gICAgICAgICAgdHUuZGVidWdMb2coIkpTTEwgQXBwIElEIG1pc3NpbmciKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3ByaXZhdGUuamNvbmZpZy5jb3JlRGF0YS5hcHBJZCA9IGNvbmZpZy5hcHBJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByZVBhZ2VWaWV3ICE9IHVuZGVmaW5lZCAmJiBjb25maWcucHJlUGFnZVZpZXcgIT0gbnVsbCkge1xuICAgICAgICAgIF9wcml2YXRlLnByZVBhZ2VWaWV3ID0gY29uZmlnLnByZVBhZ2VWaWV3O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcucG9zdFBhZ2VWaWV3ICE9IHVuZGVmaW5lZCAmJiBjb25maWcucG9zdFBhZ2VWaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXcgPSBjb25maWcucG9zdFBhZ2VWaWV3O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzcmM7XG4gICAgICAgIGlmIChjb25maWcuY29yZURhdGEgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5jb3JlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUuamNvbmZpZy5jb3JlRGF0YSA9IHR1LmV4dGVuZE9iaihfcHJpdmF0ZS5qY29uZmlnLmNvcmVEYXRhLCBjb25maWcuY29yZURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuYXV0b0NhcHR1cmUgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5hdXRvQ2FwdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUuamNvbmZpZy5hdXRvQ2FwdHVyZSA9IHR1LmV4dGVuZE9iaihfcHJpdmF0ZS5qY29uZmlnLmF1dG9DYXB0dXJlLCBjb25maWcuYXV0b0NhcHR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaXNMb2dnZWRJbiAhPSB1bmRlZmluZWQgJiYgY29uZmlnLmlzTG9nZ2VkSW4gIT0gbnVsbCkge1xuICAgICAgICAgIF9wcml2YXRlLmpjb25maWcuaXNMb2dnZWRJbiA9IGNvbmZpZy5pc0xvZ2dlZEluO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9hZCkge1xuICAgICAgICBpZiAoY29uZmlnLnZlcnNpb24gIT0gdW5kZWZpbmVkICYmIGNvbmZpZy52ZXJzaW9uICE9IG51bGwpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5zcmMgPSBfcHJpdmF0ZS5iYXNlVXJsICsgY29uZmlnLnZlcnNpb24gKyAiLmpzIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfcHJpdmF0ZS5zcmMgPSBfcHJpdmF0ZS5iYXNlVXJsICsgX3ByaXZhdGUuYmFzZVZlcnNpb24gKyAiLmpzIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvYWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuSlNMTEVhcmx5TG9hZGVkICE9PSAidW5kZWZpbmVkIiAmJiB3aW5kb3cuSlNMTEVhcmx5TG9hZGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgX3ByaXZhdGUuSlNMTExvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhd2EgPT09ICJ1bmRlZmluZWQiICYmICh0eXBlb2Ygd2luZG93LkpTTExFYXJseUxvYWRlZCA9PT0gInVuZGVmaW5lZCIgfHwgd2luZG93LkpTTExFYXJseUxvYWRlZCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgdHUuaW5zZXJ0U2NyaXB0Q2FsbGJhY2soX3ByaXZhdGUuc3JjLCBmdW5jdGlvbiAodGosIGluaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlLkpTTExMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgICAgICAgIHRqLmluaXQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KF9wcml2YXRlLCBpbml0KSwgYXN5bmMpO1xuICAgICAgICB9IGVsc2UgaWYgKGluaXQpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5pbml0VGltZW91dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGluaXQpIHtcbiAgICAgICAgX3ByaXZhdGUuaW5pdFRpbWVvdXQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qXG4gICAgICogU2V0cyBKU0xMIFBhcnRuZXIgUmVmZXJyYWwgdHJhY2tpbmcuXG4gICAgICpcbiAgICAgKi9cbiAgICBfcHVibGljLlRhZ1JlZmVycmFsTGlua1JUID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHZhciByZWZlcnJhbEJsYWNrTGlzdFVSTCA9IFtcbiAgICAgICAgImZhY2Vib29rLmNvbSIsXG4gICAgICAgICJpbnN0YWdyYW0uY29tIixcbiAgICAgICAgImxpbmtlZGluLmNvbSIsXG4gICAgICAgICJ0d2l0dGVyLmNvbSIsXG4gICAgICAgICJvZmZpY2UuY29tIixcbiAgICAgICAgImxpdmUuY29tIixcbiAgICAgICAgInhib3guY29tIixcbiAgICAgICAgInNreXBlLmNvbSIsXG4gICAgICAgICJvbmVub3RlLmNvbSIsXG4gICAgICAgICJhdGRtdC5jb20iLFxuICAgICAgICAibXNkbi5jb20iLFxuICAgICAgICAidHJhZmZpY21hbmFnZXIubmV0IixcbiAgICAgICAgIndpbmRvd3MubmV0IixcbiAgICAgICAgImFrYS5tcyIsXG4gICAgICAgICJzbGlkZXNoYXJlLm5ldCIsXG4gICAgICAgICJhenVyZS5jb20iLFxuICAgICAgICAiYmxvZ3Mud2luZG93cy5jb20iLFxuICAgICAgICAiYXp1cmV3ZWJzaXRlcy5uZXQiLFxuICAgICAgICAiaW5zaWRlci53aW5kb3dzLmNvbSIsXG4gICAgICAgICJqYXZhc2NyaXB0OnZvaWQoMCk7IixcbiAgICAgICAgInlvdXR1YmUuY29tIixcbiAgICAgICAgInhib3guY24iLFxuICAgICAgICAib25lcmYueGJveC5jbiIsXG4gICAgICAgICJ4Ym94LmNvbSIsXG4gICAgICAgICJ3ZWliby5jb20iLFxuICAgICAgICAiY2xvdWRkYW1jZG5wcm9kZXAuYXp1cmVlZGdlLm5ldCIsXG4gICAgICAgICJtaWNyb3NvZnRlZGdlLmdpdGh1Yi5pbyIsXG4gICAgICAgICJtcy1zZXR0aW5nczoiLFxuICAgICAgICAibXMtcGhvdG9zOiIsXG4gICAgICAgICJtcy13aW5kb3dzLXN0b3JlIixcbiAgICAgICAgIm1zLXBob25lIixcbiAgICAgICAgImFwcC5hZGp1c3QuY29tIixcbiAgICAgICAgInBsYXkuZ29vZ2xlLmNvbSIsXG4gICAgICAgICJpdHVuZXMuYXBwbGUuY29tIixcbiAgICAgICAgImFwcHMuYXBwbGUiLFxuICAgICAgICAiYXBwbGUuY29tXFwvaXR1bmVzIixcbiAgICAgICAgIm1pY3Jvc29mdHN0b3JlLmNvbS5jbi9zdXJmYWNlZ29zaWdudXAiLFxuICAgICAgICAiaW1nLXByb2QtY21zLXJ0LW1pY3Jvc29mdC1jb20uYWthbWFpemVkLm5ldCIsXG4gICAgICAgICJmbGlnaHRzaW11bGF0b3IuY29tLyIsXG4gICAgICAgICJpdC5uYy5nb3YiLFxuICAgICAgICAiLnBkZiIsXG4gICAgICAgICJpZHNhLm9yZyJcbiAgICAgIF07XG5cbiAgICAgIHZhciBpc0JsYWNrTGlzdCA9IGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgIGlmIChsaW5rID09PSAiIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGxpbmsgPSB0dS50cmltKGxpbmsudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChsaW5rID09PSAiIyIpIHtcbiAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVmZXJyYWxCbGFja0xpc3RVUkwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5rLmluZGV4T2YocmVmZXJyYWxCbGFja0xpc3RVUkxbaV0pID4gLTEpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgaWYgKHR1Lmluc3RhbmNlT2ZqUXVlcnkoZWxlbSkpIHtcbiAgICAgICAgZWxlbSA9IGVsZW1bMF07XG4gICAgICB9XG4gICAgICB2YXIgZGF0YV9tID0gdHUuZ2V0QXR0cihlbGVtLCAiZGF0YS1tIik7XG4gICAgICBpZiAoZGF0YV9tKSB7XG4gICAgICAgIHZhciBwcm9kdWN0SW5mbyA9IHR1LmdldFByb2R1Y3RJbmZvKGVsZW0pO1xuICAgICAgICB2YXIgZG9tYWluLCBsaW5rLCBwcm9kTmFtZSwgcHJvZElkLCBwcm9kU2t1O1xuICAgICAgICB2YXIgcmVmZXJyYWwgPSBmYWxzZTtcbiAgICAgICAgdmFyIHBhcnRuZXJOYW1lID0gbnVsbDtcbiAgICAgICAgcHJvZE5hbWUgPSBwcm9kdWN0SW5mby5uYW1lO1xuICAgICAgICBwcm9kSWQgPSBwcm9kdWN0SW5mby5pZDtcbiAgICAgICAgcHJvZFNrdSA9IHByb2R1Y3RJbmZvLnNrdTtcbiAgICAgICAgaWYgKHR1LmdldEF0dHIoZWxlbSwgImhyZWYiKSkge1xuICAgICAgICAgIGxpbmsgPSBlbGVtLmhyZWY7XG4gICAgICAgICAgZG9tYWluID0gZWxlbS5ob3N0bmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdGVtcEEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7XG4gICAgICAgICAgdGVtcEEuaHJlZiA9IHR1LmdldEF0dHIoZWxlbSwgImRhdGEtanMtaHJlZiIpO1xuICAgICAgICAgIGxpbmsgPSB0ZW1wQS5ocmVmO1xuICAgICAgICAgIGRvbWFpbiA9IHRlbXBBLmhvc3RuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5rICYmIGRvbWFpbikge1xuICAgICAgICAgIGlmIChkb21haW4ubWF0Y2goL21pY3Jvc29mdFxcLmNvbS9pKSAmJiAobGluay5tYXRjaCgvXFwvc3RvcmVcXC8vaSkgfHwgbGluay5tYXRjaCgvKC4uLS4ufC4uLS4qKT9cXC8ocHxkKVxcLy9pKSkpIHtcbiAgICAgICAgICAgIHJlZmVycmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcnRuZXJOYW1lID0gIm1zIHN0b3JlIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFkb21haW4ubWF0Y2goL21pY3Jvc29mdFxcLmNvbS9pKSAmJiAhaXNCbGFja0xpc3QobGluaykpIHtcbiAgICAgICAgICAgIHBhcnRuZXJOYW1lID0gZG9tYWluO1xuICAgICAgICAgICAgcmVmZXJyYWwgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVmZXJyYWwpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXRKU09OID0gSlNPTi5wYXJzZShkYXRhX20pO1xuICAgICAgICAgICAgdGFyZ2V0SlNPTi5wcnRubSA9IHBhcnRuZXJOYW1lO1xuICAgICAgICAgICAgdGFyZ2V0SlNPTi5iaHZyID0gIlBBUlRORVJSRUZFUlJBTCI7XG4gICAgICAgICAgICB0YXJnZXRKU09OLnByb2QgPSBwcm9kTmFtZTtcbiAgICAgICAgICAgIHRhcmdldEpTT04ucGlkID0gcHJvZElkO1xuICAgICAgICAgICAgdGFyZ2V0SlNPTi5za3UgPSBwcm9kU2t1O1xuICAgICAgICAgICAgdHUuc2V0QXR0cihlbGVtLCAiZGF0YS1tIiwgSlNPTi5zdHJpbmdpZnkodGFyZ2V0SlNPTikpO1xuICAgICAgICAgICAgLy9UaGlzIGlzIGhlcmUgdG8gc2lnbmFsIHRoYXQgd2UgYXJlIGN1c3RvbWl6aW5nIHRoZSBlbGVtZW50IHNvIFJlZCBUaWdlciBrbm93c1xuICAgICAgICAgICAgdHUuc2V0QXR0cihlbGVtLCAiZGF0YS13ZGctYmVoYXZpb3IiLCAiUEFSVE5FUlJFRkVSUkFMIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vSW5pdGlhbGl6ZXNcbiAgICB3ZGcuYWRkVGFnSW5mbyhfcHJpdmF0ZS50YWdOYW1lLCAiMjAxOGFwcjMwLXYxIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSkod2luZG93LndkZ3RhZ2dpbmcsIHdpbmRvdy53ZGd0YWdnaW5nLnV0aWwsIHdpbmRvdy53ZGd0YWdnaW5nLmRhdGEpO1xufVxuXG4vKipcbiAqIFdERyAxRFMgVGFnZ2luZyBGcmFtZXdvcmsuXG4gKlxuICogMURTIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBNTFNEICYgR2FtaW5nIHdlYnNpdGVzLiAxRFMgdmVyc2lvbiAyLngueC5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAc2luY2UgICAwNi0zMC0yMDIwXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgMURTIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcub25lZHMgPSAoZnVuY3Rpb24gKHdkZywgdHUsIHRkKSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL2pzLm1vbml0b3IuYXp1cmUuY29tL3NjcmlwdHMvYy9tcy5hbmFseXRpY3Mtd2ViLSI7XG4gICAgX3ByaXZhdGUuYmFzZVZlcnNpb24gPSAiMyI7XG4gICAgX3ByaXZhdGUuT25lRFNSZWFkeSA9IGZhbHNlO1xuICAgIF9wcml2YXRlLk9uZURTTG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUucUN1c3RvbUV2ZW50cyA9IFtdO1xuICAgIF9wcml2YXRlLnFDdXN0b21VcGRhdGVzID0gW107XG4gICAgX3ByaXZhdGUucUN1c3RvbUV2ZW50c1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLnFDdXN0b21VcGRhdGVzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUucHJlUGFnZVZpZXcgPSBudWxsO1xuICAgIF9wcml2YXRlLnBvc3RQYWdlVmlldyA9IG51bGw7XG4gICAgX3ByaXZhdGUuaW5pdENvdW50ZXIgPSAwO1xuICAgIF9wcml2YXRlLm9jb25maWcgPSB7XG4gICAgICBpbnN0cnVtZW50YXRpb25LZXk6ICIiLFxuICAgICAgY2hhbm5lbENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgZXZlbnRzTGltaXRJbk1lbTogNTBcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0eUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgY2FsbGJhY2s6IHt9XG4gICAgICB9LFxuICAgICAgd2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBhdXRvQ2FwdHVyZToge1xuICAgICAgICAgIHNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICBwYWdlVmlldzogdHJ1ZSxcbiAgICAgICAgICBvbkxvYWQ6IHRydWUsXG4gICAgICAgICAgb25VbmxvYWQ6IHRydWUsXG4gICAgICAgICAgY2xpY2s6IHRydWUsXG4gICAgICAgICAgcmVzaXplOiB0cnVlLFxuICAgICAgICAgIGxpbmVhZ2U6IHRydWUsXG4gICAgICAgICAganNFcnJvcjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBjb3JlRGF0YToge30sXG4gICAgICAgIHVzZVNob3J0TmFtZUZvckNvbnRlbnRCbG9iOiBmYWxzZSxcbiAgICAgICAgdXJsQ29sbGVjdFF1ZXJ5OiB0cnVlLFxuICAgICAgICB1cmxDb2xsZWN0SGFzaDogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICIxRFMiO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBFeGVjdXRlcyBhIENhbGxiYWNrIGZ1bmN0aW9uIGJlZm9yZSBvbmVkcyBwYWdlIHZpZXdcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5wcmVQYWdlVmlld0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHR5cGVvZiBfcHJpdmF0ZS5wcmVQYWdlVmlldyA9PT0gImZ1bmN0aW9uIikge1xuICAgICAgICBfcHJpdmF0ZS5wcmVQYWdlVmlldyhfcHJpdmF0ZS5vY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEV4ZWN1dGVzIGEgQ2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgb25lZHMgcGFnZSB2aWV3XG4gICAgICovXG4gICAgX3ByaXZhdGUucG9zdFBhZ2VWaWV3Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodHlwZW9mIF9wcml2YXRlLnBvc3RQYWdlVmlldyA9PT0gImZ1bmN0aW9uIikge1xuICAgICAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXcoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZXMgYW5kIHNlbmRzIG9uZWRzIHBhZ2UgdmlldyBjYWxsXG4gICAgICovXG4gICAgX3ByaXZhdGUuZG9Jbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3ByaXZhdGUucHJlUGFnZVZpZXdDYWxsYmFjaygpO1xuICAgICAgdmFyIHdjcFJlc3VsdCA9IHR1LmdldFdjcENvbnNlbnRSZXN1bHQoKTtcbiAgICAgIF9wcml2YXRlLm9jb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi5zeW5jTXVpZCA9ICh3Y3BSZXN1bHQgIT0gbnVsbCkgPyAod2NwUmVzdWx0LkFuYWx5dGljcyAmJiB3Y3BSZXN1bHQuU29jaWFsTWVkaWEgJiYgd2NwUmVzdWx0LkFkdmVydGlzaW5nKSA6IGZhbHNlO1xuICAgICAgX3ByaXZhdGUub2NvbmZpZy5wcm9wZXJ0eUNvbmZpZ3VyYXRpb24uY2FsbGJhY2sudXNlckNvbnNlbnREZXRhaWxzID0gKHdjcFJlc3VsdCAhPSBudWxsKSA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR1LmdldFdjcENvbnNlbnRSZXN1bHQoKTsgfSA6IG51bGw7XG4gICAgICAvL0luaXRpYWxpemUgU0RLXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5vZHMgPT0gInVuZGVmaW5lZCIpIHtcbiAgICAgICAgd2luZG93Lm9kcyA9IG5ldyBvbmVEUy5BcHBsaWNhdGlvbkluc2lnaHRzKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXdpbmRvdy5vZHMuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgICAgIHdpbmRvdy5vZHMuaW5pdGlhbGl6ZShfcHJpdmF0ZS5vY29uZmlnLCBbXSk7XG4gICAgICB9XG4gICAgICB0dS50cmlnZ2VyRXZlbnQoZG9jdW1lbnQsICJvZHNSZWFkeSIpO1xuICAgICAgX3ByaXZhdGUuT25lRFNSZWFkeSA9IHRydWU7XG4gICAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXdDYWxsYmFjaygpO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9wcml2YXRlLnByb2Nlc3NDdXN0b21FdmVudFF1ZXVlKCk7XG4gICAgICAgIF9wcml2YXRlLnByb2Nlc3NDdXN0b21Db250ZW50VXBkYXRlUXVldWUoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuXG4gICAgfVxuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZXMgb25lZHMgb24gV0NQIGNvbnNlbnQgXG4gICAgICovXG4gICAgX3B1YmxpYy53Y3BJbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHR5cGVvZiBvbmVEUyAhPT0gInVuZGVmaW5lZCIgJiYgb25lRFMuQXBwbGljYXRpb25JbnNpZ2h0cykge1xuICAgICAgICBpZiAoIV9wcml2YXRlLk9uZURTUmVhZHkpIHtcbiAgICAgICAgICBpZiAodHUuZ2V0V2NwQ29uc2VudENoZWNrRG9uZSgpID09IHRydWUpIHtcbiAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHUuZGVidWdMb2coIm9uZWRzIExpYnJhcnkgbm90IGxvYWRlZCIpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBQcmVwcyB0byBpbml0aWFsaXplIGFuZCBzZW5kcyBvbmVkcyBwYWdlIHZpZXcgY2FsbFxuICAgICAqL1xuICAgIF9wcml2YXRlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodHlwZW9mIG9uZURTICE9PSAidW5kZWZpbmVkIiAmJiBvbmVEUy5BcHBsaWNhdGlvbkluc2lnaHRzKSB7XG4gICAgICAgIGlmICghX3ByaXZhdGUuT25lRFNSZWFkeSkge1xuICAgICAgICAgIGlmICghdHUuY29uc2VudFJlcXVpcmVkKCkpIHtcbiAgICAgICAgICAgIC8vaW5pdCBub3dcbiAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHUuZ2V0V2NwQ29uc2VudENoZWNrRG9uZSgpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHR1LmRvV2NwQ29uc2VudENoZWNrKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR1LmdldFdjcENvbnNlbnRDaGVja0RvbmUoKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgIF9wcml2YXRlLmRvSW5pdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHUuYWRkV2NwQ29uc2VudENhbGxiYWNrKF9wdWJsaWMud2NwSW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0dS5kZWJ1Z0xvZygib25lZHMgTGlicmFyeSBub3QgbG9hZGVkIik7XG4gICAgICB9XG4gICAgICBfcHJpdmF0ZS5wb3N0UGFnZVZpZXdDYWxsYmFjaygpO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gb25lZHMgZXZlbnQgcXVldWVcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5wcm9jZXNzQ3VzdG9tRXZlbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpID0gX3ByaXZhdGUucUN1c3RvbUV2ZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUV2ZW50RnJvbUFycmF5KF9wcml2YXRlLnFDdXN0b21FdmVudHNbaV0pO1xuICAgICAgfVxuICAgICAgX3ByaXZhdGUucUN1c3RvbUV2ZW50c1Byb2Nlc3NlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogUHJvY2Vzc2VzIEN1c3RvbSBvbmVkcyB1cGRhdGVzIHF1ZXVlXG4gICAgICovXG4gICAgX3ByaXZhdGUucHJvY2Vzc0N1c3RvbUNvbnRlbnRVcGRhdGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpID0gX3ByaXZhdGUucUN1c3RvbVVwZGF0ZXMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBfcHVibGljLnByb2Nlc3NDdXN0b21Db250ZW50VXBkYXRlRnJvbUFycmF5KF9wcml2YXRlLnFDdXN0b21VcGRhdGVzW2ldKTtcbiAgICAgIH1cbiAgICAgIF9wcml2YXRlLnFDdXN0b21VcGRhdGVzUHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogRXhlY3V0ZXMgaW5pdCBzZXRUaW1lb3V0IGluIGNhc2UgT25lRHMgaXMgbG9hZGluZ1xuICAgICAqL1xuICAgIF9wcml2YXRlLmluaXRUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF9wcml2YXRlLmluaXRDb3VudGVyIDwgNjEpIHtcbiAgICAgICAgX3ByaXZhdGUuaW5pdENvdW50ZXIrKztcbiAgICAgICAgaWYgKHR5cGVvZiBvbmVEUyAhPT0gInVuZGVmaW5lZCIpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5pbml0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dChfcHJpdmF0ZS5pbml0VGltZW91dCwgNTAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVB1YmxpYyBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICBcbiAgICAvKlxuICAgICAqIFByb2Nlc3NlcyBDdXN0b20gb25lZHMgZXZlbnQgZnJvbSBhcnJheSBvciBhZGRzIGl0IHRvIHF1ZXVlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBpbkFycmF5ICAgIG9uZWRzIGV2ZW50IGFycmF5LlxuICAgICAqL1xuICAgIF9wdWJsaWMucHJvY2Vzc0N1c3RvbUV2ZW50RnJvbUFycmF5ID0gZnVuY3Rpb24gKGluQXJyYXkpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5BcnJheSA9PSAidW5kZWZpbmVkIiB8fCBpbkFycmF5ID09PSBudWxsIHx8IGluQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHR1LmRlYnVnTG9nKCJwcm9jZXNzQ3VzdG9tRXZlbnRGcm9tQXJyYXkgY2FsbGVkIHdpdGggbm8gaW5BcnJheSIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoX3ByaXZhdGUuT25lRFNSZWFkeSAmJiB3aW5kb3cub2RzICYmIHdpbmRvdy5vZHMuaXNJbml0aWFsaXplZCkge1xuICAgICAgICB3aW5kb3cub2RzLmNhcHR1cmVDb250ZW50UGFnZUFjdGlvbihpbkFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wcml2YXRlLnFDdXN0b21FdmVudHMucHVzaChpbkFycmF5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG4gICAgLypcbiAgICAgKiBQcm9jZXNzZXMgQ3VzdG9tIG9uZWRzIHVwZGF0ZSBmcm9tIGFycmF5IG9yIGFkZHMgaXQgdG8gcXVldWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIGluQXJyYXkgICAgSlNTTCBVcGRhdGUgYXJyYXkuXG4gICAgICovXG4gICAgX3B1YmxpYy5wcm9jZXNzQ3VzdG9tQ29udGVudFVwZGF0ZUZyb21BcnJheSA9IGZ1bmN0aW9uIChpbkFycmF5KSB7XG4gICAgICBpZiAodHlwZW9mIGluQXJyYXkgPT0gInVuZGVmaW5lZCIgfHwgaW5BcnJheSA9PT0gbnVsbCB8fCBpbkFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0dS5kZWJ1Z0xvZygicHJvY2Vzc0N1c3RvbUV2ZW50RnJvbUFycmF5IGNhbGxlZCB3aXRoIG5vIGluQXJyYXkiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF9wcml2YXRlLk9uZURTUmVhZHkgJiYgd2luZG93Lm9kcyAmJiB3aW5kb3cub2RzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgd2luZG93Lm9kcy5jYXB0dXJlQ29udGVudFVwZGF0ZShpbkFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wcml2YXRlLnFDdXN0b21VcGRhdGVzLnB1c2goaW5BcnJheSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8qXG4gICAgICogUHJvY2Vzc2VzIEN1c3RvbSBKU0xMIGV2ZW50IHF1ZXVlXG4gICAgICovXG4gICAgX3B1YmxpYy5wcm9jZXNzQ3VzdG9tRXZlbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF9wcml2YXRlLnByb2Nlc3NDdXN0b21FdmVudFF1ZXVlKCk7XG4gICAgfVxuICAgIC8qXG4gICAgICogUHJvY2Vzc2VzIEN1c3RvbSBKU0xMIHVwZGF0ZXMgcXVldWVcbiAgICAgKi9cbiAgICBfcHVibGljLnByb2Nlc3NDdXN0b21Db250ZW50VXBkYXRlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcHJpdmF0ZS5wcm9jZXNzQ3VzdG9tQ29udGVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIC8qXG4gICAgICogR2V0cyBvbmVkcyByZWFkeW5lc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm5zIEpTTEwgcmVhZHluZXNzLlxuICAgICAqL1xuICAgIF9wdWJsaWMuSXNPbmVERFJlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9wcml2YXRlLk9uZURTUmVhZHk7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIExvYWRzIG9uZWRzIEJhc2UgdGFnIGFuZCBzZW5kcyBhIHBhZ2Ugdmlld1xuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9ICAgY29uZmlnICAgICAgICAgICBKU0xMIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBFeGFtcGxlIGFzIGJlbG93XG4gICAgICAgICAge1xuICAgICAgICAgICAgImFwcElkIjoiU09NRSBJRCIsIC0gSlNMTCBBcHAgSURcbiAgICAgICAgICAgICJwcmVQYWdlVmlldyI6ZnVuY3Rpb24oKXsgLy9zb21lY29kZSB9LCAtIGNhbGxiYWNrIGZ1bmN0aW9uIHByZSBwYWdlIHZpZXdcbiAgICAgICAgICAgICJwb3N0UGFnZVZpZXciOmZ1bmN0aW9uKCl7IC8vc29tZWNvZGUgfSwgIC0gY2FsbGJhY2sgZnVuY3Rpb24gcG9zdCBwYWdlIHZpZXdcbiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjQiIC0gSlNMTCBsaWJyYXJ5IFZlcnNpb24sXG4gICAgICAgICAgICAiY29yZURhdGEiOnsgfSAtIE92ZXJyaWRlIGNvcmVkYXRhIHZhbHVlc1xuICAgICAgICAgIH1cbiAgICAgKi9cbiAgICBfcHVibGljLmxvYWQgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBpZiAoY29uZmlnID09IHVuZGVmaW5lZCB8fCBjb25maWcgPT0gbnVsbCkge1xuICAgICAgICB0dS5kZWJ1Z0xvZygiMURTIGNvbmZpZ3VyYXRpb24gbWlzc2luZyIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbG9hZCA9IChjb25maWcubG9hZCA9PSB1bmRlZmluZWQgfHwgY29uZmlnLmxvYWQgPT0gbnVsbCkgfHwgY29uZmlnLmxvYWQ7XG4gICAgICB2YXIgaW5pdCA9IChjb25maWcuaW5pdCA9PSB1bmRlZmluZWQgfHwgY29uZmlnLmluaXQgPT0gbnVsbCkgfHwgY29uZmlnLmluaXQ7XG4gICAgICB2YXIgYXN5bmMgPSAoY29uZmlnLmFzeW5jID09IHVuZGVmaW5lZCB8fCBjb25maWcuYXN5bmMgPT0gbnVsbCkgfHwgY29uZmlnLmFzeW5jO1xuXG4gICAgICBpZiAoaW5pdCkge1xuICAgICAgICBpZiAoY29uZmlnLmluc3RydW1lbnRhdGlvbktleSA9PSB1bmRlZmluZWQgfHwgY29uZmlnLmluc3RydW1lbnRhdGlvbktleSA9PSBudWxsKSB7XG4gICAgICAgICAgdHUuZGVidWdMb2coImlEUyBpbnN0cnVtZW50YXRpb24gS2V5IG1pc3NpbmciKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3ByaXZhdGUub2NvbmZpZy5pbnN0cnVtZW50YXRpb25LZXkgPSBjb25maWcuaW5zdHJ1bWVudGF0aW9uS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcucHJlUGFnZVZpZXcgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5wcmVQYWdlVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUucHJlUGFnZVZpZXcgPSBjb25maWcucHJlUGFnZVZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5wb3N0UGFnZVZpZXcgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5wb3N0UGFnZVZpZXcgIT0gbnVsbCkge1xuICAgICAgICAgIF9wcml2YXRlLnBvc3RQYWdlVmlldyA9IGNvbmZpZy5wb3N0UGFnZVZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pbiA9ICIubWluIjtcbiAgICAgICAgaWYgKGNvbmZpZy5taW5pZmllZCAhPSB1bmRlZmluZWQgJiYgY29uZmlnLm1pbmlmaWVkICE9IG51bGwgJiYgY29uZmlnLm1pbmlmaWVkID09IGZhbHNlKSB7XG4gICAgICAgICAgbWluID0gIiI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uICE9IHVuZGVmaW5lZCAmJiBjb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi5jb3JlRGF0YSAhPSB1bmRlZmluZWQgJiYgY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24uY29yZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgIF9wcml2YXRlLm9jb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi5jb3JlRGF0YSA9IHR1LmV4dGVuZE9iaihfcHJpdmF0ZS5vY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24uY29yZURhdGEsIGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLmNvcmVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24gIT0gdW5kZWZpbmVkICYmIGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVzZVNob3J0TmFtZUZvckNvbnRlbnRCbG9iICE9IHVuZGVmaW5lZCAmJiBjb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi51c2VTaG9ydE5hbWVGb3JDb250ZW50QmxvYiAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUub2NvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVzZVNob3J0TmFtZUZvckNvbnRlbnRCbG9iID0gY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24udXNlU2hvcnROYW1lRm9yQ29udGVudEJsb2I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uICE9IHVuZGVmaW5lZCAmJiBjb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi51cmxDb2xsZWN0UXVlcnkgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVybENvbGxlY3RRdWVyeSAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUub2NvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVybENvbGxlY3RRdWVyeSA9IGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVybENvbGxlY3RRdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24gIT0gdW5kZWZpbmVkICYmIGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVybENvbGxlY3RIYXNoICE9IHVuZGVmaW5lZCAmJiBjb25maWcud2ViQW5hbHl0aWNzQ29uZmlndXJhdGlvbi51cmxDb2xsZWN0SGFzaCAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUub2NvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLnVybENvbGxlY3RIYXNoID0gY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24udXJsQ29sbGVjdEhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wZXJ0eUNvbmZpZ3VyYXRpb24gIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5wcm9wZXJ0eUNvbmZpZ3VyYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIF9wcml2YXRlLm9jb25maWcucHJvcGVydHlDb25maWd1cmF0aW9uID0gdHUuZXh0ZW5kT2JqKF9wcml2YXRlLm9jb25maWcucHJvcGVydHlDb25maWd1cmF0aW9uLCBjb25maWcucHJvcGVydHlDb25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmlzTG9nZ2VkSW4gIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5pc0xvZ2dlZEluICE9IG51bGwpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5vY29uZmlnLndlYkFuYWx5dGljc0NvbmZpZ3VyYXRpb24uaXNMb2dnZWRJbiA9IGNvbmZpZy53ZWJBbmFseXRpY3NDb25maWd1cmF0aW9uLmlzTG9nZ2VkSW47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWQpIHtcbiAgICAgICAgdmFyIHNyYztcbiAgICAgICAgaWYgKGNvbmZpZy52ZXJzaW9uICE9IHVuZGVmaW5lZCAmJiBjb25maWcudmVyc2lvbiAhPSBudWxsKSB7XG4gICAgICAgICAgX3ByaXZhdGUuc3JjID0gX3ByaXZhdGUuYmFzZVVybCArIGNvbmZpZy52ZXJzaW9uICsgbWluICsgIi5qcyI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3ByaXZhdGUuc3JjID0gX3ByaXZhdGUuYmFzZVVybCArIF9wcml2YXRlLmJhc2VWZXJzaW9uICsgbWluICsgIi5qcyI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxvYWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuT25lRHNFYXJseUxvYWRlZCAhPT0gInVuZGVmaW5lZCIgJiYgd2luZG93Lk9uZURzRWFybHlMb2FkZWQgPT09IHRydWUpIHtcbiAgICAgICAgICBfcHJpdmF0ZS5PbmVEU0xvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvbmVEUyA9PT0gInVuZGVmaW5lZCIgJiYgKHR5cGVvZiB3aW5kb3cuT25lRHNFYXJseUxvYWRlZCA9PT0gInVuZGVmaW5lZCIgfHwgd2luZG93Lk9uZURzRWFybHlMb2FkZWQgPT09IGZhbHNlKSkge1xuICAgICAgICAgIHR1Lmluc2VydFNjcmlwdENhbGxiYWNrKF9wcml2YXRlLnNyYywgZnVuY3Rpb24gKHRqLCBpbml0KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZS5PbmVEU0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgICAgICAgdGouaW5pdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0oX3ByaXZhdGUsIGluaXQpLCBhc3luYyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgICAgIF9wcml2YXRlLmluaXRUaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgICBfcHJpdmF0ZS5pbml0VGltZW91dCgpO1xuICAgICAgfVxuXG4gICAgfTtcbiAgICAvKlxuICAgICAqIFNldHMgb25lZHMgUGFydG5lciBSZWZlcnJhbCB0cmFja2luZy5cbiAgICAgKlxuICAgICAqL1xuICAgIF9wdWJsaWMuVGFnUmVmZXJyYWxMaW5rUlQgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgdmFyIHJlZmVycmFsQmxhY2tMaXN0VVJMID0gW1xuICAgICAgICAiZmFjZWJvb2suY29tIixcbiAgICAgICAgImluc3RhZ3JhbS5jb20iLFxuICAgICAgICAibGlua2VkaW4uY29tIixcbiAgICAgICAgInR3aXR0ZXIuY29tIixcbiAgICAgICAgIm9mZmljZS5jb20iLFxuICAgICAgICAibGl2ZS5jb20iLFxuICAgICAgICAieGJveC5jb20iLFxuICAgICAgICAic2t5cGUuY29tIixcbiAgICAgICAgIm9uZW5vdGUuY29tIixcbiAgICAgICAgImF0ZG10LmNvbSIsXG4gICAgICAgICJtc2RuLmNvbSIsXG4gICAgICAgICJ0cmFmZmljbWFuYWdlci5uZXQiLFxuICAgICAgICAid2luZG93cy5uZXQiLFxuICAgICAgICAiYWthLm1zIixcbiAgICAgICAgInNsaWRlc2hhcmUubmV0IixcbiAgICAgICAgImF6dXJlLmNvbSIsXG4gICAgICAgICJibG9ncy53aW5kb3dzLmNvbSIsXG4gICAgICAgICJhenVyZXdlYnNpdGVzLm5ldCIsXG4gICAgICAgICJpbnNpZGVyLndpbmRvd3MuY29tIixcbiAgICAgICAgImphdmFzY3JpcHQ6dm9pZCgwKTsiLFxuICAgICAgICAieW91dHViZS5jb20iLFxuICAgICAgICAieGJveC5jbiIsXG4gICAgICAgICJvbmVyZi54Ym94LmNuIixcbiAgICAgICAgInhib3guY29tIixcbiAgICAgICAgIndlaWJvLmNvbSIsXG4gICAgICAgICJjbG91ZGRhbWNkbnByb2RlcC5henVyZWVkZ2UubmV0IixcbiAgICAgICAgIm1pY3Jvc29mdGVkZ2UuZ2l0aHViLmlvIixcbiAgICAgICAgIm1zLXNldHRpbmdzOiIsXG4gICAgICAgICJtcy1waG90b3M6IixcbiAgICAgICAgIm1zLXdpbmRvd3Mtc3RvcmUiLFxuICAgICAgICAibXMtcGhvbmUiLFxuICAgICAgICAiYXBwLmFkanVzdC5jb20iLFxuICAgICAgICAicGxheS5nb29nbGUuY29tIixcbiAgICAgICAgIml0dW5lcy5hcHBsZS5jb20iLFxuICAgICAgICAiYXBwcy5hcHBsZSIsXG4gICAgICAgICJhcHBsZS5jb21cXC9pdHVuZXMiLFxuICAgICAgICAibWljcm9zb2Z0c3RvcmUuY29tLmNuL3N1cmZhY2Vnb3NpZ251cCIsXG4gICAgICAgICJpbWctcHJvZC1jbXMtcnQtbWljcm9zb2Z0LWNvbS5ha2FtYWl6ZWQubmV0IixcbiAgICAgICAgImZsaWdodHNpbXVsYXRvci5jb20vIixcbiAgICAgICAgIml0Lm5jLmdvdiIsXG4gICAgICAgICIucGRmIixcbiAgICAgICAgImlkc2Eub3JnIlxuICAgICAgXTtcblxuICAgICAgdmFyIGlzQmxhY2tMaXN0ID0gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgaWYgKGxpbmsgPT09ICIiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgbGluayA9IHR1LnRyaW0obGluay50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGxpbmsgPT09ICIjIikge1xuICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWZlcnJhbEJsYWNrTGlzdFVSTC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmsuaW5kZXhPZihyZWZlcnJhbEJsYWNrTGlzdFVSTFtpXSkgPiAtMSkge1xuICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBpZiAodHUuaW5zdGFuY2VPZmpRdWVyeShlbGVtKSkge1xuICAgICAgICBlbGVtID0gZWxlbVswXTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhX20gPSB0dS5nZXRBdHRyKGVsZW0sICJkYXRhLW0iKTtcbiAgICAgIGlmIChkYXRhX20pIHtcbiAgICAgICAgdmFyIHByb2R1Y3RJbmZvID0gdHUuZ2V0UHJvZHVjdEluZm8oZWxlbSk7XG4gICAgICAgIHZhciBkb21haW4sIGxpbmssIHByb2ROYW1lLCBwcm9kSWQsIHByb2RTa3U7XG4gICAgICAgIHZhciByZWZlcnJhbCA9IGZhbHNlO1xuICAgICAgICB2YXIgcGFydG5lck5hbWUgPSBudWxsO1xuICAgICAgICBwcm9kTmFtZSA9IHByb2R1Y3RJbmZvLm5hbWU7XG4gICAgICAgIHByb2RJZCA9IHByb2R1Y3RJbmZvLmlkO1xuICAgICAgICBwcm9kU2t1ID0gcHJvZHVjdEluZm8uc2t1O1xuICAgICAgICBpZiAodHUuZ2V0QXR0cihlbGVtLCAiaHJlZiIpKSB7XG4gICAgICAgICAgbGluayA9IGVsZW0uaHJlZjtcbiAgICAgICAgICBkb21haW4gPSBlbGVtLmhvc3RuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0ZW1wQSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtcbiAgICAgICAgICB0ZW1wQS5ocmVmID0gdHUuZ2V0QXR0cihlbGVtLCAiZGF0YS1qcy1ocmVmIik7XG4gICAgICAgICAgbGluayA9IHRlbXBBLmhyZWY7XG4gICAgICAgICAgZG9tYWluID0gdGVtcEEuaG9zdG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmsgJiYgZG9tYWluKSB7XG4gICAgICAgICAgaWYgKGRvbWFpbi5tYXRjaCgvbWljcm9zb2Z0XFwuY29tL2kpICYmIChsaW5rLm1hdGNoKC9cXC9zdG9yZVxcLy9pKSB8fCBsaW5rLm1hdGNoKC8oLi4tLi58Li4tLiopP1xcLyhwfGQpXFwvL2kpKSkge1xuICAgICAgICAgICAgcmVmZXJyYWwgPSB0cnVlO1xuICAgICAgICAgICAgcGFydG5lck5hbWUgPSAibXMgc3RvcmUiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWRvbWFpbi5tYXRjaCgvbWljcm9zb2Z0XFwuY29tL2kpICYmICFpc0JsYWNrTGlzdChsaW5rKSkge1xuICAgICAgICAgICAgcGFydG5lck5hbWUgPSBkb21haW47XG4gICAgICAgICAgICByZWZlcnJhbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZWZlcnJhbCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldEpTT04gPSBKU09OLnBhcnNlKGRhdGFfbSk7XG4gICAgICAgICAgICB0YXJnZXRKU09OLnBydG5tID0gcGFydG5lck5hbWU7XG4gICAgICAgICAgICB0YXJnZXRKU09OLmJodnIgPSAiUEFSVE5FUlJFRkVSUkFMIjtcbiAgICAgICAgICAgIHRhcmdldEpTT04ucHJvZCA9IHByb2ROYW1lO1xuICAgICAgICAgICAgdGFyZ2V0SlNPTi5waWQgPSBwcm9kSWQ7XG4gICAgICAgICAgICB0YXJnZXRKU09OLnNrdSA9IHByb2RTa3U7XG4gICAgICAgICAgICB0dS5zZXRBdHRyKGVsZW0sICJkYXRhLW0iLCBKU09OLnN0cmluZ2lmeSh0YXJnZXRKU09OKSk7XG4gICAgICAgICAgICAvL1RoaXMgaXMgaGVyZSB0byBzaWduYWwgdGhhdCB3ZSBhcmUgY3VzdG9taXppbmcgdGhlIGVsZW1lbnQgc28gUmVkIFRpZ2VyIGtub3dzXG4gICAgICAgICAgICB0dS5zZXRBdHRyKGVsZW0sICJkYXRhLXdkZy1iZWhhdmlvciIsICJQQVJUTkVSUkVGRVJSQUwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9Jbml0aWFsaXplc1xuICAgIHdkZy5hZGRUYWdJbmZvKF9wcml2YXRlLnRhZ05hbWUsICIyMDIwanVuMzAtdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCwgd2luZG93LndkZ3RhZ2dpbmcuZGF0YSk7XG59XG5cbi8qKlxuICogV0RHIERDTSBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBEQ00gdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgRENNIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcuZGNtID0gKGZ1bmN0aW9uICh3ZGcsIHR1KSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL2FkLmRvdWJsZWNsaWNrLm5ldC9kZG0vYWN0aXZpdHkvIjtcbiAgICBfcHJpdmF0ZS5vcmRSYW5kb21FbmRTcmMgPSAiO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O29yZD0iO1xuICAgIF9wcml2YXRlLm9yZDFOdW1SYW5kb21FbmRTcmMgPSAiO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O29yZD0xO251bT0iO1xuICAgIF9wcml2YXRlLnJhbmRvbUVuZGluZyA9IF9wcml2YXRlLm9yZFJhbmRvbUVuZFNyYztcbiAgICBfcHJpdmF0ZS50YWdOYW1lID0gIkRDTSI7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIFNldHMgQmFzZSBEQ00gVmFyaWFibGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgICBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5zZXRCYXNlVVZhcnMgPSBmdW5jdGlvbiAoZWxlbSwgb3ZlcnJpZGUpIHtcbiAgICAgIF9wcml2YXRlLnVWYXJzID0gX3ByaXZhdGUudVZhcnMgfHwge307XG4gICAgICBfcHJpdmF0ZS5zZXRVVmFyKCJ1MSIsIHdkZy5nZXREYXRhKCJsb2MiKSB8fCBcJ1wnLCBmYWxzZSk7XG4gICAgICBfcHJpdmF0ZS5zZXRVVmFyKCJ1MiIsIHdkZy5nZXREYXRhKCJsYW5nTG9jIikgfHwgXCdcJywgZmFsc2UpO1xuICAgICAgX3ByaXZhdGUuc2V0VVZhcigidTYiLCAod2RnLmdldERhdGEoImdwbiIpIHx8ICIiKS5yZXBsYWNlKC9cXC8vZywgXCctXCcpIHx8IFwnXCcsIGZhbHNlKTtcbiAgICAgIF9wcml2YXRlLnNldFVWYXIoInUyNiIsIChkb2N1bWVudC50aXRsZSB8fCAiIikuc3BsaXQoInwiKVswXSwgdHJ1ZSk7XG5cblxuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgX3ByaXZhdGUuc2V0UHJvZFVWYXJzKGVsZW0pO1xuICAgICAgICAvKiBDVEEodTUwKSAqL1xuICAgICAgICBfcHJpdmF0ZS51VmFycy51NTAgPSBudWxsO1xuICAgICAgICB2YXIgZVR4dCA9IG51bGw7XG4gICAgICAgIHZhciBwcm9kdWN0SW5mbyA9IHR1LmdldFByb2R1Y3RJbmZvKGVsZW0pO1xuICAgICAgICBlVHh0ID0gcHJvZHVjdEluZm8uY3RhO1xuICAgICAgICBpZiAoIWVUeHQpIHtcbiAgICAgICAgICBlVHh0ID0gdHUuZ2V0VGV4dENvbnRlbnQoZWxlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZVR4dCA9IHR1LmV0bGNTdHIoZVR4dCwgbnVsbCk7XG4gICAgICAgIGlmIChlVHh0KSB7XG4gICAgICAgICAgX3ByaXZhdGUuc2V0VVZhcigidTUwIiwgZVR4dCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvdmVycmlkZSAhPSB1bmRlZmluZWQgJiYgb3ZlcnJpZGUgIT0gbnVsbCAmJiB0eXBlb2YgKG92ZXJyaWRlKSA9PSAib2JqZWN0Iikge1xuICAgICAgICBfcHJpdmF0ZS51VmFycyA9IHR1LmV4dGVuZE9iaihfcHJpdmF0ZS51VmFycywgb3ZlcnJpZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFNldHMgUHJvZHVjdCBEQ00gVmFyaWFibGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgICBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5zZXRQcm9kVVZhcnMgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgdmFyIHByb2R1Y3RJbmZvID0gdHUuZ2V0UHJvZHVjdEluZm8oZWxlbSk7XG4gICAgICBfcHJpdmF0ZS5zZXRVVmFyKCJ1MjUiLCBwcm9kdWN0SW5mby5pZCwgdHJ1ZSk7XG4gICAgICBfcHJpdmF0ZS5zZXRVVmFyKCJ1MzIiLCBwcm9kdWN0SW5mby5za3UsIHRydWUpO1xuICAgICAgX3ByaXZhdGUuc2V0VVZhcigidTI2IiwgcHJvZHVjdEluZm8ubmFtZSwgdHJ1ZSk7XG4gICAgICBfcHJpdmF0ZS5zZXRVVmFyKCJ1NTYiLCBwcm9kdWN0SW5mby5yZXRhaWxlciwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogU2V0cyBEQ00gVmFyaWFibGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHVWYXIgICAgIFZhcmlhYmxlIE5hbWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgdmFsdWUgICAgVmFyaWFibGUgVmFsdWUuXG4gICAgICogQHBhcmFtIHtib29sZW59ICAgb3ZlcnJpZGUgRmxhZyBmb3Igb3ZlcnJpZGluZyB2YXJpYWJsZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5zZXRVVmFyID0gZnVuY3Rpb24gKHVWYXIsIHZhbHVlLCBvdmVycmlkZSkge1xuICAgICAgaWYgKCF1VmFyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghb3ZlcnJpZGUpIHtcbiAgICAgICAgaWYgKF9wcml2YXRlLnVWYXJzW3VWYXJdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfcHJpdmF0ZS51VmFyc1t1VmFyXSA9ICgodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBudWxsIDogZW5jb2RlVVJJQ29tcG9uZW50KHR1LnRyaW0odmFsdWUpKSk7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0IERDTSB0cmFja2luZyBzdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHNyYyAgICBEQ00gU291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICBEQ00gVHlwZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBjYXQgICAgRENNIENhdGVnb3J5IHZhbHVlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSAgIGVsZW0gICBET00gZWxlbWVudCAoT3B0aW9uYWwpLiBBdmFpbGFibGUgaW4gY2FzZSBvZiBMaW5rIGNsaWNrLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIERDTSB0cmFja2luZyBzdHJpbmcuXG4gICAgICovXG4gICAgX3ByaXZhdGUuZ2V0RGNtU3RyaW5nID0gZnVuY3Rpb24gKHNyYywgdHlwZSwgY2F0LCBvdmVycmlkZSwgZWxlbSkge1xuICAgICAgX3ByaXZhdGUuc2V0QmFzZVVWYXJzKGVsZW0sIG92ZXJyaWRlKTtcbiAgICAgIHZhciBzID0gX3ByaXZhdGUuYmFzZVVybCArICJzcmM9IiArIHNyYyArICI7dHlwZT0iICsgdHlwZSArICI7Y2F0PSIgKyBjYXQgKyBfcHJpdmF0ZS5nZXRVVmFyU3RyaW5nKCk7XG4gICAgICByZXR1cm4gcztcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBHZXRzIERDTSBWYXJpYWJsZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgRENNIHZhcmlhYmxlIHN0cmluZy5cbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5nZXRVVmFyU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHUgPSBfcHJpdmF0ZS51VmFycztcbiAgICAgIHZhciB1VmFyU3RyaW5nID0gXCdcJztcbiAgICAgIGZvciAodmFyIGtleSBpbiB1KSB7XG4gICAgICAgIGlmICh1Lmhhc093blByb3BlcnR5KGtleSkgJiYgdVtrZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgdVZhclN0cmluZyArPSAiOyIgKyBrZXkgKyAiPSIgKyB1W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVWYXJTdHJpbmcgKz0gX3ByaXZhdGUuZ2V0UmFuZG9tRW5kU3JjKCk7XG4gICAgICByZXR1cm4gdVZhclN0cmluZztcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBHZXRzIFJhbmRvbSBOdW1iZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJucyByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIF9wcml2YXRlLmdldFJhbmRvbU5iciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSArICIiO1xuICAgICAgciA9IHIgKiAxMDAwMDAwMDAwMDAwMDtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEdldHMgUmFuZG9tIEVuZCBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyByYW5kb20gZW5kIHN0cmluZy5cbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5nZXRSYW5kb21FbmRTcmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3ByaXZhdGUucmFuZG9tRW5kaW5nICsgX3ByaXZhdGUuZ2V0UmFuZG9tTmJyKCk7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogR2V0cyBDb25kaXRpb25lZCBEQ00gVmFyaWFibGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG5hbWUgIERDTSBWYXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHZhbCAgIERDTSBWYXJpYWJsZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge29iamVjdH0gcmV0dXJucyBEQ00gdmFyaWFibGUuXG4gICAgICovXG4gICAgX3ByaXZhdGUuY29uZFN0ciA9IGZ1bmN0aW9uIChuYW1lLCB2YWwpIHtcbiAgICAgIGlmIChuYW1lICYmIHZhbCkge1xuICAgICAgICByZXR1cm4gIjsiICsgbmFtZSArICI9IiArIHZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAiIjtcbiAgICB9O1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QdWJsaWMgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIFNldCBPcmQgUmFuZG9tIGVuZGluZ1xuICAgICAqXG4gICAgICovXG4gICAgX3B1YmxpYy5zZXRPcmRSYW5kb21FbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfcHJpdmF0ZS5yYW5kb21FbmRpbmcgPSBfcHJpdmF0ZS5vcmRSYW5kb21FbmRTcmM7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogU2V0IE9yZDEgTnVtIFJhbmRvbSBlbmRpbmdcbiAgICAgKlxuICAgICAqL1xuICAgIF9wdWJsaWMuc2V0T3JkMU51bVJhbmRvbUVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF9wcml2YXRlLnJhbmRvbUVuZGluZyA9IF9wcml2YXRlLm9yZDFOdW1SYW5kb21FbmRTcmM7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogVHJhY2tzIERDTSBQYWdlIHZpZXdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHNyYyAgICBEQ00gU291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICBEQ00gVHlwZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBjYXQgICAgRENNIENhdGVnb3J5IHZhbHVlLlxuICAgICAqL1xuICAgIF9wdWJsaWMudHJhY2tWaWV3ID0gZnVuY3Rpb24gKHNyYywgdHlwZSwgY2F0LCBvdmVycmlkZSkge1xuICAgICAgdmFyIHMgPSBfcHJpdmF0ZS5nZXREY21TdHJpbmcoc3JjLCB0eXBlLCBjYXQsIG92ZXJyaWRlLCBudWxsKTtcbiAgICAgIHR1LnJlcXVlc3RJbWFnZShzKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lLCAiVmlldyIpO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFRyYWNrcyBEQ00gUGFnZSB2aWV3XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBzcmMgICAgRENNIFNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgRENNIFR5cGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgY2F0ICAgIERDTSBDYXRlZ29yeSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBlbGVtICAgRE9NIGVsZW1lbnQuXG4gICAgICovXG4gICAgX3B1YmxpYy50cmFja0V2ZW50ID0gZnVuY3Rpb24gKHNyYywgdHlwZSwgY2F0LCBvdmVycmlkZSwgZWxlbSkge1xuICAgICAgdmFyIHMgPSBfcHJpdmF0ZS5nZXREY21TdHJpbmcoc3JjLCB0eXBlLCBjYXQsIG92ZXJyaWRlLCBlbGVtKTtcbiAgICAgIHR1LnJlcXVlc3RJbWFnZShzKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lLCAiQ29udmVyc2lvbiIpO1xuICAgIH07XG5cbiAgICAvL0luaXRpYWxpemVzXG4gICAgd2RnLmFkZFRhZ0luZm8oX3ByaXZhdGUudGFnTmFtZSwgIjIwMThhcHIzMC12MSIpO1xuXG4gICAgcmV0dXJuIF9wdWJsaWM7XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsKTtcbn1cblxuLyoqXG4gKiBXREcgRmFjZWJvb2sgVGFnZ2luZyBGcmFtZXdvcmsuXG4gKlxuICogRmFjZWJvb2sgdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgRmFjZWJvb2sgUGl4ZWwgZnJhbWV3b3JrXG4gICAqL1xuICB3aW5kb3cud2RndGFnZ2luZy5mYWNlYm9vayA9IChmdW5jdGlvbiAod2RnLCB0dSkge1xuICAgIC8vIHZhcmlhYmxlcyBcbiAgICB2YXIgX3ByaXZhdGUgPSB7fTtcbiAgICB2YXIgX3B1YmxpYyA9IHt9O1xuICAgIF9wcml2YXRlLmJhc2VVcmwgPSAiaHR0cHM6Ly9jb25uZWN0LmZhY2Vib29rLm5ldC9lbl9VUy9mYmV2ZW50cy5qcyI7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJGYWNlYm9vayI7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIExvYWRzIEZhY2Vib29rIGxpYnJhcnkgaWYgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICovXG4gICAgX3ByaXZhdGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3ByaXZhdGUubG9hZGVkKSB7XG4gICAgICAgICFmdW5jdGlvbiAoZiwgYiwgZSwgdiwgbiwgdCwgcykge1xuICAgICAgICAgIGlmIChmLmZicSkgcmV0dXJuO1xuICAgICAgICAgIG4gPSBmLmZicSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG4uY2FsbE1ldGhvZCA/IG4uY2FsbE1ldGhvZC5hcHBseShuLCBhcmd1bWVudHMpIDogbi5xdWV1ZS5wdXNoKGFyZ3VtZW50cylcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICghZi5fZmJxKSBmLl9mYnEgPSBuO1xuICAgICAgICAgIG4ucHVzaCA9IG47XG4gICAgICAgICAgbi5sb2FkZWQgPSAhMDtcbiAgICAgICAgICBuLnZlcnNpb24gPSBcJzIuMFwnO1xuICAgICAgICAgIG4ucXVldWUgPSBbXTtcbiAgICAgICAgICB0ID0gYi5jcmVhdGVFbGVtZW50KGUpO1xuICAgICAgICAgIHQuYXN5bmMgPSAhMDtcbiAgICAgICAgICB0LnNyYyA9IHY7XG4gICAgICAgICAgcyA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07XG4gICAgICAgICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LCBzKTtcbiAgICAgICAgfSh3aW5kb3csIGRvY3VtZW50LCBcJ3NjcmlwdFwnLCBfcHJpdmF0ZS5iYXNlVXJsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBJbml0aWxpemUgdGhlIEZhY2Vib29rIFBpeGVsIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgIGlkICAgICBGYWNlYm9vayBQaXhlbCBJRC5cbiAgICAgKi9cbiAgICBfcHVibGljLmluaXQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIF9wcml2YXRlLmxvYWQoKTtcbiAgICAgIHdpbmRvdy5mYnEoXCdkYXRhUHJvY2Vzc2luZ09wdGlvbnNcJywgW1wnTERVXCddLCAwLCAwKTtcbiAgICAgIHdpbmRvdy5mYnEoXCdzZXRcJywgXCdhdXRvQ29uZmlnXCcsIFwnZmFsc2VcJywgaWQpO1xuICAgICAgd2luZG93LmZicShcJ2luaXRcJywgaWQpO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVHJhY2tzIHRoZSBGYWNlYm9vayBQaXhlbCB0YWcgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBldmVudFR5cGUgIEV2ZW50IFR5cGUuIEUuZy4gInRyYWNrU2luZ2xlIlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgIGlkICAgICAgICAgRmFjZWJvb2sgUGl4ZWwgSUQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9ICAgZXZlbnROYW1lICBFdmVudCBOYW1lLiBFLmcuICJQYWdlVmlldyJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gICBpbkFycmF5ICAgIFRyYWNraW5nIERhdGEuIFxuICAgICAqL1xuICAgIF9wdWJsaWMudHJhY2tFdmVudCA9IGZ1bmN0aW9uIChldmVudFR5cGUsIGlkLCBldmVudE5hbWUsIGluQXJyYXkpIHtcbiAgICAgIGlmIChpbkFycmF5ICE9IHVuZGVmaW5lZCAmJiBpbkFycmF5ICE9IG51bGwgJiYgdHlwZW9mIChpbkFycmF5KSA9PSAib2JqZWN0Iikge1xuICAgICAgICB3aW5kb3cuZmJxKGV2ZW50VHlwZSwgaWQsIGV2ZW50TmFtZSwgaW5BcnJheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZmJxKGV2ZW50VHlwZSwgaWQsIGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgICB3ZGcuYWRkVGFnRXhlY3V0ZWQoX3ByaXZhdGUudGFnTmFtZSwgIkNvbnZlcnNpb24iKTtcbiAgICB9O1xuICAgIC8vSW5pdGlhbGl6ZXNcbiAgICB3ZGcuYWRkVGFnSW5mbyhfcHJpdmF0ZS50YWdOYW1lLCAiMjAxOGFwcjMwLXYxIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSkod2luZG93LndkZ3RhZ2dpbmcsIHdpbmRvdy53ZGd0YWdnaW5nLnV0aWwpO1xufVxuXG4vKipcbiAqIFdERyBUd2l0dGVyIFRhZ2dpbmcgRnJhbWV3b3JrLlxuICpcbiAqIFR3aXR0ZXIgdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgVHdpdHRlciBQaXhlbCBmcmFtZXdvcmtcbiAgICovXG4gIHdpbmRvdy53ZGd0YWdnaW5nLnR3aXR0ZXIgPSAoZnVuY3Rpb24gKHdkZywgdHUpIHtcbiAgICAvLyB2YXJpYWJsZXNcbiAgICB2YXIgX3ByaXZhdGUgPSB7fTtcbiAgICB2YXIgX3B1YmxpYyA9IHt9O1xuICAgIC8vIFRoZSBiYXNlVXJsIHdlIGhhdmUgaGVyZSBpcyB0aGUgc2FtZSBhc1xuICAgIC8vIGh0dHA6Ly9zdGF0aWMuYWRzLXR3aXR0ZXIuY29tL3V3dC5qc1xuICAgIC8vIC8vcGxhdGZvcm0udHdpdHRlci5jb20vb2N0LmpzXG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL3N0YXRpYy5hZHMtdHdpdHRlci5jb20vb2N0LmpzIjtcbiAgICBfcHJpdmF0ZS5sb2FkZWQgPSBmYWxzZTtcbiAgICBfcHJpdmF0ZS50YWdOYW1lID0gIlR3aXR0ZXIiO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBUd2l0dGVyIGxpYnJhcnkgaWYgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICovXG4gICAgX3ByaXZhdGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3ByaXZhdGUubG9hZGVkKSB7XG4gICAgICAgICFmdW5jdGlvbiAoZSwgdCwgbiwgcywgdSwgYSkge1xuICAgICAgICAgIGUudHdxIHx8IChzID0gZS50d3EgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzLmV4ZSA/IHMuZXhlLmFwcGx5KHMsIGFyZ3VtZW50cykgOiBzLnF1ZXVlLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgcy52ZXJzaW9uID0gXCcxLjFcJyxcbiAgICAgICAgICAgIHMucXVldWUgPSBbXSxcbiAgICAgICAgICAgIHUgPSB0LmNyZWF0ZUVsZW1lbnQobiksXG4gICAgICAgICAgICB1LmFzeW5jID0gITAsXG4gICAgICAgICAgICB1LnNyYyA9IF9wcml2YXRlLmJhc2VVcmwsXG4gICAgICAgICAgICBhID0gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShuKVswXSxcbiAgICAgICAgICAgIGEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodSwgYSlcbiAgICAgICAgICApXG4gICAgICAgIH0od2luZG93LCBkb2N1bWVudCwgXCdzY3JpcHRcJyk7XG4gICAgICAgIF9wcml2YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICBfcHJpdmF0ZS50cmFjayA9IGZ1bmN0aW9uIChpZCwgZXZlbnQpIHtcbiAgICAgIGlmICghX3ByaXZhdGUubG9hZGVkKSB7XG4gICAgICAgIF9wcml2YXRlLmxvYWQoKTtcbiAgICAgIH1cbiAgICAgIHR3cShcJ2luaXRcJywgaWQpO1xuICAgICAgdHdxKFwndHJhY2tcJywgZXZlbnQpO1xuICAgIH07XG4gICAgX3ByaXZhdGUuaW5pdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKCFfcHJpdmF0ZS5sb2FkZWQpIHtcbiAgICAgICAgdHUuaW5zZXJ0U2NyaXB0Q2FsbGJhY2soX3ByaXZhdGUuYmFzZVVybCwgZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF9wcml2YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0d3R0ci5jb252ZXJzaW9uLnRyYWNrUGlkKGlkLCB7XG4gICAgICAgICAgICAgIHR3X3NhbGVfYW1vdW50OiAwLFxuICAgICAgICAgICAgICB0d19vcmRlcl9xdWFudGl0eTogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfShpZCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgX3ByaXZhdGUuY2xpY2sgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChfcHJpdmF0ZS5sb2FkZWQpIHtcbiAgICAgICAgdHd0dHIuY29udmVyc2lvbi50cmFja1BpZChpZCwge1xuICAgICAgICAgIHR3X3NhbGVfYW1vdW50OiAwLFxuICAgICAgICAgIHR3X29yZGVyX3F1YW50aXR5OiAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogSW5pdGlsaXplIHRoZSBUd2l0dGVyIFBpeGVsIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgIGlkICAgIFR3aXR0ZXIgRGF0YSBQYXJ0bmVyIElELlxuICAgICAqL1xuICAgIF9wdWJsaWMudHJhY2tMb2FkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICB3aW5kb3cuX3R3aXR0ZXJfZGF0YV9wYXJ0bmVyX2lkID0gaWQ7XG4gICAgICBfcHJpdmF0ZS5pbml0KGlkKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICB9XG4gICAgX3B1YmxpYy50cmFja0V2ZW50ID0gZnVuY3Rpb24gKGlkLCBldmVudCkge1xuICAgICAgX3ByaXZhdGUudHJhY2soaWQsIGV2ZW50KTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lLCAiRXZlbnQiKTtcbiAgICB9XG4gICAgX3B1YmxpYy50cmFja0NsaWNrID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICB3aW5kb3cuX3R3aXR0ZXJfZGF0YV9wYXJ0bmVyX2lkID0gaWQ7XG4gICAgICBfcHJpdmF0ZS5jbGljayhpZCk7XG4gICAgICB3ZGcuYWRkVGFnRXhlY3V0ZWQoX3ByaXZhdGUudGFnTmFtZSwgIkNvbnZlcnNpb24iKTtcbiAgICB9XG4gICAgLy9Jbml0aWFsaXplc1xuICAgIHdkZy5hZGRUYWdJbmZvKF9wcml2YXRlLnRhZ05hbWUsICIyMDE4bWF5MjItdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogV0RHIExpbmtlZGluIFRhZ2dpbmcgRnJhbWV3b3JrLlxuICpcbiAqIExpbmtlZGluIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIExpbmtlZGluIFBpeGVsIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcubGlua2VkaW4gPSAoZnVuY3Rpb24gKHdkZywgdHUpIHtcbiAgICAvLyB2YXJpYWJsZXMgXG4gICAgdmFyIF9wcml2YXRlID0ge307XG4gICAgdmFyIF9wdWJsaWMgPSB7fTtcbiAgICBfcHJpdmF0ZS5iYXNlVXJsID0gImh0dHBzOi8vc25hcC5saWNkbi5jb20vbGkubG1zLWFuYWx5dGljcy9pbnNpZ2h0Lm1pbi5qcyI7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJMaW5rZWRpbiI7XG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBMaW5rZWRpbiBsaWJyYXJ5IGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAqL1xuICAgIF9wcml2YXRlLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICB0dS5pbnNlcnRTY3JpcHQoX3ByaXZhdGUuYmFzZVVybCk7XG4gICAgICAgIF9wcml2YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogSW5pdGlsaXplIHRoZSBMaW5rZWRpbiBQaXhlbCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gICBpZCAgICAgTGlua2VkaW4gRGF0YSBQYXJ0bmVyIElELlxuICAgICAqL1xuICAgIF9wdWJsaWMuaW5pdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgd2luZG93Ll9saW5rZWRpbl9kYXRhX3BhcnRuZXJfaWQgPSBpZDtcbiAgICAgIF9wcml2YXRlLmxvYWQoKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICB9XG5cbiAgICAvL0luaXRpYWxpemVzXG4gICAgd2RnLmFkZFRhZ0luZm8oX3ByaXZhdGUudGFnTmFtZSwgIjIwMThhcHIzMC12MSIpO1xuXG4gICAgcmV0dXJuIF9wdWJsaWM7XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsKTtcbn1cblxuLyoqXG4gKiBXREcgQmluZyBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBCaW5nIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIEJpbmcgUGl4ZWwgZnJhbWV3b3JrXG4gICAqL1xuICB3aW5kb3cud2RndGFnZ2luZy5iaW5nID0gKGZ1bmN0aW9uICh3ZGcsIHR1KSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL2JhdC5iaW5nLmNvbS9iYXQuanMiO1xuICAgIF9wcml2YXRlLmxvYWRlZCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLnRhZ05hbWUgPSAiQmluZyI7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIExvYWRzIEJpbmcgbGlicmFyeSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5sb2FkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICAoZnVuY3Rpb24gKHcsIGQsIHQsIHIsIHUpIHtcbiAgICAgICAgICB2YXIgZiwgbiwgaTtcbiAgICAgICAgICB3W3VdID0gd1t1XSB8fCBbXSwgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvID0ge1xuICAgICAgICAgICAgICB0aTogaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvLnEgPSB3W3VdLFxuICAgICAgICAgICAgICB3W3VdID0gbmV3IFVFVChvKSxcbiAgICAgICAgICAgICAgd1t1XS5wdXNoKCJwYWdlTG9hZCIpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgICBuID0gZC5jcmVhdGVFbGVtZW50KHQpLFxuICAgICAgICAgICAgbi5zcmMgPSByLFxuICAgICAgICAgICAgbi5hc3luYyA9IDEsXG4gICAgICAgICAgICBuLm9ubG9hZCA9IG4ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMucmVhZHlTdGF0ZTtcbiAgICAgICAgICAgICAgcyAmJiBzICE9PSAibG9hZGVkIiAmJiBzICE9PSAiY29tcGxldGUiIHx8IChmKCksIG4ub25sb2FkID0gbi5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGkgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpWzBdLFxuICAgICAgICAgICAgaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBpKTtcbiAgICAgICAgfSkod2luZG93LCBkb2N1bWVudCwgInNjcmlwdCIsIF9wcml2YXRlLmJhc2VVcmwsICJ1ZXRxIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogSW5pdGlsaXplIHRoZSBCaW5nIFBpeGVsIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgIGlkICAgQmluZyBQaXhlbCBJRC5cbiAgICAgKi9cbiAgICBfcHVibGljLmluaXQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIF9wcml2YXRlLmxvYWQoaWQpO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuICAgIH1cblxuICAgIC8vSW5pdGlhbGl6ZXNcbiAgICB3ZGcuYWRkVGFnSW5mbyhfcHJpdmF0ZS50YWdOYW1lLCAiMjAxOG1heTIyLXYxIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSkod2luZG93LndkZ3RhZ2dpbmcsIHdpbmRvdy53ZGd0YWdnaW5nLnV0aWwpO1xufVxuXG4vKipcbiAqIFdERyBDbGlja3RhbGUgVGFnZ2luZyBGcmFtZXdvcmsuXG4gKlxuICogQ2xpY2t0YWxlIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHNpbmNlICAgMDUtMTAtMjAxOFxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIENsaWNrdGFsZSBmcmFtZXdvcmtcbiAgICovXG4gIHdpbmRvdy53ZGd0YWdnaW5nLmNsaWNrdGFsZSA9IChmdW5jdGlvbiAod2RnLCB0dSkge1xuICAgIC8vIHZhcmlhYmxlcyBcbiAgICB2YXIgX3ByaXZhdGUgPSB7fTtcbiAgICB2YXIgX3B1YmxpYyA9IHt9O1xuICAgIF9wcml2YXRlLmJhc2VVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA9PSBcJ2h0dHBzOlwnID8gXCdodHRwczovL2NkbnNzbC5jbGlja3RhbGUubmV0L1wnIDogXCdodHRwOi8vY2RuLmNsaWNrdGFsZS5uZXQvXCc7XG4gICAgX3ByaXZhdGUuYmFzZVVybCArPSBcJ3d3dzMyL3B0Yy9cJztcbiAgICBfcHJpdmF0ZS5kZWZhdWx0UGF0aCA9IFwnMTY4YTRkYjYtNWZlOC00M2RhLThkZmItMzBkNGM0MmQzZmViLmpzXCc7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJDbGlja3RhbGUiO1xuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qXG4gICAgICogTG9hZHMgQ2xpY2t0YWxlIGxpYnJhcnkgaWYgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICovXG4gICAgX3ByaXZhdGUubG9hZCA9IGZ1bmN0aW9uIChzY3JpcHRQYXRoKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICBpZiAodHlwZW9mICh3aW5kb3cuQ2xpY2tUYWxlQ3JlYXRlRE9NRWxlbWVudCkgIT0gImZ1bmN0aW9uIikge1xuICAgICAgICAgIHdpbmRvdy5DbGlja1RhbGVDcmVhdGVET01FbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcJywgdGFnTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LldSSW5pdFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgICBzY3JpcHRFbGVtZW50ID0gQ2xpY2tUYWxlQ3JlYXRlRE9NRWxlbWVudChcJ3NjcmlwdFwnKTtcbiAgICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7XG4gICAgICAgIGlmIChzY3JpcHRQYXRoICE9IHVuZGVmaW5lZCAmJiBzY3JpcHRQYXRoICE9IG51bGwgJiYgdHUudHJpbShzY3JpcHRQYXRoKSAhPSB1bmRlZmluZWQgJiYgdHUudHJpbShzY3JpcHRQYXRoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSBfcHJpdmF0ZS5iYXNlVXJsICsgc2NyaXB0UGF0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY3JpcHRFbGVtZW50LnNyYyA9IF9wcml2YXRlLmJhc2VVcmwgKyBfcHJpdmF0ZS5kZWZhdWx0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ2JvZHlcJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICAgIF9wcml2YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogSW5pdGlsaXplIHRoZSBDbGlja3RhbGUgdGFnLlxuICAgICAqL1xuICAgIF9wdWJsaWMuaW5pdCA9IGZ1bmN0aW9uIChzY3JpcHRQYXRoKSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5DbGlja1RhbGVHbG9iYWwgPT0gXCd1bmRlZmluZWRcJykge1xuICAgICAgICBfcHJpdmF0ZS5sb2FkKHNjcmlwdFBhdGgpO1xuICAgICAgICB3ZGcuYWRkVGFnRXhlY3V0ZWQoX3ByaXZhdGUudGFnTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9Jbml0aWFsaXplc1xuICAgIHdkZy5hZGRUYWdJbmZvKF9wcml2YXRlLnRhZ05hbWUsICIyMDE4bWF5MTAtdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogV0RHIENvbXNjb3JlIFRhZ2dpbmcgRnJhbWV3b3JrLlxuICpcbiAqIENvbXNjb3JlIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIENvbXNjb3JlIFBpeGVsIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcuY29tc2NvcmUgPSAoZnVuY3Rpb24gKHdkZywgdHUpIHtcbiAgICAvLyB2YXJpYWJsZXMgXG4gICAgdmFyIF9wcml2YXRlID0ge307XG4gICAgdmFyIF9wdWJsaWMgPSB7fTtcbiAgICBfcHJpdmF0ZS5wYXRoID0gIi8vd3d3Lm1pY3Jvc29mdC5jb20vbGlicmFyeS9zdnkvIjtcbiAgICBfcHJpdmF0ZS5zUHJlQnJva2VyRmlsZSA9ICJwcmVfYnJva2VyLmpzIjtcbiAgICBfcHJpdmF0ZS5zQnJva2VyRmlsZSA9ICJicm9rZXIuanMiO1xuICAgIF9wcml2YXRlLmxvYWRlZCA9IGZhbHNlO1xuICAgIF9wcml2YXRlLnRhZ05hbWUgPSAiQ29tc2NvcmUiO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBDb21zY29yZSBsaWJyYXJ5IGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAqL1xuICAgIF9wcml2YXRlLmxvYWQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgaWYgKCFfcHJpdmF0ZS5sb2FkZWQpIHtcbiAgICAgICAgX3ByaXZhdGUucGF0aCA9IHBhdGggfHwgX3ByaXZhdGUucGF0aDtcbiAgICAgICAgX3ByaXZhdGUucGF0aCA9ICgvXFwvJC8udGVzdChfcHJpdmF0ZS5wYXRoKSA/IF9wcml2YXRlLnBhdGggOiBfcHJpdmF0ZS5wYXRoICsgIi8iKTtcbiAgICAgICAgdHUuaW5zZXJ0U2NyaXB0Q2FsbGJhY2soX3ByaXZhdGUucGF0aCArIF9wcml2YXRlLnNQcmVCcm9rZXJGaWxlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHUuaW5zZXJ0U2NyaXB0KF9wcml2YXRlLnBhdGggKyBfcHJpdmF0ZS5zQnJva2VyRmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogSW5pdGlsaXplIHRoZSBDb21zY29yZSBQaXhlbCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gIGlkICBDb21zY29yZSBQaXhlbCBJRC5cbiAgICAgKi9cbiAgICBfcHVibGljLmluaXQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgX3ByaXZhdGUubG9hZChwYXRoKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICB9XG4gICAgLy9Jbml0aWFsaXplc1xuICAgIHdkZy5hZGRUYWdJbmZvKF9wcml2YXRlLnRhZ05hbWUsICIyMDE4bWF5MjItdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogV0RHIEdvb2dsZSBDb252ZXJzaW9uIFRhZ2dpbmcgRnJhbWV3b3JrLlxuICpcbiAqIEdvb2dsZSBDb252ZXJzaW9uIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIEdvb2dsZSBDb252ZXJzaW9uIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcuZ29vZ2xlID0gKGZ1bmN0aW9uICh3LCB3ZGcsIHR1KSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUuYmFzZVVybCA9ICIvL3d3dy5nb29nbGVhZHNlcnZpY2VzLmNvbS9wYWdlYWQvY29udmVyc2lvbl9hc3luYy5qcyI7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUudHJhY2tlZENvbnZPYmpzID0gW107XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJHb29nbGUiO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBHb29nbGUgbGlicmFyeSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS50cmFja0NvbnYgPSBmdW5jdGlvbiAoaW5Db252T2JqKSB7XG4gICAgICBfcHJpdmF0ZS50cmFja2VkQ29udk9ianMucHVzaChpbkNvbnZPYmopO1xuICAgICAgaWYgKHR5cGVvZiB3Lmdvb2dsZV90cmFja0NvbnZlcnNpb24gPT0gImZ1bmN0aW9uIikge1xuICAgICAgICB3Lmdvb2dsZV90cmFja0NvbnZlcnNpb24oaW5Db252T2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghX3ByaXZhdGUubG9hZGVkKSB7XG4gICAgICAgICAgdHUuaW5zZXJ0U2NyaXB0Q2FsbGJhY2soX3ByaXZhdGUuYmFzZVVybCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdy5nb29nbGVfdHJhY2tDb252ZXJzaW9uKGluQ29udk9iaik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX3ByaXZhdGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIFRyYWNrcyBHb29nbGUgUGFnZSB2aWV3XG4gICAgICpcbiAgICAgKi9cbiAgICBfcHVibGljLnRyYWNrID0gZnVuY3Rpb24gKGlkLCBsYWJlbCwgaXNSZW1hcmtldGluZywgbGFuZykge1xuICAgICAgdmFyIGdjbyA9IHt9O1xuICAgICAgZ2NvLmdvb2dsZV9jb252ZXJzaW9uX2lkID0gaWQ7XG4gICAgICBpZiAobGFiZWwgIT0gdW5kZWZpbmVkICYmIGxhYmVsICE9IG51bGwpIHtcbiAgICAgICAgZ2NvLmdvb2dsZV9jb252ZXJzaW9uX2xhYmVsID0gbGFiZWw7XG4gICAgICB9XG4gICAgICBnY28uZ29vZ2xlX2NvbnZlcnNpb25fZm9ybWF0ID0gIjMiO1xuICAgICAgaWYgKGxhbmcgIT0gdW5kZWZpbmVkICYmIGxhbmcgIT0gbnVsbCkge1xuICAgICAgICBnY28uZ29vZ2xlX2NvbnZlcnNpb25fbGFuZ3VhZ2UgPSBsYW5nO1xuICAgICAgfVxuICAgICAgZ2NvLmdvb2dsZV9yZW1hcmtldGluZ19vbmx5ID0gaXNSZW1hcmtldGluZztcbiAgICAgIF9wcml2YXRlLnRyYWNrQ29udihnY28pO1xuICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUsICJDb252ZXJzaW9uIik7XG4gICAgfTtcblxuICAgIC8vSW5pdGlhbGl6ZXNcbiAgICB3ZGcuYWRkVGFnSW5mbyhfcHJpdmF0ZS50YWdOYW1lLCAiMjAxOGFwcjMwLXYxIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSkod2luZG93LCB3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogV0RHIE1hcmtldG8gVGFnZ2luZyBGcmFtZXdvcmsuXG4gKlxuICogTWFya2V0byB0YWdnaW5nIGZyYW1ld29yayBmb3IgV0RHIHdlYnNpdGVzLlxuICpcbiAqIEBhdXRob3IgIFdERyBUYWdnaW5nICYgQW5hbHl0aWNzIFRlYW1cbiAqIEB2ZXJzaW9uIDEuMFxuICovXG5pZiAod2luZG93LndkZ3RhZ2dpbmcgIT0gbnVsbCkge1xuICAvKlxuICAgKiBSZWdpc3RlcnMgYSBMaW5rZWRpbiBQaXhlbCBmcmFtZXdvcmtcbiAgICovXG4gIHdpbmRvdy53ZGd0YWdnaW5nLm1hcmtldG8gPSAoZnVuY3Rpb24gKHdkZywgdHUpIHtcbiAgICAvLyB2YXJpYWJsZXMgXG4gICAgdmFyIF9wcml2YXRlID0ge307XG4gICAgdmFyIF9wdWJsaWMgPSB7fTtcbiAgICBfcHJpdmF0ZS5iYXNlVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy9tdW5jaGtpbi5tYXJrZXRvLm5ldC9tdW5jaGtpbi5qcyI7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBfcHJpdmF0ZS50YWdOYW1lID0gIk1hcmtldG8iO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBsaWJyYXJ5IGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAqL1xuICAgIF9wcml2YXRlLmxvYWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmICghX3ByaXZhdGUubG9hZGVkKSB7XG4gICAgICAgIHR1Lmluc2VydFNjcmlwdENhbGxiYWNrKF9wcml2YXRlLmJhc2VVcmwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIV9wcml2YXRlLmluaXRpYWxpemVkICYmIHR5cGVvZiAoTXVuY2hraW4pICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgX3ByaXZhdGUuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgTXVuY2hraW4uaW5pdChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgX3ByaXZhdGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBJbml0aWxpemUgdGhlIE1hcmtldG8gdGFnLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9ICAgaWQgICAgIE1hcmtldG8gSUQuXG4gICAgICovXG4gICAgX3B1YmxpYy5pbml0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBfcHJpdmF0ZS5sb2FkKGlkKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICB9XG5cbiAgICAvL0luaXRpYWxpemVzXG4gICAgd2RnLmFkZFRhZ0luZm8oX3ByaXZhdGUudGFnTmFtZSwgIjIwMThqdW5lMTEtdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogV0RHIERBTiBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBEQU4gdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgREFOIFBpeGVsIGZyYW1ld29ya1xuICAgKi9cbiAgd2luZG93LndkZ3RhZ2dpbmcuZGFuID0gKGZ1bmN0aW9uICh3ZGcsIHR1KSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJEQU4iO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBEQU4gbGlicmFyeSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgKi9cbiAgICBfcHJpdmF0ZS5sb2FkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICAoZnVuY3Rpb24gKGQsIGMpIHtcbiAgICAgICAgICB2YXJcbiAgICAgICAgICAgIGEgPSB3aW5kb3csXG4gICAgICAgICAgICBiID0gZG9jdW1lbnQsXG4gICAgICAgICAgICBzID0gInNjcmlwdCIsXG4gICAgICAgICAgICBhID0gYVtkXSA9IGFbZF0gfHwge307XG4gICAgICAgICAgYS5jID0ge307XG4gICAgICAgICAgYS5jW2NdID0ge307XG4gICAgICAgICAgYS5jW2NdLmQgPSBbXTtcbiAgICAgICAgICBhLmNbY10uZC5wdXNoKCJpbml0OiIgKyAobmV3IERhdGUpLmdldFRpbWUoKSk7XG4gICAgICAgICAgYSA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF07XG4gICAgICAgICAgYiA9IGIuY3JlYXRlRWxlbWVudChzKTtcbiAgICAgICAgICBiLmFzeW5jID0gITA7XG4gICAgICAgICAgYi5zcmMgPSAiLy90LmEzY2xvdWQubmV0LyIgKyBjICsgIi90YWcuanM/bnM9IiArIGQ7XG4gICAgICAgICAgYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLCBhKTtcbiAgICAgICAgfSkoImFtIiwgaWQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEluaXRpbGl6ZSB0aGUgREFOIFBpeGVsIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgIGlkICAgZGFuIFBpeGVsIElELlxuICAgICAqL1xuICAgIF9wdWJsaWMuaW5pdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKCEvQU0tL2kudGVzdChpZCkpIHtcbiAgICAgICAgaWQgPSAiQU0tIiArIGlkO1xuICAgICAgfVxuXG4gICAgICBfcHJpdmF0ZS5sb2FkKGlkKTtcbiAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICB9XG5cbiAgICAvL0luaXRpYWxpemVzXG4gICAgd2RnLmFkZFRhZ0luZm8oX3ByaXZhdGUudGFnTmFtZSwgIjIwMThtYXkyMi12MSIpO1xuXG4gICAgcmV0dXJuIF9wdWJsaWM7XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsKTtcbn1cblxuLyoqXG4gKiBXREcgQXBwTmV4dXMgVGFnZ2luZyBGcmFtZXdvcmsuXG4gKlxuICogQXBwTmV4dXMgdGFnZ2luZyBmcmFtZXdvcmsgZm9yIFdERyB3ZWJzaXRlcy5cbiAqXG4gKiBAYXV0aG9yICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAxLjBcbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgLypcbiAgICogUmVnaXN0ZXJzIGEgQXBwTmV4dXMgUGl4ZWwgZnJhbWV3b3JrXG4gICAqL1xuICB3aW5kb3cud2RndGFnZ2luZy5hcHBuZXh1cyA9IChmdW5jdGlvbiAod2RnLCB0dSkge1xuICAgIC8vIHZhcmlhYmxlcyBcbiAgICB2YXIgX3ByaXZhdGUgPSB7fTtcbiAgICB2YXIgX3B1YmxpYyA9IHt9O1xuICAgIF9wcml2YXRlLnRhZ05hbWUgPSAiQXBwTmV4dXMiO1xuICAgIF9wcml2YXRlLmJhc2VVcmwgPSAiaHR0cHM6Ly9zZWN1cmUuYWRueHMuY29tL3B4PyI7XG4gICAgX3ByaXZhdGUubG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaXZhdGUgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKlxuICAgICAqIExvYWRzIEFwcE5leHVzIEltYWdlIFJlcXVlc3Qgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICovXG4gICAgX3ByaXZhdGUubG9hZCA9IGZ1bmN0aW9uIChpZCwgc2VnKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICB0dS5yZXF1ZXN0SW1hZ2UoX3ByaXZhdGUuYmFzZVVybCArICJpZD0iICsgaWQgKyAiJnNlZz0iICsgc2VnICsgIiZ0PTIiKTtcbiAgICAgICAgd2RnLmFkZFRhZ0V4ZWN1dGVkKF9wcml2YXRlLnRhZ05hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKlxuICAgICAqIEluaXRpbGl6ZSB0aGUgQXBwTmV4dXMgUGl4ZWwgdGFnIFBhZ2VWaWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkIEFwcE5leHVzIFBpeGVsIElELlxuICAgICAqL1xuICAgIF9wdWJsaWMuaW5pdCA9IGZ1bmN0aW9uIChpZCwgc2VnKSB7XG4gICAgICBfcHJpdmF0ZS5sb2FkKGlkLCBzZWcpO1xuICAgIH07XG5cbiAgICAvL0luaXRpYWxpemVzXG4gICAgd2RnLmFkZFRhZ0luZm8oX3ByaXZhdGUuYmFzZVVybCwgIjIwMThtYXkyMi12MSIpO1xuXG4gICAgcmV0dXJuIF9wdWJsaWM7XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsKTtcbn1cblxuLyoqXG4gKiBXREcgTWF0aFRhZyBUYWdnaW5nIEZyYW1ld29yay5cbiAqXG4gKiBNYXRoVGFnIHRhZ2dpbmcgZnJhbWV3b3JrIGZvciBXREcgd2Vic2l0ZXMuXG4gKlxuICogQGF1dGhvciAgV0RHIFRhZ2dpbmcgJiBBbmFseXRpY3MgVGVhbVxuICogQHZlcnNpb24gMS4wXG4gKi9cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIC8qXG4gICAqIFJlZ2lzdGVycyBhIE1hdGhUYWcgUGl4ZWwgZnJhbWV3b3JrXG4gICAqL1xuICB3aW5kb3cud2RndGFnZ2luZy5tYXRodGFnID0gKGZ1bmN0aW9uICh3ZGcsIHR1KSB7XG4gICAgLy8gdmFyaWFibGVzIFxuICAgIHZhciBfcHJpdmF0ZSA9IHt9O1xuICAgIHZhciBfcHVibGljID0ge307XG4gICAgX3ByaXZhdGUudGFnTmFtZSA9ICJNYXRoVGFnIjtcbiAgICBfcHJpdmF0ZS5iYXNlVXJsID0gIi8vcGl4ZWwubWF0aHRhZy5jb20vZXZlbnQvanM/IjtcbiAgICBfcHJpdmF0ZS5sb2FkZWQgPSBmYWxzZTtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qXG4gICAgICogTG9hZHMgTWF0aFRhZyBJbWFnZSBSZXF1ZXN0IG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAqL1xuICAgIF9wcml2YXRlLmxvYWQgPSBmdW5jdGlvbiAobXRpZCwgYWRpZCkge1xuICAgICAgaWYgKCFfcHJpdmF0ZS5sb2FkZWQpIHtcbiAgICAgICAgdHUuaW5zZXJ0U2NyaXB0KF9wcml2YXRlLmJhc2VVcmwgKyAibXRfaWQ9IiArIG10aWQgKyAiJm10X2FkaWQ9IiArIGFkaWQgKyAiJm10X2V4ZW09Jm10X2V4Y2w9JnYxPSZ2Mj0mdjM9JnMxPSZzMj0mczM9Iik7XG4gICAgICAgIF9wcml2YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHdkZy5hZGRUYWdFeGVjdXRlZChfcHJpdmF0ZS50YWdOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBJbml0aWxpemUgdGhlIE1hdGhUYWcgUGl4ZWwgdGFnIFBhZ2VWaWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkIE1hdGhUYWcgUGl4ZWwgSUQuXG4gICAgICovXG4gICAgX3B1YmxpYy5pbml0ID0gZnVuY3Rpb24gKG10aWQsIGFkaWQpIHtcbiAgICAgIF9wcml2YXRlLmxvYWQobXRpZCwgYWRpZCk7XG4gICAgfTtcblxuICAgIC8vSW5pdGlhbGl6ZXNcbiAgICB3ZGcuYWRkVGFnSW5mbyhfcHJpdmF0ZS50YWdOYW1lLCAiMjAxOG1heTIyLXYxIik7XG5cbiAgICByZXR1cm4gX3B1YmxpYztcbiAgfSkod2luZG93LndkZ3RhZ2dpbmcsIHdpbmRvdy53ZGd0YWdnaW5nLnV0aWwpO1xufVxuXG4vKipcbiAqIE1MU0QgQ2xhcml0eSBUYWdnaW5nIEZyYW1ld29yay4gKlxuICogQGF1dGhvciAgTUxTRCBUYWdnaW5nICYgQW5hbHl0aWNzIFRlYW1cbiAqIEB2ZXJzaW9uIDEuMFxuICovXG5pZiAod2luZG93LndkZ3RhZ2dpbmcgIT0gbnVsbCkge1xuICB3aW5kb3cud2RndGFnZ2luZy5hdHRhY2hDbGFyU2NyaXB0ID0gZnVuY3Rpb24gKGMsIGwsIGEsIHIsIGksIHQsIHkpIHtcbiAgICBjW2FdID0gY1thXSB8fCBmdW5jdGlvbiAoKSB7IChjW2FdLnEgPSBjW2FdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKSB9O1xuICAgIHQgPSBsLmNyZWF0ZUVsZW1lbnQocik7XG4gICAgdC5hc3luYyA9IDE7XG4gICAgdC5zcmMgPSAiaHR0cHM6Ly93d3cuY2xhcml0eS5tcy90YWcvIiArIGk7XG4gICAgeSA9IGwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtcbiAgICB5LmFwcGVuZCh0KTtcblxuICAgIHdpbmRvdy53ZGd0YWdnaW5nLmFkZFRhZ0V4ZWN1dGVkKCJDbGFyaXR5VGFnIik7XG4gIH07XG4gIHdpbmRvdy53ZGd0YWdnaW5nLmNsYXJpdHlUYWcgPSAoZnVuY3Rpb24gKHdkZywgdHUpIHtcbiAgICAvLyB2YXJpYWJsZXMgXG4gICAgdmFyIF9wcml2YXRlID0ge307XG4gICAgdmFyIF9wdWJsaWMgPSB7fTtcbiAgICBfcHJpdmF0ZS50YWdOYW1lID0gIkNsYXJpdHlUYWciO1xuICAgIF9wcml2YXRlLmxvYWRlZCA9IGZhbHNlO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLypcbiAgICAgKiBMb2FkcyBDbGFyaXR5VGFnIFNjcmlwdCBSZXF1ZXN0IG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAqL1xuICAgIF9wcml2YXRlLmxvYWQgPSBmdW5jdGlvbiAoY2xhcml0eUlkKSB7XG4gICAgICBpZiAoIV9wcml2YXRlLmxvYWRlZCkge1xuICAgICAgICAoZnVuY3Rpb24gKGMsIGwsIGEsIHIsIGksIHQsIHkpIHtcbiAgICAgICAgICBjW2FdID0gY1thXSB8fCBmdW5jdGlvbiAoKSB7IChjW2FdLnEgPSBjW2FdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKSB9O1xuICAgICAgICAgIHQgPSBsLmNyZWF0ZUVsZW1lbnQocik7XG4gICAgICAgICAgdC5hc3luYyA9IDE7XG4gICAgICAgICAgdC5zcmMgPSAiaHR0cHM6Ly93d3cuY2xhcml0eS5tcy90YWcvIiArIGk7XG4gICAgICAgICAgeSA9IGwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtcbiAgICAgICAgICB5LmFwcGVuZCh0KTtcbiAgICAgICAgfSkod2luZG93LCBkb2N1bWVudCwgImNsYXJpdHkiLCAic2NyaXB0IiwgY2xhcml0eUlkKTtcblxuICAgICAgICBfcHJpdmF0ZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB3ZGcuYWRkVGFnRXhlY3V0ZWQoX3ByaXZhdGUudGFnTmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wdWJsaWMuaW5pdCA9IGZ1bmN0aW9uIChjbGFyaXR5SWQpIHtcbiAgICAgIF9wcml2YXRlLmxvYWQoY2xhcml0eUlkKTtcbiAgICB9O1xuXG4gICAgLy9Jbml0aWFsaXplc1xuICAgIHdkZy5hZGRUYWdJbmZvKF9wcml2YXRlLnRhZ05hbWUsICIyMDE4bWF5MjItdjEiKTtcblxuICAgIHJldHVybiBfcHVibGljO1xuICB9KSh3aW5kb3cud2RndGFnZ2luZywgd2luZG93LndkZ3RhZ2dpbmcudXRpbCk7XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2hvbGUgY29va2llIGNvbnNlbnQgc2NyaXB0XG4gKiBpZiBjb29raWUgY29uc2VudCBoYXMgYmVlbiBhY2NlcHRlZCAiYWxsIiwgZmlyZSBhbGwgZnVuY3Rpb24gaW4gdGhlIHF1ZXVlIGFuZCBmbGlwIHRoZSBzdGF0dXMgdG8gdHJ1ZVxuICogaWYgaXQgaGFzIGJlZW4gYWNjZXB0ZWQgYSAic3BlY2lmaWMiLCBmaXJlIGFsbCBmdW5jdGlvbiBpbiB0aGF0IHNwZWNpZmljIHF1ZXVlIGFuZCBmbGlwIHRoYXQgc3RhdHVzIHRvIHRydWVcbiAqIGlmIHdpbmRvdy5zaXRlQ29uc2VudCBPYmplY3QgaXMgbm90IGF2YWlsYWJsZSwgaXQgd2lsbCBjaGVjayB0aGUgb2JqZWN0IGZvciA1IHNlY29uZCBpbiBldmVyeSAxMCBtaWxsaXNlY29uZC5cbiAqL1xuaWYgKHdpbmRvdy53ZGd0YWdnaW5nICE9IG51bGwpIHtcbiAgd2luZG93LndkZ3RhZ2dpbmcuV0RHQ29va2llQ29uc2VudENoZWNrID0gKGZ1bmN0aW9uICh3ZGcsIHR1KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBvYmplY3QgaG9sZCBhbGwgU2l0ZUNvbnNlbnQgZGF0YSBzdHJ1Y3R1cmVcbiAgICAgICAqIEB0eXBlIHt7YW5hbHl0aWNzOiB7d2NwQ2F0U3RyaW5nOiBzdHJpbmcsIHF1ZXVlOiBbXSwgc3RhdHVzOiBib29sZWFufSxcbiAgICAgICAqICAgICAgIHNvY2lhbG1lZGlhOiB7d2NwQ2F0U3RyaW5nOiBzdHJpbmcsIHF1ZXVlOiBbXSwgc3RhdHVzOiBib29sZWFufSxcbiAgICAgICAqICAgICAgIGFkdmVydGlzaW5nOiB7d2NwQ2F0U3RyaW5nOiBzdHJpbmcsIHF1ZXVlOiBbXSwgc3RhdHVzOiBib29sZWFufX19XG4gICAgICAgKi9cbiAgICAgIHdkZy5jYXRlZ29yeSA9IHtcbiAgICAgICAgInNvY2lhbG1lZGlhIjogeyAid2NwQ2F0U3RyaW5nIjogIlNvY2lhbE1lZGlhIiwgInN0YXR1cyI6IGZhbHNlLCAicXVldWUiOiBbXSB9LFxuICAgICAgICAiYW5hbHl0aWNzIjogeyAid2NwQ2F0U3RyaW5nIjogIkFuYWx5dGljcyIsICJzdGF0dXMiOiBmYWxzZSwgInF1ZXVlIjogW10gfSxcbiAgICAgICAgImFkdmVydGlzaW5nIjogeyAid2NwQ2F0U3RyaW5nIjogIkFkdmVydGlzaW5nIiwgInN0YXR1cyI6IGZhbHNlLCAicXVldWUiOiBbXSB9LFxuICAgICAgICAiYWxsQ2F0ZWdvcnkiOiB7ICJ3Y3BDYXRTdHJpbmciOiAiQWxsIiwgInN0YXR1cyI6IGZhbHNlLCAicXVldWUiOiBbXSB9XG4gICAgICB9O1xuICAgICAgLy8gQW4gYXJyYXkgaG9sZGluZyBhbGwgZGlmZmVyZW50IHNpdGVDb25zZW50IGNhdGVnb3J5XG4gICAgICB3ZGcuY2F0T3JkZXIgPSBbInNvY2lhbG1lZGlhIiwgImFuYWx5dGljcyIsICJhZHZlcnRpc2luZyJdO1xuICAgICAgLy8gQSBjb3VudGVyIGZvciB0aGUgV2NwU2l0ZUNvbnNlbnQgb2JqZWN0IGNoZWNraW5nIGxvb3BcbiAgICAgIHdkZy5zaXRlQ29uc2VudExvb3BDb3VudCA9IDA7XG4gICAgICBcbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZnVuY3Rpb24gaXMgcmVhZHkgdG8gZmlyZSBvciBpZiBpdCBuZWVkcyBwdXNoZWRcbiAgICAgICAqL1xuICAgICAgd2RnLmNhdENoZWNrQWxsRXhlY3V0ZU9yUHVzaCA9IGZ1bmN0aW9uIChmdW5jVG9FeGVjdXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHdkZy5jYXRlZ29yeV9hbGxfc3RhdHVzKSB7XG4gICAgICAgICAgICBmdW5jVG9FeGVjdXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2RnLmNhdGVnb3J5LmFsbENhdGVnb3J5LnF1ZXVlLnB1c2goZnVuY1RvRXhlY3V0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKXtcbiAgICAgICAgICB0dS5kZWJ1Z0xvZygiRXJyb3Igd2hlbiBjaGVja2luZyBjb25zZW50IG9mIHF1ZXVlaW5nOiAiICsgZnVuY1RvRXhlY3V0ZS5uYW1lICsgIi4gRXJyb3I6IiArIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIHRoZSBzaXRlQ29uc2VudCBvYmplY3QgaXMgYXZhaWxhYmxlIG9yIG5vdFxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIHR1LmNoZWNrU2l0ZUNvbnNlbnRPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93LnNpdGVDb25zZW50ID09PSAib2JqZWN0IiAmJiB3aW5kb3cuc2l0ZUNvbnNlbnQgIT09IG51bGwgJiYgdHlwZW9mIHdpbmRvdy5zaXRlQ29uc2VudC5nZXRDb25zZW50Rm9yID09IFwnZnVuY3Rpb25cJztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgYSBzcGVjaWZpYyB0eXBlIG9mIHRoZSBjb25zZW50IGhhcyBiZWVuIGFjY2VwdFxuICAgICAgICogQHBhcmFtIGNhdGVnb3J5U3RyaW5nIHdoaWNoIGlzIHRoZSBzaXRlQ29uc2VudCB0eXBlIGluIGxvd2VyIGNhc2VcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoYXQgdHlwZSBvZiBjb29raWUgY29uc2VudCBoYXMgYmVlbiBhY2NlcHRlZCwgb3RoZXJ3aXNlIHJldHVybiBmbGFzZS5cbiAgICAgICAqL1xuICAgICAgdHUuY2hlY2tDb25zZW50U3RhdHVzID0gZnVuY3Rpb24gKGNhdGVnb3J5U3RyaW5nKSB7XG4gICAgICAgIHdkZy5jYXRlZ29yeVtjYXRlZ29yeVN0cmluZ10uc3RhdHVzID0gd2luZG93LnNpdGVDb25zZW50LmdldENvbnNlbnRGb3Iod2RnLmNhdGVnb3J5W2NhdGVnb3J5U3RyaW5nXS53Y3BDYXRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gd2RnLmNhdGVnb3J5W2NhdGVnb3J5U3RyaW5nXS5zdGF0dXM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEZpcmUgIkFsbCIgZnVuY3Rpb24gaW4gYSAiU1BFQ0lGSUMiIHR5cGUgb2YgdGhlIGNvbnNlbnQgcXVldWVcbiAgICAgICAqIEBwYXJhbSBjYXRlZ29yeVN0cmluZyBpbiB3ZGcuY2F0ZWdvcnkgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHR1LmZpcmVDYXRlZ29yeUZ1bmN0aW9uID0gZnVuY3Rpb24gKGNhdGVnb3J5U3RyaW5nKSB7XG4gICAgICAgIHZhciBleGVjdXRlRnVuY3Rpb247XG4gICAgICAgIHdoaWxlICh3ZGcuY2F0ZWdvcnlbY2F0ZWdvcnlTdHJpbmddLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBleGVjdXRlRnVuY3Rpb24gPSB3ZGcuY2F0ZWdvcnlbY2F0ZWdvcnlTdHJpbmddLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgZXhlY3V0ZUZ1bmN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgIkFMTCIgdHlwZSBvZiB0aGUgY29uc2VudCBzdGF0dXMgZnJvbSB3aW5kb3cuc2l0ZUNvbnNlbnRcbiAgICAgICAqIGFuZCBzZXQgdGhhdCBzdGF0dXMgaW50byB3ZGdcJ3MgY29uc2VudCBzdGF0dXNcbiAgICAgICAqIGlmIGl0XCdzIHRydWUsIGZpcmUgIkFMTCIgZnVuY3Rpb24gaW4gdGhhdCAiU1BFQ0lGSUMiIHR5cGUgb2YgdGhlIGNvbnNlbnQgcXVldWVcbiAgICAgICAqL1xuICAgICAgdHUuY2hlY2tXY3BTY1N0YXR1c0FuZEZpcmVGdW5jSW5RdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3ZGcuY2F0T3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodHUuY2hlY2tDb25zZW50U3RhdHVzKHdkZy5jYXRPcmRlcltpXSkpIHtcbiAgICAgICAgICAgIHR1LmZpcmVDYXRlZ29yeUZ1bmN0aW9uKHdkZy5jYXRPcmRlcltpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0dS5jaGVja0NvbnNlbnRTdGF0dXMoImFuYWx5dGljcyIpICYmIHR1LmNoZWNrQ29uc2VudFN0YXR1cygiYWR2ZXJ0aXNpbmciKSAmJiB0dS5jaGVja0NvbnNlbnRTdGF0dXMoInNvY2lhbG1lZGlhIikpIHtcbiAgICAgICAgICB0dS5maXJlQ2F0ZWdvcnlGdW5jdGlvbigiYWxsQ2F0ZWdvcnkiKTtcbiAgICAgICAgICB3ZGcuY2F0ZWdvcnlfYWxsX3N0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQSBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHNpdGVDb25zZW50IG9iamVjdFxuICAgICAgICovXG4gICAgICB2YXIgc2l0ZUNvbnNlbnRJbnRlcnZhbDtcbiAgICAgIHZhciBzZXRMb29wRm9yU2l0ZUNvbnNlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0dS5jaGVja1NpdGVDb25zZW50T2JqZWN0KCkpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNpdGVDb25zZW50SW50ZXJ2YWwpO1xuICAgICAgICAgIHR1LmNoZWNrV2NwU2NTdGF0dXNBbmRGaXJlRnVuY0luUXVldWUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZGcuc2l0ZUNvbnNlbnRMb29wQ291bnQgPiA1MDApIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNpdGVDb25zZW50SW50ZXJ2YWwpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdHUud2hlblNDTG9vcEV4Y2VlZGVkID09IFwnZnVuY3Rpb25cJykgeyB0dS53aGVuU0NMb29wRXhjZWVkZWQoKTsgfVxuICAgICAgICB9XG4gICAgICAgIHdkZy5zaXRlQ29uc2VudExvb3BDb3VudCsrO1xuICAgICAgfTtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGZ1bmN0aW9uIHdpbGwgc3RhcnQgY2hlY2tpbmcgdGhlIGNvb2tpZSBjb25zZW50IHN0YXR1cy5cbiAgICAgICAqIGl0IHdpbGwgbG9hZCB0aGUgZnVuY3Rpb24gaWYgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnNlbnQgaGFzIGJlZW4gYWNjZXB0ZWQuXG4gICAgICAgKiBpZiB0aGUgY29va2llIGNvbnNlbnQgaGFzIGJlZW4gYWNjZXB0ZWQgYWxsLCBhbGwgdHlwZSBvZiB0aGUgZnVuY3Rpb24gd2lsbCBiZSBsb2FkZWQuXG4gICAgICAgKi9cbiAgICAgIC8qKlxuICAgICAgICAqIEluIGNhc2UgaWYgbXNjYyBhbmQgc2l0ZWNvbnNlbnQgYm90aCBvYmplY3RzIGFyZSBsb2FkaW5nIHNsb3dcbiAgICAgICAgKiBhbmQgaWYgc2l0ZWNvbnNlbnQgaXMgbG9hZGluZyBmb3IgYm90aCBOb24tRVUgYW5kIEVVIFVzZXJzXG4gICAgICAgICogdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZGF0YSBlbGVtZW50IHdpdGggbmFtZSBVc2VNU0NDIHdoaWNoIHNpbXBseSByZXR1cm5zIGZhbHNlXG4gICAgICAgICogQ3JlYXRlIGRhdGEtZWxlbWVudCBvbmx5IGluc2lkZSB0aGUgYXBwbGljYWJsZSBzaXRlIHByb3BlcnR5XG4gICAgICAgICovXG4gICAgICB3ZGcudXNlTVNDQyA9ICh0eXBlb2YgX3NhdGVsbGl0ZS5nZXRWYXIoIlVzZU1TQ0MiKSA9PT0gInVuZGVmaW5lZCIpID8gdHJ1ZSA6IF9zYXRlbGxpdGUuZ2V0VmFyKCJVc2VNU0NDIik7XG4gICAgICB0dS5jaGVja1NpdGVDb25zZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHUuY2hlY2tTaXRlQ29uc2VudE9iamVjdCgpKSB7XG4gICAgICAgICAgdHUuY2hlY2tXY3BTY1N0YXR1c0FuZEZpcmVGdW5jSW5RdWV1ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCF3ZGcudXNlTVNDQykge1xuICAgICAgICAgIHNpdGVDb25zZW50SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChzZXRMb29wRm9yU2l0ZUNvbnNlbnQsIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93Lm1zY2MgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiB3aW5kb3cuc2l0ZUNvbnNlbnQgPT09ICJ1bmRlZmluZWQiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXNjYy5oYXNDb25zZW50ID09PSAiZnVuY3Rpb24iICYmIHdpbmRvdy5tc2NjLmhhc0NvbnNlbnQoKSkge1xuICAgICAgICAgICAgd2RnLmNhdGVnb3J5X2FsbF9zdGF0dXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaXRlQ29uc2VudEludGVydmFsID0gc2V0SW50ZXJ2YWwoc2V0TG9vcEZvclNpdGVDb25zZW50LCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cubXNjYyA9PT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIHdpbmRvdy5zaXRlQ29uc2VudCA9PT0gInVuZGVmaW5lZCIpIHtcbiAgICAgICAgICB3ZGcuY2F0ZWdvcnlfYWxsX3N0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHR1LmNoZWNrU2l0ZUNvbnNlbnQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsKTtcbn1cbicsbGFuZ3VhZ2U6ImphdmFzY3JpcHQifX1dfSx7aWQ6IlJMMDJmYmE1ZmRmZTM0NDMxNmFhMjViNzVjMDBhZmVkZmYiLG5hbWU6Ikdsb2JhbCBDb21zY29yZSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjUwfV0sY29uZGl0aW9uczpbXSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDMGQ4ZWUzN2QyODZhNDBlOWE1YmNmYTViZmZkOGE5NjMtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw2MzFhYmM1MWU3YzM0NzBjYmM4NzUxYzdhYmM0YzY3YSIsbmFtZToiR2xvYmFsIERhdGEgTGF5ZXIiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjJ9XSxjb25kaXRpb25zOltdLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOicvLyMgc291cmNlVVJMPU1sZERhdGFMYXllci5qc1xuLyoqXG4gKiBXREcgR2xvYmFsIERhdGEgTGF5ZXIuXG4gKlxuICogRGF0YWxheWVyIHRhZ2dpbmcgZm9yIFdERyB3ZWJzaXRlcy4gXG4gKlxuICogQGF1dGhvciAgICBXREcgVGFnZ2luZyAmIEFuYWx5dGljcyBUZWFtXG4gKiBAdmVyc2lvbiAgIDEuM1xuICovXG5cbmlmICh3aW5kb3cud2RndGFnZ2luZyAhPSBudWxsKSB7XG4gIChmdW5jdGlvbiAod2RnLCB0dSwgJCkge1xuICAgIC8qKlxuICAgICAqIEFkZGVkIGZvciBVUyAxNDEwNlxuICAgICAqIEB0b2RvIERlbGV0ZToyMDIxLTAzLTMwXG4gICAgICogZm9yIEhDTC4gU2luY2UgdGhlIGFjY2Vzc2liaWxpdHkgY2hlY2tlciBpcyB0aHJvd2luZyBhIGZhbHNlIHBvc2l0aXZlIGZvciB0aGVtIHdlIGhhdmUgZml4ZWQgaXQgdXNpbmcgdGhlIGNvZGUgYmVsb3cuTmVlZCB0byBjaGVjayBhZ2FpbiBpbiBNYXJjaCBpZiB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQgZnJvbSBBZG9iZS5cbiAgICAgKi9cbiAgICAkKCIuYXQtZmxpY2tlci1jb250cm9sIikuc2xpY2UoMSkucmVtb3ZlKCk7IFxuXG4gICAgdmFyIGVudiwgbGFuZ0xvYywgbGFuZywgbG9jLCBncG47XG4gICAgZW52ID0gKHdpbmRvdy5sb2NhdGlvbi5ob3N0ID09PSAid3d3Lm1pY3Jvc29mdC5jb20iKSA/ICJwcm9kIiA6ICJzdGFnaW5nIjtcblxuICAgIC8vTWFya2V0IC0gTGFuZ0xvY1xuICAgIHZhciB0UE5TcGxpdHMgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdCgiLyIpO1xuICAgIHZhciBpID0gKGVudiA9PT0gInByb2QiID8gMSA6IDIpO1xuICAgIC8vUmVkVGlnZXIgU3RhZ2luZyBlbnZpcm9ubWVudCBjb25kaXRpb25cbiAgICBpZiAoZW52ID09PSAic3RhZ2luZyIgJiYgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSAibWFya2V0aW5nc2l0ZXMtcHJvZC5taWNyb3NvZnQuY29tIilcbiAgICB7XG4gICAgICBpID0gMTtcbiAgICB9XG4gICAgbGFuZ0xvYyA9IHRQTlNwbGl0c1tpXTtcblxuICAgIGlmICghbGFuZ0xvYykge1xuICAgICAgbGFuZyA9ICIiO1xuICAgICAgbG9jID0gIiI7XG4gICAgfSBlbHNlIGlmIChsYW5nTG9jLm1hdGNoKC9eLi4tLiotLi4kLykpIHtcbiAgICAgIC8vc3BlY2lhbCBjYXNlIGZvciBzci1sYXRuLXJuXG4gICAgICBsYW5nID0gbGFuZ0xvYy5zcGxpdCgiLSIpWzBdO1xuICAgICAgbG9jID0gbGFuZ0xvYy5zcGxpdCgiLSIpWzJdO1xuICAgIH0gZWxzZSBpZiAobGFuZ0xvYy5tYXRjaCgvXi4uLS4qJC8pKSB7XG4gICAgICAvL2Fsc28gaW5jbHVkZXMgZW4td2VzdGluZGllc1xuICAgICAgbGFuZyA9IGxhbmdMb2Muc3BsaXQoIi0iKVswXTtcbiAgICAgIGxvYyA9IGxhbmdMb2Muc3BsaXQoIi0iKVsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFuZyA9ICIiO1xuICAgICAgbG9jID0gIiI7XG4gICAgfVxuXG4gICAgLy9QYWdlIG5hbWVcbiAgICBpID0gaSArIDI7XG4gICAgZ3BuID0gdHUudGxjU3RyKHRQTlNwbGl0c1tpXSwgImhvbWVwYWdlIik7XG4gICAgaWYgKGdwbiAhPT0gImhvbWVwYWdlIikge1xuICAgICAgaSsrO1xuICAgICAgd2hpbGUgKGkgPCB0UE5TcGxpdHMubGVuZ3RoKSB7XG4gICAgICAgIGdwbiArPSAiLyIgKyB0UE5TcGxpdHNbaV07XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICAgIGdwbiA9IHR1LnRsY1N0cihncG4pLnJlcGxhY2UoL1tcXC1fXS9nLCBcJyBcJyk7XG4gICAgfVxuXG4gICAgd2RnLnNldERhdGEoImVudiIsIGVudik7XG4gICAgd2RnLnNldERhdGEoImxhbmdMb2MiLCBsYW5nTG9jKTtcbiAgICB3ZGcuc2V0RGF0YSgibGFuZyIsIGxhbmcpO1xuICAgIHdkZy5zZXREYXRhKCJsb2MiLCBsb2MpO1xuICAgIHdkZy5zZXREYXRhKCJncG4iLCBncG4pO1xuXG4gIH0pKHdpbmRvdy53ZGd0YWdnaW5nLCB3aW5kb3cud2RndGFnZ2luZy51dGlsLCB3aW5kb3cualF1ZXJ5KTtcbn0nLGxhbmd1YWdlOiJqYXZhc2NyaXB0In19XX0se2lkOiJSTDcwZjliODdkZjg5MjQxOWVhM2Q3ZmRlMTZkNTZmNDM4IixuYW1lOiJHZXQgV2luZG93cyAxMCBPbGQgSE1DIixldmVudHM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzIixzZXR0aW5nczp7fSxydWxlT3JkZXI6NTB9XSxjb25kaXRpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFsdWVDb21wYXJpc29uLmpzIixzZXR0aW5nczp7Y29tcGFyaXNvbjp7b3BlcmF0b3I6ImlzRmFsc2UifSxsZWZ0T3BlcmFuZDoiJUpTTEwgUmVkVGlnZXIlIn19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDMzBiNjk2NTRkMTRhNDg5NWFlNjRiNmU1Y2YwY2Y4MTItc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw3M2Y5NjEzNDVhMTA0NDgyOGJmMTcwY2RiZTNiN2U0NSIsbmFtZToiR2xvYmFsIEpTTEwgUGFnZVZpZXciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjozfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhbHVlQ29tcGFyaXNvbi5qcyIsc2V0dGluZ3M6e2NvbXBhcmlzb246e29wZXJhdG9yOiJpc0ZhbHNlIn0sbGVmdE9wZXJhbmQ6IiVKU0xMIFJlZFRpZ2VyJSJ9fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzZmYjEyMjEzNzMwNDQ3MjliYzdmMjVmYjEwNGJhODU0LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMNjM4OGM0Y2Q2MDEyNDJlZWFlZTU5OWQ2YzJhMzBkMGIiLG5hbWU6IkNsYXJpdHkgTWVkaWEiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzRlZTA4ZjY2YjJkOTRlMDBhNGM5NmI0YjNhMTFhYTJkLXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMN2FiNTRiNDI0M2EwNDBlZTgxYjIzNDE5NTE1YWNlNGYiLG5hbWU6IldpbmRvd3MgSlNMTCBRVUlaIFRhZ2dpbmciLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1fV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhbHVlQ29tcGFyaXNvbi5qcyIsc2V0dGluZ3M6e2NvbXBhcmlzb246e29wZXJhdG9yOiJpc0ZhbHNlIn0sbGVmdE9wZXJhbmQ6IiVKU0xMIFJlZFRpZ2VyJSJ9fSx7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcyIsc2V0dGluZ3M6e3BhdGhzOlt7dmFsdWU6IlxcL3dpbmRvd3NcXC9nZXQtd2luZG93cy0xMFxcLz8iLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkMzOTBiYTg2OTlmNjQ0NzRkYmE4NjdmZWYzZTAxYzkyNC1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDZlZjcxOTIyNTBmNzQyYzM4YmQxOWM4ZjNiZWExYzVjIixuYW1lOiJGYWNlYm9vayBITUMgby02MCIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjYwfV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJcXC93aW5kb3dzXFwvaGVscC1tZS1jaG9vc2VcXC8/Iix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDYTcwMmFmYTAzM2E4NDVhY2IyMDMyM2VmZGNlYTYzOTctc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkxkMzAwN2E1YWEyZDQ0ODhhODEwMWZiZTE4MTk1NzllYyIsbmFtZToiQUFNIC0gR2V0IFdpbmRvd3MgMTAiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiL2VuLXVzXFwvd2luZG93c1xcL2dldC13aW5kb3dzLTEwIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDZjc2NDcxODA2Y2NhNDY5NGIxNDlkM2VhZTQ1YmJmYjgtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkxkOTdkYzcyYTk0NjU0ZjVjYjlkZDAzMGRhMWQ5MTExOCIsbmFtZToiVGVtcCBNZWRpYSBFTi1VUyBQYyA2Mzc5NDc0NSIsZXZlbnRzOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcyIsc2V0dGluZ3M6e30scnVsZU9yZGVyOjU2fV0sY29uZGl0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMiLHNldHRpbmdzOntwYXRoczpbe3ZhbHVlOiJlbi11c1xcL3dpbmRvd3NcXC9wYy02Mzc5NDc0NSIsdmFsdWVJc1JlZ2V4OiEwfV19fV0sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzIwZmI3ZDUwNzFlYTQ0MWJhZGVkN2QxOTc4NDA0OWM0LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfSx7aWQ6IlJMYzVkMDNjZjE0ZDk2NDg3MDk3NTRiYTdjODhlMTBiZjkiLG5hbWU6IlRlbXAgUGludGVyZXN0IFBjNjM3OTQ3NDUiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiZW4tdXNcXC93aW5kb3dzXFwvcGMtNjM3OTQ3NDUiLHZhbHVlSXNSZWdleDohMH1dfX1dLGFjdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzIixzZXR0aW5nczp7c291cmNlOiJodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNWVmMDkyZDFlZmI1L2U2YjRjYTc0Mzc4Yy9lN2NlYzJlNjNiMmYvUkM3MTM4MGVkN2Y1MDM0ZTAxYTQ3YTI0M2E0NTE4MjBjZi1zb3VyY2UubWluLmpzIixsYW5ndWFnZToiamF2YXNjcmlwdCIsaXNFeHRlcm5hbDohMH19XX0se2lkOiJSTDQ4MGZkM2I1NmQwMzQzMGZhNmYwMGY1MjQ1MzUxZTIyIixuYW1lOiJCaW5nIC0gRGV2aWNlcyBQRFBzICYgVmlldyBBbGwiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W3ttb2R1bGVQYXRoOiJjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzIixzZXR0aW5nczp7cGF0aHM6W3t2YWx1ZToiL3dpbmRvd3NcXC9mZWF0dXJlZC1kZXZpY2VzXFwvKGRlbGwteHBzLTEzKXwoaHAtc3BlY3RyZS14MzYwLTEzKXwoc2Ftc3VuZy1nYWxheHktdGFicHJvLXMpIix2YWx1ZUlzUmVnZXg6ITB9LHt2YWx1ZToiL3dpbmRvd3NcXC92aWV3LWFsbC1kZXZpY2VzIix2YWx1ZUlzUmVnZXg6ITB9XX19XSxhY3Rpb25zOlt7bW9kdWxlUGF0aDoiY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcyIsc2V0dGluZ3M6e3NvdXJjZToiaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzVlZjA5MmQxZWZiNS9lNmI0Y2E3NDM3OGMvZTdjZWMyZTYzYjJmL1JDMTkzMDdjMmVlNTIxNDI0NTgxZTllZWY2Y2JmMzcxNjgtc291cmNlLm1pbi5qcyIsbGFuZ3VhZ2U6ImphdmFzY3JpcHQiLGlzRXh0ZXJuYWw6ITB9fV19LHtpZDoiUkw2Zjg4NDU0MWUzNTc0NWFkYTljZTJmNjM0MDdiZmUzYSIsbmFtZToiVGVtcCBKdW5lMjEgRXZlbnQiLGV2ZW50czpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMiLHNldHRpbmdzOnt9LHJ1bGVPcmRlcjo1MH1dLGNvbmRpdGlvbnM6W10sYWN0aW9uczpbe21vZHVsZVBhdGg6ImNvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMiLHNldHRpbmdzOntzb3VyY2U6Imh0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS81ZWYwOTJkMWVmYjUvZTZiNGNhNzQzNzhjL2U3Y2VjMmU2M2IyZi9SQzAzM2UwMjA4ODE5YjQ3NmJhNWVmM2M4YmFiOWM3MTY2LXNvdXJjZS5taW4uanMiLGxhbmd1YWdlOiJqYXZhc2NyaXB0Iixpc0V4dGVybmFsOiEwfX1dfV19O3ZhciAkX19fdmFyXzgyZDI1YTg2NjU1MWE2ZjA9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtpZih0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixlLmdldD9lOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pfSksaX1mdW5jdGlvbiBlKG4pe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gbihlLGUuZXhwb3J0cyksZS5leHBvcnRzfWZ1bmN0aW9uIHQoZSl7dmFyIHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0LnJlc29sdmUoZSgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG59KX0sZnVuY3Rpb24obil7cmV0dXJuIHQucmVzb2x2ZShlKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdC5yZWplY3Qobil9KX0pfWZ1bmN0aW9uIHUobil7cmV0dXJuIEJvb2xlYW4obiYmInVuZGVmaW5lZCIhPXR5cGVvZiBuLmxlbmd0aCl9ZnVuY3Rpb24gaSgpe31mdW5jdGlvbiBhKG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7bi5hcHBseShlLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHIobil7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IGEgZnVuY3Rpb24iKTt0aGlzLl9zdGF0ZT0wLHRoaXMuX2hhbmRsZWQ9ITEsdGhpcy5fdmFsdWU9dW5kZWZpbmVkLHRoaXMuX2RlZmVycmVkcz1bXSxwKG4sdGhpcyl9ZnVuY3Rpb24gbyhpLGEpe2Zvcig7Mz09PWkuX3N0YXRlOylpPWkuX3ZhbHVlOzAhPT1pLl9zdGF0ZT8oaS5faGFuZGxlZD0hMCxyLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpe3ZhciBuPTE9PT1pLl9zdGF0ZT9hLm9uRnVsZmlsbGVkOmEub25SZWplY3RlZDtpZihudWxsIT09bil7dmFyIGU7dHJ5e2U9bihpLl92YWx1ZSl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgYyhhLnByb21pc2UsdCl9cyhhLnByb21pc2UsZSl9ZWxzZSgxPT09aS5fc3RhdGU/czpjKShhLnByb21pc2UsaS5fdmFsdWUpfSkpOmkuX2RlZmVycmVkcy5wdXNoKGEpfWZ1bmN0aW9uIHMobixlKXt0cnl7aWYoZT09PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4iKTtpZihlJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkpe3ZhciB0PWUudGhlbjtpZihlIGluc3RhbmNlb2YgcilyZXR1cm4gbi5fc3RhdGU9MyxuLl92YWx1ZT1lLHZvaWQgbChuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdm9pZCBwKGEodCxlKSxuKX1uLl9zdGF0ZT0xLG4uX3ZhbHVlPWUsbChuKX1jYXRjaChpKXtjKG4saSl9fWZ1bmN0aW9uIGMobixlKXtuLl9zdGF0ZT0yLG4uX3ZhbHVlPWUsbChuKX1mdW5jdGlvbiBsKG4pezI9PT1uLl9zdGF0ZSYmMD09PW4uX2RlZmVycmVkcy5sZW5ndGgmJnIuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7bi5faGFuZGxlZHx8ci5fdW5oYW5kbGVkUmVqZWN0aW9uRm4obi5fdmFsdWUpfSk7Zm9yKHZhciBlPTAsdD1uLl9kZWZlcnJlZHMubGVuZ3RoO2U8dDtlKyspbyhuLG4uX2RlZmVycmVkc1tlXSk7bi5fZGVmZXJyZWRzPW51bGx9ZnVuY3Rpb24gZChuLGUsdCl7dGhpcy5vbkZ1bGZpbGxlZD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm51bGwsdGhpcy5vblJlamVjdGVkPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbCx0aGlzLnByb21pc2U9dH1mdW5jdGlvbiBwKG4sZSl7dmFyIHQ9ITE7dHJ5e24oZnVuY3Rpb24obil7dHx8KHQ9ITAscyhlLG4pKX0sZnVuY3Rpb24obil7dHx8KHQ9ITAsYyhlLG4pKX0pfWNhdGNoKGkpe2lmKHQpcmV0dXJuO3Q9ITAsYyhlLGkpfX1mdW5jdGlvbiBmKG4pe2lmKG51bGw9PT1ufHxuPT09dW5kZWZpbmVkKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIik7cmV0dXJuIE9iamVjdChuKX1mdW5jdGlvbiBnKCl7dHJ5e2lmKCFPYmplY3QuYXNzaWduKXJldHVybiExO3ZhciBuPW5ldyBTdHJpbmcoImFiYyIpO2lmKG5bNV09ImRlIiwiNSI9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhuKVswXSlyZXR1cm4hMTtmb3IodmFyIGU9e30sdD0wO3Q8MTA7dCsrKWVbIl8iK1N0cmluZy5mcm9tQ2hhckNvZGUodCldPXQ7aWYoIjAxMjM0NTY3ODkiIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfSkuam9pbigiIikpcmV0dXJuITE7dmFyIGk9e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihuKXtpW25dPW59KSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxpKSkuam9pbigiIil9Y2F0Y2goYSl7cmV0dXJuITF9fWZ1bmN0aW9uIG0obixlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZSl9aWYod2luZG93LmF0b2Ipe3ZhciB2PWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5ldmVudHMmJmUuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24obil7dC5wdXNoKHtydWxlOmUsZXZlbnQ6bn0pfSl9KSx0LnNvcnQoZnVuY3Rpb24obixlKXtyZXR1cm4gbi5ldmVudC5ydWxlT3JkZXItZS5ldmVudC5ydWxlT3JkZXJ9KX0sdz0iZGVidWciLGg9ZnVuY3Rpb24oZSxuKXt2YXIgdD1mdW5jdGlvbigpe3JldHVybiJ0cnVlIj09PWUuZ2V0SXRlbSh3KX0saT1mdW5jdGlvbihuKXtlLnNldEl0ZW0odyxuKX0sYT1bXSxyPWZ1bmN0aW9uKG4pe2EucHVzaChuKX07cmV0dXJuIG4ub3V0cHV0RW5hYmxlZD10KCkse29uRGVidWdDaGFuZ2VkOnIsZ2V0RGVidWdFbmFibGVkOnQsc2V0RGVidWdFbmFibGVkOmZ1bmN0aW9uKGUpe3QoKSE9PWUmJihpKGUpLG4ub3V0cHV0RW5hYmxlZD1lLGEuZm9yRWFjaChmdW5jdGlvbihuKXtuKGUpfSkpfX19LGI9Ik1vZHVsZSBkaWQgbm90IGV4cG9ydCBhIGZ1bmN0aW9uLiIseT1mdW5jdGlvbihyLG8pe3JldHVybiBmdW5jdGlvbihuLGUsdCl7dD10fHxbXTt2YXIgaT1yLmdldE1vZHVsZUV4cG9ydHMobi5tb2R1bGVQYXRoKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoYik7dmFyIGE9byhuLnNldHRpbmdzfHx7fSxlKTtyZXR1cm4gaS5iaW5kKG51bGwsYSkuYXBwbHkobnVsbCx0KX19LF89ZnVuY3Rpb24obil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuP24ucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCk6bn0sQz17TE9HOiJsb2ciLElORk86ImluZm8iLERFQlVHOiJkZWJ1ZyIsV0FSTjoid2FybiIsRVJST1I6ImVycm9yIn0saz0i8J+agCIsUz0xMD09PXBhcnNlSW50KCgvbXNpZSAoXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpfHxbXSlbMV0pPyJbTGF1bmNoXSI6ayxUPSExLGo9ZnVuY3Rpb24obil7aWYoVCYmd2luZG93LmNvbnNvbGUpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtlLnVuc2hpZnQoUyksbiE9PUMuREVCVUd8fHdpbmRvdy5jb25zb2xlW25dfHwobj1DLklORk8pLHdpbmRvdy5jb25zb2xlW25dLmFwcGx5KHdpbmRvdy5jb25zb2xlLGUpfX0sTD1qLmJpbmQobnVsbCxDLkxPRykseD1qLmJpbmQobnVsbCxDLklORk8pLEU9ai5iaW5kKG51bGwsQy5ERUJVRyksST1qLmJpbmQobnVsbCxDLldBUk4pLFI9ai5iaW5kKG51bGwsQy5FUlJPUiksQT17bG9nOkwsaW5mbzp4LGRlYnVnOkUsd2FybjpJLGVycm9yOlIsZGVwcmVjYXRpb246ZnVuY3Rpb24oKXt2YXIgbj1UO1Q9ITAsai5hcHBseShudWxsLEFycmF5LnByb3RvdHlwZS5jb25jYXQoQy5XQVJOLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKSxufHwoVD0hMSl9LGdldCBvdXRwdXRFbmFibGVkKCl7cmV0dXJuIFR9LHNldCBvdXRwdXRFbmFibGVkKG4pe1Q9bn0sY3JlYXRlUHJlZml4ZWRMb2dnZXI6ZnVuY3Rpb24obil7dmFyIGU9IlsiK24rIl0iO3JldHVybntsb2c6TC5iaW5kKG51bGwsZSksaW5mbzp4LmJpbmQobnVsbCxlKSxkZWJ1ZzpFLmJpbmQobnVsbCxlKSx3YXJuOkkuYmluZChudWxsLGUpLGVycm9yOlIuYmluZChudWxsLGUpfX19LFA9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSxOPWUoZnVuY3Rpb24oaSl7IWZ1bmN0aW9uKG4pe2lmKGkuZXhwb3J0cz1uKCksISEwKXt2YXIgZT13aW5kb3cuQ29va2llcyx0PXdpbmRvdy5Db29raWVzPW4oKTt0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkNvb2tpZXM9ZSx0fX19KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYygpe2Zvcih2YXIgbj0wLGU9e307bjxhcmd1bWVudHMubGVuZ3RoO24rKyl7dmFyIHQ9YXJndW1lbnRzW25dO2Zvcih2YXIgaSBpbiB0KWVbaV09dFtpXX1yZXR1cm4gZX1mdW5jdGlvbiBsKG4pe3JldHVybiBuLnJlcGxhY2UoLyglWzAtOUEtWl17Mn0pKy9nLGRlY29kZVVSSUNvbXBvbmVudCl9ZnVuY3Rpb24gbih1KXtmdW5jdGlvbiBzKCl7fWZ1bmN0aW9uIHQobixlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpeyJudW1iZXIiPT10eXBlb2YodD1jKHtwYXRoOiIvIn0scy5kZWZhdWx0cyx0KSkuZXhwaXJlcyYmKHQuZXhwaXJlcz1uZXcgRGF0ZSgxKm5ldyBEYXRlKzg2NGU1KnQuZXhwaXJlcykpLHQuZXhwaXJlcz10LmV4cGlyZXM/dC5leHBpcmVzLnRvVVRDU3RyaW5nKCk6IiI7dHJ5e3ZhciBpPUpTT04uc3RyaW5naWZ5KGUpOy9eW1x7XFtdLy50ZXN0KGkpJiYoZT1pKX1jYXRjaChvKXt9ZT11LndyaXRlP3Uud3JpdGUoZSxuKTplbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGUpKS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDNBfDNDfDNFfDNEfDJGfDNGfDQwfDVCfDVEfDVFfDYwfDdCfDdEfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCksbj1lbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKG4pKS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDVFfDYwfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvW1woXCldL2csZXNjYXBlKTt2YXIgYT0iIjtmb3IodmFyIHIgaW4gdCl0W3JdJiYoYSs9IjsgIityLCEwIT09dFtyXSYmKGErPSI9Iit0W3JdLnNwbGl0KCI7IilbMF0pKTtyZXR1cm4gZG9jdW1lbnQuY29va2llPW4rIj0iK2UrYX19ZnVuY3Rpb24gZShuLGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe2Zvcih2YXIgdD17fSxpPWRvY3VtZW50LmNvb2tpZT9kb2N1bWVudC5jb29raWUuc3BsaXQoIjsgIik6W10sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgcj1pW2FdLnNwbGl0KCI9Iiksbz1yLnNsaWNlKDEpLmpvaW4oIj0iKTtlfHwnIichPT1vLmNoYXJBdCgwKXx8KG89by5zbGljZSgxLC0xKSk7dHJ5e3ZhciBzPWwoclswXSk7aWYobz0odS5yZWFkfHx1KShvLHMpfHxsKG8pLGUpdHJ5e289SlNPTi5wYXJzZShvKX1jYXRjaChjKXt9aWYodFtzXT1vLG49PT1zKWJyZWFrfWNhdGNoKGMpe319cmV0dXJuIG4/dFtuXTp0fX1yZXR1cm4gcy5zZXQ9dCxzLmdldD1mdW5jdGlvbihuKXtyZXR1cm4gZShuLCExKX0scy5nZXRKU09OPWZ1bmN0aW9uKG4pe3JldHVybiBlKG4sITApfSxzLnJlbW92ZT1mdW5jdGlvbihuLGUpe3QobiwiIixjKGUse2V4cGlyZXM6LTF9KSl9LHMuZGVmYXVsdHM9e30scy53aXRoQ29udmVydGVyPW4sc31yZXR1cm4gbihmdW5jdGlvbigpe30pfSl9KSxEPXtnZXQ6Ti5nZXQsc2V0Ok4uc2V0LHJlbW92ZTpOLnJlbW92ZX0sTz13aW5kb3csTT0iY29tLmFkb2JlLnJlYWN0b3IuIixVPWZ1bmN0aW9uKGksbil7dmFyIGE9TSsobnx8IiIpO3JldHVybntnZXRJdGVtOmZ1bmN0aW9uKG4pe2NvbnN0ICRfX19vbGRfM2VkYjk3YmU5MzYzNDZjNz17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJsb2NhbFN0b3JhZ2UiKTt0cnl7aWYoJF9fX29sZF8zZWRiOTdiZTkzNjM0NmM3KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLCRfX19tb2NrXzI4OTk0MTMyMzU4ZmI1NDkubG9jYWxTdG9yYWdlKTtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIE9baV0uZ2V0SXRlbShhK24pfWNhdGNoKGUpe3JldHVybiBudWxsfX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aWYoJF9fX29sZF8zZWRiOTdiZTkzNjM0NmM3KSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLCRfX19vbGRfM2VkYjk3YmU5MzYzNDZjNyl9fSxzZXRJdGVtOmZ1bmN0aW9uKG4sZSl7Y29uc3QgJF9fX29sZF9kMzI5NWUwZTNlMzllMDg0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csImxvY2FsU3RvcmFnZSIpO3RyeXtpZigkX19fb2xkX2QzMjk1ZTBlM2UzOWUwODQpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsJF9fX21vY2tfMjg5OTQxMzIzNThmYjU0OS5sb2NhbFN0b3JhZ2UpO3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gT1tpXS5zZXRJdGVtKGErbixlKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2lmKCRfX19vbGRfZDMyOTVlMGUzZTM5ZTA4NCkoe30pLmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywibG9jYWxTdG9yYWdlIiwkX19fb2xkX2QzMjk1ZTBlM2UzOWUwODQpfX19fSxWPSJfc2RzYXRfIixGPSJkYXRhRWxlbWVudHMuIixxPSJkYXRhRWxlbWVudENvb2tpZXNNaWdyYXRlZCIsVz1VKCJsb2NhbFN0b3JhZ2UiKSxKPVUoInNlc3Npb25TdG9yYWdlIixGKSxHPVUoImxvY2FsU3RvcmFnZSIsRiksUT17UEFHRVZJRVc6InBhZ2V2aWV3IixTRVNTSU9OOiJzZXNzaW9uIixWSVNJVE9SOiJ2aXNpdG9yIn0sQj17fSx6PWZ1bmN0aW9uKG4pe3ZhciBlO3RyeXtlPUpTT04uc3RyaW5naWZ5KG4pfWNhdGNoKHQpe31yZXR1cm4gZX0sJD1mdW5jdGlvbihuLGUsdCl7dmFyIGk7c3dpdGNoKGUpe2Nhc2UgUS5QQUdFVklFVzpyZXR1cm4gdm9pZChCW25dPXQpO2Nhc2UgUS5TRVNTSU9OOnJldHVybiB2b2lkKChpPXoodCkpJiZKLnNldEl0ZW0obixpKSk7Y2FzZSBRLlZJU0lUT1I6cmV0dXJuIHZvaWQoKGk9eih0KSkmJkcuc2V0SXRlbShuLGkpKX19LEg9ZnVuY3Rpb24obixlKXt2YXIgdD1ELmdldChWK24pO3QhPT11bmRlZmluZWQmJiQobixlLHQpfSxLPXtzZXRWYWx1ZTokLGdldFZhbHVlOmZ1bmN0aW9uKG4sZSl7dmFyIHQ7c3dpdGNoKGUpe2Nhc2UgUS5QQUdFVklFVzpyZXR1cm4gQi5oYXNPd25Qcm9wZXJ0eShuKT9CW25dOm51bGw7Y2FzZSBRLlNFU1NJT046cmV0dXJuIG51bGw9PT0odD1KLmdldEl0ZW0obikpP3Q6SlNPTi5wYXJzZSh0KTtjYXNlIFEuVklTSVRPUjpyZXR1cm4gbnVsbD09PSh0PUcuZ2V0SXRlbShuKSk/dDpKU09OLnBhcnNlKHQpfX0sbWlncmF0ZUNvb2tpZURhdGE6ZnVuY3Rpb24oZSl7Vy5nZXRJdGVtKHEpfHwoT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtIKG4sZVtuXS5zdG9yYWdlRHVyYXRpb24pfSksVy5zZXRJdGVtKHEsITApKX19LFo9ZnVuY3Rpb24obixlLHQsaSl7cmV0dXJuIkZhaWxlZCB0byBleGVjdXRlIGRhdGEgZWxlbWVudCBtb2R1bGUgIituLm1vZHVsZVBhdGgrIiBmb3IgZGF0YSBlbGVtZW50ICIrZSsiLiAiK3QrKGk/IlxuIitpOiIiKX0sWT1mdW5jdGlvbihzLGMsdSxsKXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgdD1jKG4pO2lmKCF0KXJldHVybiBsPyIiOnVuZGVmaW5lZDt2YXIgaSxhPXQuc3RvcmFnZUR1cmF0aW9uO3RyeXtpPXMuZ2V0TW9kdWxlRXhwb3J0cyh0Lm1vZHVsZVBhdGgpfWNhdGNoKG8pe3JldHVybiB2b2lkIEEuZXJyb3IoWih0LG4sby5tZXNzYWdlLG8uc3RhY2spKX1pZigiZnVuY3Rpb24iPT10eXBlb2YgaSl7dmFyIHI7dHJ5e3I9aSh1KHQuc2V0dGluZ3MsZSksZSl9Y2F0Y2gobyl7cmV0dXJuIHZvaWQgQS5lcnJvcihaKHQsbixvLm1lc3NhZ2Usby5zdGFjaykpfXJldHVybiBhJiYobnVsbCE9cj9LLnNldFZhbHVlKG4sYSxyKTpyPUsuZ2V0VmFsdWUobixhKSksbnVsbD09ciYmbnVsbCE9dC5kZWZhdWx0VmFsdWUmJihyPXQuZGVmYXVsdFZhbHVlKSwic3RyaW5nIj09dHlwZW9mIHImJih0LmNsZWFuVGV4dCYmKHI9XyhyKSksdC5mb3JjZUxvd2VyQ2FzZSYmKHI9ci50b0xvd2VyQ2FzZSgpKSkscn1BLmVycm9yKFoodCxuLCJNb2R1bGUgZGlkIG5vdCBleHBvcnQgYSBmdW5jdGlvbi4iKSl9fSxYPXt0ZXh0OmZ1bmN0aW9uKG4pe3JldHVybiBuLnRleHRDb250ZW50fSxjbGVhblRleHQ6ZnVuY3Rpb24obil7cmV0dXJuIF8obi50ZXh0Q29udGVudCl9fSxubj1mdW5jdGlvbihuLGUsdCl7Zm9yKHZhciBpLGE9bixyPTAsbz1lLmxlbmd0aDtyPG87cisrKXtpZihudWxsPT1hKXJldHVybiB1bmRlZmluZWQ7dmFyIHM9ZVtyXTtpZih0JiYiQCI9PT1zLmNoYXJBdCgwKSl7dmFyIGM9cy5zbGljZSgxKTthPVhbY10oYSl9ZWxzZSBpZihhLmdldEF0dHJpYnV0ZSYmKGk9cy5tYXRjaCgvXmdldEF0dHJpYnV0ZVwoKC4rKVwpJC8pKSl7dmFyIHU9aVsxXTthPWEuZ2V0QXR0cmlidXRlKHUpfWVsc2UgYT1hW3NdfXJldHVybiBhfSxlbj1mdW5jdGlvbihyLG8scyl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHQ7aWYobyhuKSl0PXMobixlKTtlbHNle3ZhciBpPW4uc3BsaXQoIi4iKSxhPWkuc2hpZnQoKTsidGhpcyI9PT1hP2UmJih0PW5uKGUuZWxlbWVudCxpLCEwKSk6ImV2ZW50Ij09PWE/ZSYmKHQ9bm4oZSxpKSk6InRhcmdldCI9PT1hP2UmJih0PW5uKGUudGFyZ2V0LGkpKTp0PW5uKHJbYV0saSl9cmV0dXJuIHR9fSx0bj1mdW5jdGlvbih0LGkpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnNwbGl0KCIuIilbMF07cmV0dXJuIEJvb2xlYW4oaShuKXx8InRoaXMiPT09ZXx8ImV2ZW50Ij09PWV8fCJ0YXJnZXQiPT09ZXx8dC5oYXNPd25Qcm9wZXJ0eShlKSl9fSxhbj1mdW5jdGlvbihuLGUsdCl7dmFyIGk9e2V4cG9ydHM6e319O3JldHVybiBuLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUsdCksaS5leHBvcnRzfSxybj1mdW5jdGlvbigpe3ZhciBvPXt9LHQ9ZnVuY3Rpb24obil7dmFyIGU9b1tuXTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIk1vZHVsZSAiK24rIiBub3QgZm91bmQuIik7cmV0dXJuIGV9LG49ZnVuY3Rpb24oKXtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3RyeXtpKG4pfWNhdGNoKHQpe3ZhciBlPSJFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlICIrbisiLiAiK3QubWVzc2FnZSsodC5zdGFjaz8iXG4iK3Quc3RhY2s6IiIpO0EuZXJyb3IoZSl9fSl9LGk9ZnVuY3Rpb24obil7dmFyIGU9dChuKTtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgiZXhwb3J0cyIpfHwoZS5leHBvcnRzPWFuKGUuZGVmaW5pdGlvbi5zY3JpcHQsZS5yZXF1aXJlLGUudHVyYmluZSkpLGUuZXhwb3J0c307cmV0dXJue3JlZ2lzdGVyTW9kdWxlOmZ1bmN0aW9uKG4sZSx0LGksYSl7dmFyIHI9e2RlZmluaXRpb246ZSxleHRlbnNpb25OYW1lOnQscmVxdWlyZTppLHR1cmJpbmU6YX07ci5yZXF1aXJlPWksb1tuXT1yfSxoeWRyYXRlQ2FjaGU6bixnZXRNb2R1bGVFeHBvcnRzOmksZ2V0TW9kdWxlRGVmaW5pdGlvbjpmdW5jdGlvbihuKXtyZXR1cm4gdChuKS5kZWZpbml0aW9ufSxnZXRNb2R1bGVFeHRlbnNpb25OYW1lOmZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLmV4dGVuc2lvbk5hbWV9fX0sb249ITEsc249ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49aS5fbW9uaXRvcnM7biYmKG9ufHwoQS53YXJuKCJUaGUgX3NhdGVsbGl0ZS5fbW9uaXRvcnMgQVBJIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy4iKSxvbj0hMCksbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe25bZV0mJm5bZV0odCl9KSl9fSxjbj1mdW5jdGlvbihhLHIsbyl7dmFyIHQsaSxzLGMsdT1bXSxsPWZ1bmN0aW9uKG4sZSx0KXtpZighYShlKSlyZXR1cm4gbjt1LnB1c2goZSk7dmFyIGk9cihlLHQpO3JldHVybiB1LnBvcCgpLG51bGw9PWkmJm8/IiI6aX07cmV0dXJuIHQ9ZnVuY3Rpb24obix0KXt2YXIgZT0vXiUoW14lXSspJSQvLmV4ZWMobik7cmV0dXJuIGU/bChuLGVbMV0sdCk6bi5yZXBsYWNlKC8lKC4rPyklL2csZnVuY3Rpb24obixlKXtyZXR1cm4gbChuLGUsdCl9KX0saT1mdW5jdGlvbihuLGUpe2Zvcih2YXIgdD17fSxpPU9iamVjdC5rZXlzKG4pLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHI9aVthXSxvPW5bcl07dFtyXT1jKG8sZSl9cmV0dXJuIHR9LHM9ZnVuY3Rpb24obixlKXtmb3IodmFyIHQ9W10saT0wLGE9bi5sZW5ndGg7aTxhO2krKyl0LnB1c2goYyhuW2ldLGUpKTtyZXR1cm4gdH0sYz1mdW5jdGlvbihuLGUpe3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj90KG4sZSk6QXJyYXkuaXNBcnJheShuKT9zKG4sZSk6Im9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bj9pKG4sZSk6bn0sZnVuY3Rpb24obixlKXtyZXR1cm4gMTA8dS5sZW5ndGg/KEEuZXJyb3IoIkRhdGEgZWxlbWVudCBjaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICIrdS5qb2luKCIgLT4gIikpLG4pOmMobixlKX19LHVuPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihuLGUpe2lmKCJzdHJpbmciPT10eXBlb2YgbilhW2FyZ3VtZW50c1swXV09ZTtlbHNlIGlmKGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO2Zvcih2YXIgaSBpbiB0KWFbaV09dFtpXX19fSxsbj1zZXRUaW1lb3V0O3IucHJvdG90eXBlWyJjYXRjaCJdPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnRoZW4obnVsbCxuKX0sci5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihuLGUpe3ZhciB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKGkpO3JldHVybiBvKHRoaXMsbmV3IGQobixlLHQpKSx0fSxyLnByb3RvdHlwZVsiZmluYWxseSJdPXQsci5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGEscil7ZnVuY3Rpb24gbyhlLG4pe3RyeXtpZihuJiYoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2Ygbikpe3ZhciB0PW4udGhlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdm9pZCB0LmNhbGwobixmdW5jdGlvbihuKXtvKGUsbil9LHIpfXNbZV09biwwPT0tLWMmJmEocyl9Y2F0Y2goaSl7cihpKX19aWYoIXUoZSkpcmV0dXJuIHIobmV3IFR5cGVFcnJvcigiUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheSIpKTt2YXIgcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKTtpZigwPT09cy5sZW5ndGgpcmV0dXJuIGEoW10pO2Zvcih2YXIgYz1zLmxlbmd0aCxuPTA7bjxzLmxlbmd0aDtuKyspbyhuLHNbbl0pfSl9LHIucmVzb2x2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZlLmNvbnN0cnVjdG9yPT09cj9lOm5ldyByKGZ1bmN0aW9uKG4pe24oZSl9KX0sci5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKG4sZSl7ZSh0KX0pfSxyLnJhY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKG4sZSl7aWYoIXUoYSkpcmV0dXJuIGUobmV3IFR5cGVFcnJvcigiUHJvbWlzZS5yYWNlIGFjY2VwdHMgYW4gYXJyYXkiKSk7Zm9yKHZhciB0PTAsaT1hLmxlbmd0aDt0PGk7dCsrKXIucmVzb2x2ZShhW3RdKS50aGVuKG4sZSl9KX0sci5faW1tZWRpYXRlRm49ImZ1bmN0aW9uIj09dHlwZW9mIHNldEltbWVkaWF0ZSYmZnVuY3Rpb24obil7c2V0SW1tZWRpYXRlKG4pfXx8ZnVuY3Rpb24obil7bG4obiwwKX0sci5fdW5oYW5kbGVkUmVqZWN0aW9uRm49ZnVuY3Rpb24geGUobil7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLG4pfTt2YXIgZG49bihPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnJ9KSkscG49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5Qcm9taXNlfHx2b2lkIDAhPT1QJiZQLlByb21pc2V8fGRuWyJkZWZhdWx0Il18fGRuLGZuPWZ1bmN0aW9uKHUsdCxpKXtyZXR1cm4gZnVuY3Rpb24ocyxlLGMsbil7cmV0dXJuIG4udGhlbihmdW5jdGlvbigpe3ZhciByLG89cy5kZWxheU5leHQ7cmV0dXJuIG5ldyBwbihmdW5jdGlvbihuLGUpe3ZhciB0PXUocyxjLFtjXSk7aWYoIW8pcmV0dXJuIG4oKTt2YXIgaT1zLnRpbWVvdXQsYT1uZXcgcG4oZnVuY3Rpb24obixlKXtyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKG5ldyBFcnJvcigiQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGFjdGlvbiB0b29rIGxvbmdlciB0aGFuICIraS8xZTMrIiBzZWNvbmRzIHRvIGNvbXBsZXRlLiAiKSl9LGkpfSk7cG4ucmFjZShbdCxhXSkudGhlbihuLGUpfSlbImNhdGNoIl0oZnVuY3Rpb24obil7cmV0dXJuIGNsZWFyVGltZW91dChyKSxuPXQobiksaShzLGUsbikscG4ucmVqZWN0KG4pfSkudGhlbihmdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX0pfSl9fSxnbj1mdW5jdGlvbihjLHQsaSxhLHUpe3JldHVybiBmdW5jdGlvbihvLGUscyxuKXtyZXR1cm4gbi50aGVuKGZ1bmN0aW9uKCl7dmFyIHI7cmV0dXJuIG5ldyBwbihmdW5jdGlvbihuLGUpe3ZhciB0PWMobyxzLFtzXSksaT1vLnRpbWVvdXQsYT1uZXcgcG4oZnVuY3Rpb24obixlKXtyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKG5ldyBFcnJvcigiQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0b29rIGxvbmdlciB0aGFuICIraS8xZTMrIiBzZWNvbmRzIHRvIGNvbXBsZXRlLiAiKSl9LGkpfSk7cG4ucmFjZShbdCxhXSkudGhlbihuLGUpfSlbImNhdGNoIl0oZnVuY3Rpb24obil7cmV0dXJuIGNsZWFyVGltZW91dChyKSxuPXQobiksYShvLGUsbikscG4ucmVqZWN0KG4pfSkudGhlbihmdW5jdGlvbihuKXtpZihjbGVhclRpbWVvdXQociksIWkobyxuKSlyZXR1cm4gdShvLGUpLHBuLnJlamVjdCgpfSl9KX19LG1uPXBuLnJlc29sdmUoKSx2bj1mdW5jdGlvbihpLGEsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uZGl0aW9ucyYmZS5jb25kaXRpb25zLmZvckVhY2goZnVuY3Rpb24obil7bW49aShuLGUsdCxtbil9KSxlLmFjdGlvbnMmJmUuYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG4pe21uPWEobixlLHQsbW4pfSksbW49KG1uPW1uLnRoZW4oZnVuY3Rpb24oKXtuKGUpfSkpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSl9fSx3bj1mdW5jdGlvbihuKXtyZXR1cm4gQm9vbGVhbihuJiYib2JqZWN0Ij09dHlwZW9mIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnRoZW4pfSxobj1mdW5jdGlvbihvLHMsYyx1KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgdDtpZihuLmNvbmRpdGlvbnMpZm9yKHZhciBpPTA7aTxuLmNvbmRpdGlvbnMubGVuZ3RoO2krKyl7dD1uLmNvbmRpdGlvbnNbaV07dHJ5e3ZhciBhPW8odCxlLFtlXSk7aWYod24oYSkpdGhyb3cgbmV3IEVycm9yKCJSdWxlIGNvbXBvbmVudCBzZXF1ZW5jaW5nIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgcHJvcGVydHkgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiIpO2lmKCFzKHQsYSkpcmV0dXJuIGModCxuKSwhMX1jYXRjaChyKXtyZXR1cm4gdSh0LG4sciksITF9fXJldHVybiEwfX0sYm49ZnVuY3Rpb24odCxpKXtyZXR1cm4gZnVuY3Rpb24obixlKXt0KG4sZSkmJmkobixlKX19LHluPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT10LmdldE1vZHVsZURlZmluaXRpb24obi5tb2R1bGVQYXRoKTtyZXR1cm4gZSYmZS5kaXNwbGF5TmFtZXx8bi5tb2R1bGVQYXRofX0sX249ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW4ucnVsZSx0PW4uZXZlbnQsaT1hLmdldE1vZHVsZURlZmluaXRpb24odC5tb2R1bGVQYXRoKS5uYW1lO3JldHVybnskdHlwZTphLmdldE1vZHVsZUV4dGVuc2lvbk5hbWUodC5tb2R1bGVQYXRoKSsiLiIraSwkcnVsZTp7aWQ6ZS5pZCxuYW1lOmUubmFtZX19fX0sQ249ZnVuY3Rpb24ocyxjLHUsbCxkLHApe3JldHVybiBmdW5jdGlvbih0LG4pe3ZhciBpPW4ucnVsZSxlPW4uZXZlbnQ7ZS5zZXR0aW5ncz1lLnNldHRpbmdzfHx7fTt0cnl7dmFyIGE9ZChuKTtjKGUsbnVsbCxbZnVuY3Rpb24gcihuKXt2YXIgZT11KGEsbik7dChmdW5jdGlvbigpe3MoZSxpKX0pfV0pfWNhdGNoKG8pe3AuZXJyb3IobChlLGksbykpfX19LGtuPWZ1bmN0aW9uKGEscixvLHMpe3JldHVybiBmdW5jdGlvbihuLGUsdCl7dmFyIGk9cihuKTtvLmVycm9yKGEoaSxlLm5hbWUsdCkpLHMoInJ1bGVBY3Rpb25GYWlsZWQiLHtydWxlOmUsYWN0aW9uOm59KX19LFNuPWZ1bmN0aW9uKGEscixvLHMpe3JldHVybiBmdW5jdGlvbihuLGUsdCl7dmFyIGk9cihuKTtvLmVycm9yKGEoaSxlLm5hbWUsdCkpLHMoInJ1bGVDb25kaXRpb25GYWlsZWQiLHtydWxlOmUsY29uZGl0aW9uOm59KX19LFRuPWZ1bmN0aW9uKGksYSxyKXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgdD1pKG4pO2EubG9nKCdDb25kaXRpb24gIicrdCsnIiBmb3IgcnVsZSAiJytlLm5hbWUrJyIgd2FzIG5vdCBtZXQuJykscigicnVsZUNvbmRpdGlvbkZhaWxlZCIse3J1bGU6ZSxjb25kaXRpb246bn0pfX0sam49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7ZS5sb2coJ1J1bGUgIicrbi5uYW1lKyciIGZpcmVkLicpLHQoInJ1bGVDb21wbGV0ZWQiLHtydWxlOm59KX19LExuPWZ1bmN0aW9uKHIsbyxzKXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgdDtpZihuLmFjdGlvbnMpZm9yKHZhciBpPTA7aTxuLmFjdGlvbnMubGVuZ3RoO2krKyl7dD1uLmFjdGlvbnNbaV07dHJ5e3IodCxlLFtlXSl9Y2F0Y2goYSl7cmV0dXJuIHZvaWQgbyh0LG4sYSl9fXMobil9fSx4bj1mdW5jdGlvbih0LGksYSxyKXtyZXR1cm4gZnVuY3Rpb24obixlKXtyKCJydWxlVHJpZ2dlcmVkIix7cnVsZTplfSksdD9hKGUsbik6aShlLG4pfX0sRW49ZnVuY3Rpb24obixlLHQpe3JldHVybidGYWlsZWQgdG8gZXhlY3V0ZSAiJytuKyciIGZvciAiJytlKyciIHJ1bGUuICcrdC5tZXNzYWdlKyh0LnN0YWNrPyJcbiIrdC5zdGFjazoiIil9LEluPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUmJiFuLm5lZ2F0ZXx8IWUmJm4ubmVnYXRlfSxSbj1bXSxBbj0hMSxQbj1mdW5jdGlvbihuKXtBbj9uKCk6Um4ucHVzaChuKX0sTm49ZnVuY3Rpb24obixlLHQpe24oZSkuZm9yRWFjaChmdW5jdGlvbihuKXt0KFBuLG4pfSksQW49ITAsUm4uZm9yRWFjaChmdW5jdGlvbihuKXtuKCl9KSxSbj1bXX0sRG49ZnVuY3Rpb24obil7aWYobnx8KG49bmV3IEVycm9yKCJUaGUgZXh0ZW5zaW9uIHRyaWdnZXJlZCBhbiBlcnJvciwgYnV0IG5vIGVycm9yIGluZm9ybWF0aW9uIHdhcyBwcm92aWRlZC4iKSksIShuIGluc3RhbmNlb2YgRXJyb3IpKXt2YXIgZT0ib2JqZWN0Ij09dHlwZW9mIG4/SlNPTi5zdHJpbmdpZnkobik6U3RyaW5nKG4pO249bmV3IEVycm9yKGUpfXJldHVybiBufSxPbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLE1uPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksVW49T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxWbj1nKCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihuKXtmb3IodmFyIGUsdCxpPWYobiksYT0xO2E8YXJndW1lbnRzLmxlbmd0aDthKyspe2Zvcih2YXIgciBpbiBlPU9iamVjdChhcmd1bWVudHNbYV0pKU1uLmNhbGwoZSxyKSYmKGlbcl09ZVtyXSk7aWYoT24pe3Q9T24oZSk7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspVW4uY2FsbChlLHRbb10pJiYoaVt0W29dXT1lW3Rbb11dKX19cmV0dXJuIGl9LEZuPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIFZuKGU9ZXx8e30sbiksZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwidHlwZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBBLmRlcHJlY2F0aW9uKCJBY2Nlc3NpbmcgZXZlbnQudHlwZSBpbiBBZG9iZSBMYXVuY2ggaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uIFBsZWFzZSB1c2UgZXZlbnQuJHR5cGUgaW5zdGVhZC4iKSxlLiR0eXBlfX0pLGV9LHFuPWZ1bmN0aW9uKGMsdSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHQ9Y1tuXTtpZih0KXt2YXIgaT10Lm1vZHVsZXM7aWYoaSlmb3IodmFyIGE9T2JqZWN0LmtleXMoaSkscj0wO3I8YS5sZW5ndGg7cisrKXt2YXIgbz1hW3JdLHM9aVtvXTtpZihzLnNoYXJlZCYmcy5uYW1lPT09ZSlyZXR1cm4gdS5nZXRNb2R1bGVFeHBvcnRzKG8pfX19fSxXbj1mdW5jdGlvbihuLGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlP24oZSk6e319fSxKbj1mdW5jdGlvbih0LGkpe3JldHVybiBmdW5jdGlvbihuKXtpZihpKXt2YXIgZT1uLnNwbGl0KCIuIik7ZS5zcGxpY2UoZS5sZW5ndGgtMXx8MSwwLCJtaW4iKSxuPWUuam9pbigiLiIpfXJldHVybiB0K259fSxHbj0iLmpzIixRbj1mdW5jdGlvbihuKXtyZXR1cm4gbi5zdWJzdHIoMCxuLmxhc3RJbmRleE9mKCIvIikpfSxCbj1mdW5jdGlvbihuLGUpe3JldHVybi0xIT09bi5pbmRleE9mKGUsbi5sZW5ndGgtZS5sZW5ndGgpfSx6bj1mdW5jdGlvbihuLGUpe0JuKGUsR24pfHwoZSs9R24pO3ZhciB0PWUuc3BsaXQoIi8iKSxpPVFuKG4pLnNwbGl0KCIvIik7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtuJiYiLiIhPT1uJiYoIi4uIj09PW4/aS5sZW5ndGgmJmkucG9wKCk6aS5wdXNoKG4pKX0pLGkuam9pbigiLyIpfSwkbj1kb2N1bWVudCxIbj1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgcG4oZnVuY3Rpb24obixlKXtpLm9ubG9hZD1mdW5jdGlvbigpe24oaSl9LGkub25lcnJvcj1mdW5jdGlvbigpe2UobmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCBzY3JpcHQgIit0KSl9fSl9LEtuPWZ1bmN0aW9uKG4pe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPW4sZS5hc3luYz0hMDt2YXIgdD1IbihuLGUpO3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGUpLHR9LFpuPWZ1bmN0aW9uKG4sZSx0LGkpe2U9ZXx8IiYiLHQ9dHx8Ij0iO3ZhciBhPXt9O2lmKCJzdHJpbmciIT10eXBlb2Ygbnx8MD09PW4ubGVuZ3RoKXJldHVybiBhO3ZhciByPS9cKy9nO249bi5zcGxpdChlKTt2YXIgbz0xZTM7aSYmIm51bWJlciI9PXR5cGVvZiBpLm1heEtleXMmJihvPWkubWF4S2V5cyk7dmFyIHM9bi5sZW5ndGg7MDxvJiZvPHMmJihzPW8pO2Zvcih2YXIgYz0wO2M8czsrK2Mpe3ZhciB1LGwsZCxwLGY9bltjXS5yZXBsYWNlKHIsIiUyMCIpLGc9Zi5pbmRleE9mKHQpOzA8PWc/KHU9Zi5zdWJzdHIoMCxnKSxsPWYuc3Vic3RyKGcrMSkpOih1PWYsbD0iIiksZD1kZWNvZGVVUklDb21wb25lbnQodSkscD1kZWNvZGVVUklDb21wb25lbnQobCksbShhLGQpP0FycmF5LmlzQXJyYXkoYVtkXSk/YVtkXS5wdXNoKHApOmFbZF09W2FbZF0scF06YVtkXT1wfXJldHVybiBhfSxZbj1mdW5jdGlvbihuKXtzd2l0Y2godHlwZW9mIG4pe2Nhc2Uic3RyaW5nIjpyZXR1cm4gbjtjYXNlImJvb2xlYW4iOnJldHVybiBuPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUobik/bjoiIjtkZWZhdWx0OnJldHVybiIifX0sWG49ZnVuY3Rpb24odCxpLGEsbil7cmV0dXJuIGk9aXx8IiYiLGE9YXx8Ij0iLG51bGw9PT10JiYodD11bmRlZmluZWQpLCJvYmplY3QiPT10eXBlb2YgdD9PYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24obil7dmFyIGU9ZW5jb2RlVVJJQ29tcG9uZW50KFluKG4pKSthO3JldHVybiBBcnJheS5pc0FycmF5KHRbbl0pP3Rbbl0ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBlK2VuY29kZVVSSUNvbXBvbmVudChZbihuKSl9KS5qb2luKGkpOmUrZW5jb2RlVVJJQ29tcG9uZW50KFluKHRbbl0pKX0pLmpvaW4oaSk6bj9lbmNvZGVVUklDb21wb25lbnQoWW4obikpK2ErZW5jb2RlVVJJQ29tcG9uZW50KFluKHQpKToiIn0sbmU9ZShmdW5jdGlvbihuLGUpe2UuZGVjb2RlPWUucGFyc2U9Wm4sZS5lbmNvZGU9ZS5zdHJpbmdpZnk9WG59KSxlZT0iQGFkb2JlL3JlYWN0b3ItIix0ZT17Y29va2llOkQsZG9jdW1lbnQ6JG4sImxvYWQtc2NyaXB0IjpLbiwib2JqZWN0LWFzc2lnbiI6Vm4scHJvbWlzZTpwbiwicXVlcnktc3RyaW5nIjp7cGFyc2U6ZnVuY3Rpb24obil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiYobj1uLnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCIiKSksbmUucGFyc2Uobil9LHN0cmluZ2lmeTpmdW5jdGlvbihuKXtyZXR1cm4gbmUuc3RyaW5naWZ5KG4pfX0sd2luZG93Ok99LGllPWZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbihuKXtpZigwPT09bi5pbmRleE9mKGVlKSl7dmFyIGU9bi5zdWJzdHIoZWUubGVuZ3RoKSx0PXRlW2VdO2lmKHQpcmV0dXJuIHR9aWYoMD09PW4uaW5kZXhPZigiLi8iKXx8MD09PW4uaW5kZXhPZigiLi4vIikpcmV0dXJuIGkobik7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVzb2x2ZSBtb2R1bGUgIicrbisnIi4nKX19LGFlPWZ1bmN0aW9uKG4sbyxzLGMsdSl7dmFyIGw9bi5leHRlbnNpb25zLGQ9bi5idWlsZEluZm8scD1uLnByb3BlcnR5LnNldHRpbmdzO2lmKGwpe3ZhciBmPXFuKGwsbyk7T2JqZWN0LmtleXMobCkuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgYT1sW2ldLG49V24oYyxhLnNldHRpbmdzKTtpZihhLm1vZHVsZXMpe3ZhciBlPUEuY3JlYXRlUHJlZml4ZWRMb2dnZXIoYS5kaXNwbGF5TmFtZSksdD1KbihhLmhvc3RlZExpYkZpbGVzQmFzZVVybCxkLm1pbmlmaWVkKSxyPXtidWlsZEluZm86ZCxnZXREYXRhRWxlbWVudFZhbHVlOnUsZ2V0RXh0ZW5zaW9uU2V0dGluZ3M6bixnZXRIb3N0ZWRMaWJGaWxlVXJsOnQsZ2V0U2hhcmVkTW9kdWxlOmYsbG9nZ2VyOmUscHJvcGVydHlTZXR0aW5nczpwLHJlcGxhY2VUb2tlbnM6YyxvbkRlYnVnQ2hhbmdlZDpzLm9uRGVidWdDaGFuZ2VkLGdldCBkZWJ1Z0VuYWJsZWQoKXtyZXR1cm4gcy5nZXREZWJ1Z0VuYWJsZWQoKX19O09iamVjdC5rZXlzKGEubW9kdWxlcykuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1hLm1vZHVsZXNbdF0sZT1pZShmdW5jdGlvbihuKXt2YXIgZT16bih0LG4pO3JldHVybiBvLmdldE1vZHVsZUV4cG9ydHMoZSl9KTtvLnJlZ2lzdGVyTW9kdWxlKHQsbixpLGUscil9KX19KSxvLmh5ZHJhdGVDYWNoZSgpfXJldHVybiBvfSxyZT1mdW5jdGlvbihuLGUsdCxpLGEpe3ZhciByPUEuY3JlYXRlUHJlZml4ZWRMb2dnZXIoIkN1c3RvbSBTY3JpcHQiKTtuLnRyYWNrPWZ1bmN0aW9uKG4pe0EubG9nKCciJytuKyciIGRvZXMgbm90IG1hdGNoIGFueSBkaXJlY3QgY2FsbCBpZGVudGlmaWVycy4nKX0sbi5nZXRWaXNpdG9ySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sbi5wcm9wZXJ0eT17bmFtZTplLnByb3BlcnR5Lm5hbWV9LG4uY29tcGFueT1lLmNvbXBhbnksbi5idWlsZEluZm89ZS5idWlsZEluZm8sbi5sb2dnZXI9cixuLm5vdGlmeT1mdW5jdGlvbihuLGUpe3N3aXRjaChBLmRlcHJlY2F0aW9uKCJfc2F0ZWxsaXRlLm5vdGlmeSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBgX3NhdGVsbGl0ZS5sb2dnZXJgIEFQSS4iKSxlKXtjYXNlIDM6ci5pbmZvKG4pO2JyZWFrO2Nhc2UgNDpyLndhcm4obik7YnJlYWs7Y2FzZSA1OnIuZXJyb3Iobik7YnJlYWs7ZGVmYXVsdDpyLmxvZyhuKX19LG4uZ2V0VmFyPWksbi5zZXRWYXI9YSxuLnNldENvb2tpZT1mdW5jdGlvbihuLGUsdCl7dmFyIGk9IiIsYT17fTt0JiYoaT0iLCB7IGV4cGlyZXM6ICIrdCsiIH0iLGEuZXhwaXJlcz10KTt2YXIgcj0nX3NhdGVsbGl0ZS5zZXRDb29raWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBfc2F0ZWxsaXRlLmNvb2tpZS5zZXQoIicrbisnIiwgIicrZSsnIicraSsiKS4iO0EuZGVwcmVjYXRpb24ociksRC5zZXQobixlLGEpfSxuLnJlYWRDb29raWU9ZnVuY3Rpb24obil7cmV0dXJuIEEuZGVwcmVjYXRpb24oJ19zYXRlbGxpdGUucmVhZENvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLmdldCgiJytuKyciKS4nKSxELmdldChuKX0sbi5yZW1vdmVDb29raWU9ZnVuY3Rpb24obil7QS5kZXByZWNhdGlvbignX3NhdGVsbGl0ZS5yZW1vdmVDb29raWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBfc2F0ZWxsaXRlLmNvb2tpZS5yZW1vdmUoIicrbisnIikuJyksRC5yZW1vdmUobil9LG4uY29va2llPUQsbi5wYWdlQm90dG9tPWZ1bmN0aW9uKCl7fSxuLnNldERlYnVnPXQ7dmFyIG89ITE7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9jb250YWluZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb3x8KEEud2FybigiX3NhdGVsbGl0ZS5fY29udGFpbmVyIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy4iKSxvPSEwKSxlfX0pfSxvZT13aW5kb3cuX3NhdGVsbGl0ZTtpZihvZSYmIXdpbmRvdy5fX3NhdGVsbGl0ZUxvYWRlZCl7d2luZG93Ll9fc2F0ZWxsaXRlTG9hZGVkPSEwO3ZhciBzZT1vZS5jb250YWluZXI7ZGVsZXRlIG9lLmNvbnRhaW5lcjt2YXIgY2U9c2UucHJvcGVydHkuc2V0dGluZ3MudW5kZWZpbmVkVmFyc1JldHVybkVtcHR5LHVlPXNlLnByb3BlcnR5LnNldHRpbmdzLnJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCxsZT1zZS5kYXRhRWxlbWVudHN8fHt9O0subWlncmF0ZUNvb2tpZURhdGEobGUpO3ZhciBkZSxwZT1mdW5jdGlvbihuKXtyZXR1cm4gbGVbbl19LGZlPXJuKCksZ2U9WShmZSxwZSxmdW5jdGlvbigpe3JldHVybiBkZS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGNlKSxtZT17fSx2ZT11bihtZSksd2U9dG4obWUscGUpLGhlPWVuKG1lLHBlLGdlKTtkZT1jbih3ZSxoZSxjZSk7dmFyIGJlPWgoVSgibG9jYWxTdG9yYWdlIiksQSk7cmUob2Usc2UsYmUuc2V0RGVidWdFbmFibGVkLGhlLHZlKSxhZShzZSxmZSxiZSxkZSxnZSk7dmFyIHllPXNuKG9lKSxfZT15KGZlLGRlKSxDZT15bihmZSksa2U9VG4oQ2UsQSx5ZSksU2U9U24oRW4sQ2UsQSx5ZSksVGU9a24oRW4sQ2UsQSx5ZSksamU9am4oQSx5ZSksTGU9Q24oeG4odWUsYm4oaG4oX2UsSW4sa2UsU2UpLExuKF9lLFRlLGplKSksdm4oZ24oX2UsRG4sSW4sU2Usa2UpLGZuKF9lLERuLFRlKSxqZSkseWUpLF9lLEZuLEVuLF9uKGZlKSxBKTtObih2LHNlLnJ1bGVzfHxbXSxMZSl9cmV0dXJuIG9lfWNvbnNvbGUud2FybigiQWRvYmUgTGF1bmNoIGlzIHVuc3VwcG9ydGVkIGluIElFIDkgYW5kIGJlbG93LiIpfSgpO19zYXRlbGxpdGU9JF9fX3Zhcl84MmQyNWE4NjY1NTFhNmYwfSkoKX0K"},{"name":"sugarcoat-moatheader-7754008b0da848856cddb20094976335.min","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0ICRfX19tb2NrXzcyMzVlYTcxMWU0NDM3ZGE9e307KGV4cG9ydHM9PnsidXNlIHN0cmljdCI7Y29uc3QgeGhyVW5zZW50PTA7Y29uc3QgeGhyT3BlbmVkPTE7Y29uc3QgeGhySGVhZGVyc1JlY2VpdmVkPTI7Y29uc3QgeGhyTG9hZGluZz0zO2NvbnN0IHhockRvbmU9NDtjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbD1TeW1ib2woImRlZmVycmVkSGFuZGxlIik7Y29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2w9U3ltYm9sKCJvbmxvYWRzdGFydCIpO2NvbnN0IHhock9uUHJvZ3Jlc3NTeW1ib2w9U3ltYm9sKCJvbnByb2dyZXNzIik7Y29uc3QgeGhyT25BYm9ydFN5bWJvbD1TeW1ib2woIm9uYWJvcnQiKTtjb25zdCB4aHJPbkVycm9yU3ltYm9sPVN5bWJvbCgib25lcnJvciIpO2NvbnN0IHhock9uTG9hZFN5bWJvbD1TeW1ib2woIm9ubG9hZCIpO2NvbnN0IHhock9uVGltZW91dFN5bWJvbD1TeW1ib2woIm9udGltZW91dCIpO2NvbnN0IHhock9uTG9hZEVuZFN5bWJvbD1TeW1ib2woIm9ubG9hZGVuZCIpO2NvbnN0IHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpO2NvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2w9U3ltYm9sKCJyZWFkeVN0YXRlIik7Y29uc3QgeGhyVGltZW91dFN5bWJvbD1TeW1ib2woInRpbWVvdXQiKTtjb25zdCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2w9U3ltYm9sKCJ3aXRoQ3JlZGVudGlhbHMiKTtjb25zdCB4aHJVcGxvYWRTeW1ib2w9U3ltYm9sKCJ1cGxvYWQiKTtjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2w9U3ltYm9sKCJyZXNwb25zZVR5cGUiKTtjb25zdCBkZWZpbmVFdmVudD0ob2JqLHN5bWJvbCk9Pntjb25zdCB0eXBlPXN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixzeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOm51bGwsd3JpdGFibGU6dHJ1ZX0pO29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZnVuY3Rpb24oZXZlbnQpe2NvbnN0IGhhbmRsZXI9dGhpc1tzeW1ib2xdO2lmKGhhbmRsZXIpe2hhbmRsZXIuY2FsbCh0aGlzLGV2ZW50KX19KX07Y29uc3QgY2hhbmdlUmVhZHlTdGF0ZT0oeGhyLHJlYWR5U3RhdGUpPT57eGhyW3hoclJlYWR5U3RhdGVTeW1ib2xdPXJlYWR5U3RhdGU7eGhyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZWFkeXN0YXRlY2hhbmdlIikpfTtsZXQgaXNTZWFsZWQ9dHJ1ZTtjbGFzcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IGV4dGVuZHMgRXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSYmISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIil9ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTdGFydFN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblByb2dyZXNzU3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uQWJvcnRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25FcnJvclN5bWJvbCk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPbkxvYWRTeW1ib2wpO2RlZmluZUV2ZW50KHRoaXMseGhyT25UaW1lb3V0U3ltYm9sKTtkZWZpbmVFdmVudCh0aGlzLHhock9uTG9hZEVuZFN5bWJvbCl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdfXNldCBvbmxvYWRzdGFydCh2YWx1ZSl7dGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF09dmFsdWV9Z2V0IG9ucHJvZ3Jlc3MoKXtyZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXX1zZXQgb25wcm9ncmVzcyh2YWx1ZSl7dGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXT12YWx1ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3hock9uQWJvcnRTeW1ib2xdfXNldCBvbmFib3J0KHZhbHVlKXt0aGlzW3hock9uQWJvcnRTeW1ib2xdPXZhbHVlfWdldCBvbmVycm9yKCl7cmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF19c2V0IG9uZXJyb3IodmFsdWUpe3RoaXNbeGhyT25FcnJvclN5bWJvbF09dmFsdWV9Z2V0IG9udGltZW91dCgpe3JldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF19c2V0IG9udGltZW91dCh2YWx1ZSl7dGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdPXZhbHVlfWdldCBvbmxvYWRlbmQoKXtyZXR1cm4gdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdfXNldCBvbmxvYWRlbmQodmFsdWUpe3RoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXT12YWx1ZX19ZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtpZihpc1NlYWxlZCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfXN1cGVyKCl9fWV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQ9e2NvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTpYTUxIdHRwUmVxdWVzdFVwbG9hZCx3cml0YWJsZTp0cnVlfTtjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO2lzU2VhbGVkPWZhbHNlO2NvbnN0IHhoclVwbG9hZD1uZXcgWE1MSHR0cFJlcXVlc3RVcGxvYWQ7aXNTZWFsZWQ9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6bnVsbCx3cml0YWJsZTp0cnVlfSk7ZGVmaW5lRXZlbnQodGhpcyx4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHhoclJlYWR5U3RhdGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOnhoclVuc2VudCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVGltZW91dFN5bWJvbCx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6ZmFsc2UsdmFsdWU6MCx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTpmYWxzZSx3cml0YWJsZTp0cnVlfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMseGhyVXBsb2FkU3ltYm9sLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTpmYWxzZSx2YWx1ZTp4aHJVcGxvYWQsd3JpdGFibGU6ZmFsc2V9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx4aHJSZXNwb25zZVR5cGVTeW1ib2wse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOiIiLHdyaXRhYmxlOnRydWV9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXX1zZXQgb25yZWFkeXN0YXRlY2hhbmdlKHZhbHVlKXt0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF09dmFsdWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXX1vcGVuKG1ldGhvZCx1cmwpe3N3aXRjaCh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKXtjYXNlIHhoclVuc2VudDpjYXNlIHhockRvbmU6e2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJPcGVuZWQpO2JyZWFrfX19c2V0UmVxdWVzdEhlYWRlcihuYW1lLHZhbHVlKXt9c2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKXt9Z2V0IHRpbWVvdXQoKXtyZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXX1zZXQgdGltZW91dCh2YWx1ZSl7dGhpc1t4aHJUaW1lb3V0U3ltYm9sXT12YWx1ZX1nZXQgd2l0aENyZWRlbnRpYWxzKCl7cmV0dXJuIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXX1zZXQgd2l0aENyZWRlbnRpYWxzKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJVbnNlbnQ6Y2FzZSB4aHJPcGVuZWQ6e2JyZWFrfWRlZmF1bHQ6e3Rocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICd3aXRoQ3JlZGVudGlhbHMnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIFVOU0VOVCBvciBPUEVORUQuIil9fXRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXT0hIXZhbHVlfWdldCB1cGxvYWQoKXtyZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdfXNlbmQoKXtpZih0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdPT09eGhyT3BlbmVkJiZ0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT09PW51bGwpe3RoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdPXNldFRpbWVvdXQoKCk9Pnt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJEb25lKTt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImVycm9yIikpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgibG9hZGVuZCIpKX0sMCl9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpfX1hYm9ydCgpe2lmKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF09PT14aHJPcGVuZWQmJnRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdIT09bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdKTt0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXT1udWxsO2NoYW5nZVJlYWR5U3RhdGUodGhpcyx4aHJVbnNlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgiYWJvcnQiKSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJsb2FkZW5kIikpfX1nZXQgcmVzcG9uc2VVUkwoKXtyZXR1cm4iIn1nZXQgc3RhdHVzKCl7cmV0dXJuIDB9Z2V0IHN0YXR1c1RleHQoKXtyZXR1cm4iIn1nZXRSZXNwb25zZUhlYWRlcihuYW1lKXtyZXR1cm4gbnVsbH1vdmVycmlkZU1pbWVUeXBlKG1pbWUpe31nZXQgcmVzcG9uc2VUeXBlKCl7cmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXX1zZXQgcmVzcG9uc2VUeXBlKHZhbHVlKXtzd2l0Y2godGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSl7Y2FzZSB4aHJEb25lOnt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2V0IHRoZSAncmVzcG9uc2VUeXBlJyBwcm9wZXJ0eSBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3QncyBzdGF0ZSBpcyBMT0FESU5HIG9yIERPTkUuIil9fXN3aXRjaCh2YWx1ZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnt0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF09dmFsdWU7YnJlYWt9fX1nZXQgcmVzcG9uc2UoKXtjb25zdCByZXNwb25zZVR5cGU9dGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdO3JldHVybiByZXNwb25zZVR5cGU9PT0iInx8cmVzcG9uc2VUeXBlPT09InRleHQiPyIiOm51bGx9Z2V0IHJlc3BvbnNlVGV4dCgpe2NvbnN0IHJlc3BvbnNlVHlwZT10aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07aWYocmVzcG9uc2VUeXBlPT09IiJ8fHJlc3BvbnNlVHlwZT09PSJ0ZXh0Iil7cmV0dXJuIiJ9ZWxzZXt0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCB0aGUgJ3Jlc3BvbnNlVGV4dCcgcHJvcGVydHkgZnJvbSAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3QncyAncmVzcG9uc2VUeXBlJyBpcyAnJyBvciAndGV4dCcgKHdhcyAnYXJyYXlidWZmZXInKS4iKX19Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwiVU5TRU5UIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJVbnNlbnR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTpmYWxzZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6eGhyT3BlbmVkfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCJIRUFERVJTX1JFQ0VJVkVEIix7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSx2YWx1ZTp4aHJIZWFkZXJzUmVjZWl2ZWR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkxPQURJTkciLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockxvYWRpbmd9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsIkRPTkUiLHtjb25maWd1cmFibGU6ZmFsc2UsZW51bWVyYWJsZTp0cnVlLHZhbHVlOnhockRvbmV9KTtleHBvcnRzLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6WE1MSHR0cFJlcXVlc3Qsd3JpdGFibGU6dHJ1ZX19KSgkX19fbW9ja183MjM1ZWE3MTFlNDQzN2RhKTsoZnVuY3Rpb24oKXt0cnl7KGZ1bmN0aW9uKEEsdyl7ZnVuY3Rpb24gdmEoKXt1LmsuYS5zeGF6KCJ0cmFja2luZ1JlYWR5Iix7Y2FsbGJhY2s6dmF9KTtxYT1yLmg7ci5oKys7ci5pW3FhXT0hMTt2YXIgYT17fTt1LmFwLmEoYSk7dS5mLmFnKGEpO3UuYWMubCgpO3UubC5lKHUuai5mLDEwMCk7dS5hbS5iKCk7dS5iYi5hKCk7dS5rLmEuYXpzeCgiYWRJbml0aWFsaXplZCIsdS5heS5hKTt1LmMuYXguY3x8KHUuYy5heC5jPSEwLHIuZGNzeCYmKHIuZGNzeC55bmRzKHdpbmRvdywidW5sb2FkIiwidW5sb2FkLSIrdS5jLmF4LmEsInVubG9hZEZuIit1LmMuYXguYSksci5kY3N4LnluZHMod2luZG93LCJiZWZvcmV1bmxvYWQiLCJ1bmxvYWQtIit1LmMuYXguYSwiYmVmb3JldW5sb2FkRm4iK3UuYy5heC5hKSkpO3Iuc3dkZS5henN4KCJ1bmxvYWQtIit1LmMuYXguYSxGYSx7b25jZTohMH0pO3UuYXouYygpO3UuYXouZCgpfXZhciB1PXt9O3cuZmxvb3Iody5yYW5kb20oKSp3LnBvdygxMCwxMikpO3ZhciBXLHJhLG5hLHFhPTAsb2E9e30sTz17fSxGPXt9LFg9W10sQj17fSxqYT0hMSxzYT17MTU6IiIsMTI6IiIsNjoiIiw3OiIifSx0YT1mdW5jdGlvbigpe3UuZC5hKG51bGwsMCl8fHUuZC5iKCk7Zm9yKHZhciBhIGluIE8pTy5oYXNPd25Qcm9wZXJ0eSYmTy5oYXNPd25Qcm9wZXJ0eShhKSYmT1thXSYmdS5hLmEoT1thXSk7Zm9yKGE9MDthPFgubGVuZ3RoO2ErKyl1LmEuYihYW2FdKTtmb3IodmFyIGsgaW4gRilGLmhhc093blByb3BlcnR5JiZGLmhhc093blByb3BlcnR5KGspJiZGW2tdJiYodS5hLmEoRltrXS50aWQpLEZba109ITEpO089e307WD1bXTtMPW51bGw7dS5iPW51bGw7dS5jLmE9bnVsbH07dS5lPXRhOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGIpe3JldHVybihiPWEuYS5jLnRvU3RyaW5nLmNhbGwoYikpJiYoIltvYmplY3QgQXJyYXldIj09PWJ8fCJbb2JqZWN0IEFycmF5IEl0ZXJhdG9yXSI9PT1iKX1hLmE9e307YS5hLmM9e307Zm9yKHZhciBkPVtbMSwyNV0sWzcsMV0sWzEsMjVdLFstNzQsMV0sWzEsOV0sWy0yNCwxXSxbMiwxXSxbMSwzXSxbMiwxXSxbMSw0XSxbMiwxXSxbMSwxXSxbMTEsMV0sWzEsNl0sWzI3LDFdLFsyLDFdLFsxLDNdLFsyNywxXSxbMSwzXSxbLTkyLDFdXSxmPTY1LGc9IiIsYz0wLGM9MDtjPGQubGVuZ3RoO2MrKylmb3IodmFyIGI9MDtiPGRbY11bMV07YisrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoZiksZis9ZFtjXVswXTtnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2EuYS5kPWc7YS5hLmU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBoPSIiLGw9MDtsPGEubGVuZ3RoO2wrKylhLmhhc093blByb3BlcnR5KGwpJiYoaCs9Z1thW2xdXSk7cmV0dXJuIGh9O2EuYS5mPWs7YS5hLmc9ZnVuY3Rpb24oYil7cmV0dXJuISEoYiYmYi5kb2N1bWVudCYmYi5sb2NhdGlvbiYmYlthLmYuYShbMjYsMzcsMzAsNDMsNDVdKV0mJmJbYS5mLmEoWzQ0LDMwLDQ1LDgsMzksNDUsMzAsNDMsNDcsMjYsMzddKV0pfTthLmEuaD1mdW5jdGlvbihiKXtpZihudWxsPT1ifHxhLmEuZyhiKSlyZXR1cm4hMTt2YXIgaD1iLmxlbmd0aDtyZXR1cm4gMT09PWIubm9kZVR5cGUmJmg/ITA6InN0cmluZyI9PT10eXBlb2YgYnx8ayhiKXx8MD09PWh8fCJudW1iZXIiPT09dHlwZW9mIGgmJjA8aCYmaC0xIGluIGJ9O2EuYS5mb3JFYWNoPWZ1bmN0aW9uKGIsaCxsLHApe3ZhciBjLGQ9dHlwZW9mIGI7aWYoYilpZigiZnVuY3Rpb24iPT09ZClmb3IoYyBpbiBiKXtpZigicHJvdG90eXBlIiE9YyYmImxlbmd0aCIhPWMmJiJuYW1lIiE9YyYmKHB8fCFiLmhhc093blByb3BlcnR5fHxiLmhhc093blByb3BlcnR5KGMpKSYmKGQ9aC5jYWxsKGwsYltjXSxjKSwiYm9vbGVhbiI9PT10eXBlb2YgZCYmIWQpKWJyZWFrfWVsc2UgaWYoIm51bWJlciI9PT1kKWZvcihjPTA7YzxiJiYoZD1oLmNhbGwobCxiLGMpLCJib29sZWFuIiE9PXR5cGVvZiBkfHxkKTtjKyspO2Vsc2UgaWYoImZ1bmN0aW9uIj09PXR5cGVvZiBiLmV2ZXJ5KWIuZXZlcnkoZnVuY3Rpb24oYSxiLHApe2E9aC5jYWxsKGwsYSxiKTtyZXR1cm4hKCJib29sZWFuIj09PXR5cGVvZiBhJiYhYSl9KTtlbHNlIGlmKGEuYS5oKGIpKWZvcihjPTA7YzxiLmxlbmd0aCYmKGQ9aC5jYWxsKGwsYltjXSxjKSwiYm9vbGVhbiIhPT10eXBlb2YgZHx8ZCk7YysrKTtlbHNlIGZvcihjIGluIGIpaWYocHx8Yi5oYXNPd25Qcm9wZXJ0eShjKSlpZihkPWguY2FsbChsLGJbY10sYyksImJvb2xlYW4iPT09dHlwZW9mIGQmJiFkKWJyZWFrO3JldHVybiBifTthLmEuaT1mdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt2YXIgaDtpZihiIT09T2JqZWN0KGIpKWg9YjtlbHNlIGlmKGEuYS5oKGIpKXtoPVtdO2Zvcih2YXIgbD0wLHA9Yi5sZW5ndGg7bDxwO2wrKyloW2xdPWJbbF19ZWxzZSBmb3IobCBpbiBoPXt9LGIpaFtsXT1iW2xdO3JldHVybiBofTthLmEuaj1mdW5jdGlvbihiLGgpe2lmKCFifHwiZnVuY3Rpb24iIT09dHlwZW9mIGIpcmV0dXJuITE7dmFyIGw9ITE7MDw9U3RyaW5nKGIpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKT9sPSEwOmEuYy5ifHxiPT09RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nfHwobD0hMCk7bCYmaCYmKGw9Yi50b1N0cmluZyYmYi50b1N0cmluZz09PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyk7cmV0dXJuIGx9O2EuYS5rPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50fWNhdGNoKGEpe3JldHVybiIifX07YS5hLmw9ZnVuY3Rpb24oYil7Yj1ifHxhLmEuaygpO3JldHVybiEoIS9pUGFkfGlQaG9uZXxpUG9kfFNpbGt8S2luZGxlfEFuZHJvaWR8QmxhY2tCZXJyeXxQbGF5Qm9va3xCQjEwfFdpbmRvd3MgUGhvbmV8U3ByZWFkVHJ1bXxNQVVJLy5leGVjKGIpJiYhYS5hLm0oYikpfTthLmEubj1mdW5jdGlvbihiKXtiPWJ8fGEuYS5rKCk7cmV0dXJuISEvQW5kcm9pZC8uZXhlYyhiKX07YS5hLm09ZnVuY3Rpb24oYSxoKXt2YXIgbD1ofHxkb2N1bWVudDtyZXR1cm4hISgvTWFjaW50b3NoLy5leGVjKGEpJiYib250b3VjaGVuZCJpbiBsKX07YS5hLm89ZnVuY3Rpb24oYil7Yj1ifHxhLmEuaygpO3ZhciBoPS9TYWZhcml8Q3JpT1MvaTtyZXR1cm4hKCEvaVBob25lfGlQb2R8aVBhZC8uZXhlYyhiKSYmIWEuYS5tKGIpfHxoLmV4ZWMoYikpfTthLmEucD1mdW5jdGlvbigpe3JldHVybiExfTthLmEucT1mdW5jdGlvbihiKXtiPWJ8fGEuYS5rKCk7cmV0dXJuIGEuYS5uKGIpPyEhL1ZlcnNpb24vLmV4ZWMoYik6ITF9O2EuYS5yPWZ1bmN0aW9uKGIpe2lmKCFuYXZpZ2F0b3IpcmV0dXJuIG51bGw7Yj1ifHxhLmEuaygpO3JldHVybiBiPyhiPWIubWF0Y2goL0VkZ2VcLyhcZHsxLH0oLlxkezEsfSk/KS8pKT9wYXJzZUZsb2F0KGJbMV0pOm51bGw6bnVsbH07YS5hLnM9ZnVuY3Rpb24oKXtpZighbmF2aWdhdG9yKXJldHVybiBudWxsO3ZhciBiO2I9YS5hLmsoKTtyZXR1cm4iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIj09bmF2aWdhdG9yLmFwcE5hbWU/cGFyc2VJbnQoYi5yZXBsYWNlKC9eLipNU0lFIChcZCspLiokLywiJDEiKSwxMCk6Ik5ldHNjYXBlIj09bmF2aWdhdG9yLmFwcE5hbWUmJihiPWIubWF0Y2goLyg/OlRyaWRlbnRcLy4qcnY6fE1TSUUgKShcZCspLykpP3BhcnNlSW50KGJbMV0sMTApOm51bGx9O2EuYS50PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPWEuYS5zKCl9O2EuYS51PWZ1bmN0aW9uKGIsaCl7ZnVuY3Rpb24gbChoLGIpe2lmKGI+PXB8fGghPT1PYmplY3QoaCkpcmV0dXJuITE7ImZ1bmN0aW9uIj09PXR5cGVvZiBoLnRvU3RyaW5nJiZoLnRvU3RyaW5nKCk7dmFyIGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKGgpO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZS50b1N0cmluZyYmZS50b1N0cmluZygpO2I8cCYmYS5hLmZvckVhY2goaCxmdW5jdGlvbihhKXtsKGEsYisxKX0pO3JldHVybiExfXZhciBwPXcubWluKDEwLGh8fDIpO3RyeXtyZXR1cm4gbChiLDApfWNhdGNoKGMpe3JldHVybiEwfX19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhhKXt2YXIgbD1uZXcgUmVnRXhwKCIoXnwgKSIrYSsiKCR8ICkiKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZS5tYXRjaChsKX19ZnVuY3Rpb24gZChhKXt2YXIgbD17fSxiO2ZvcihiIGluIGEpIm51bWJlciI9PT10eXBlb2YgYVtiXSYmKGxbYl09dy5yb3VuZChhW2JdKSk7cmV0dXJuIGx9ZnVuY3Rpb24gZigpe3JldHVybiExfWEuYS52PTI1MDA7YS5hLnc9MWUzO2EuYS54PSExO2EuYS55PSExO2EuYS56PWZ1bmN0aW9uKCl7dmFyIGg9L0ZpcmVmb3hcLyhcZCspLy5leGVjKGEuYS5rKCkpO3JldHVybiBoPyhoPXBhcnNlSW50KGhbMV0sMTApLDIxPmgmJjE0PGgpOiExfSgpO2EuYS5hYT1mdW5jdGlvbigpe3ZhciBoLGw9L14oPzpbYS16XSs6XC9cL3w6P1wvP1wvKT8oPzp3d3dcLik/KFteXC86XSopL2k7YS5jLmN8fChoPWEuYS5hYigpLCFoJiZhLmMuZCYmKGg9YS5jLmQpKTtofHwoaD1hLmMuZS5sb2NhdGlvbi5ob3N0bmFtZSk7cmV0dXJuKGg9aCYmaC5tYXRjaCYmaC5tYXRjaChsKSkmJmhbMV18fGEuYy5lLmxvY2F0aW9uLmhvc3RuYW1lfTthLmEuYWM9ZnVuY3Rpb24oKXt2YXIgaD1hLmEuYWQoKTtpZihoJiZoLnVybClyZXR1cm4gaDt2YXIgaD1hLmcuYSgpLGw9YS5hLmFiKCksYj1hLmEuYWUoaCxsKTtyZXR1cm4gYiYmYi51cmx8fChiPWEuYS5hZihoKSkmJmIudXJsP2I6KGw9YS5hLmFnKGwpKSYmbC51cmw/bDooaD1hLmEuYWgoaCkpP2g6YS5hLmFpKCl9O2EuYS5haT1mdW5jdGlvbigpe2EuYy5mKDEwKTtyZXR1cm57dXJsOiIiLGlzQ29ycmVjdDohMX19O2EuYS5hZD1mdW5jdGlvbigpe2lmKCFhLmMuYylyZXR1cm4hMTt2YXIgaD13aW5kb3cudG9wJiZ3aW5kb3cudG9wLmxvY2F0aW9uJiZ3aW5kb3cudG9wLmxvY2F0aW9uLmhyZWY7aWYoaClyZXR1cm4gYS5jLmYoNCkse3VybDpoLGlzQ29ycmVjdDohMH19O2EuYS5hZz1mdW5jdGlvbihoKXtoPWh8fGEuYS5hYigpO2lmKCFoKXJldHVybiExO2EuYy5mKDIpO3JldHVybnt1cmw6aCxpc0NvcnJlY3Q6ITF9fTthLmEuYWg9ZnVuY3Rpb24oaCl7aD1oJiZoLmRvY3VtZW50JiZoLmRvY3VtZW50LnJlZmVycmVyO2lmKCFoKXJldHVybiExO2EuYy5mKDMpO3JldHVybnt1cmw6aCxpc0NvcnJlY3Q6ITF9fTthLmEuYWY9ZnVuY3Rpb24oaCl7aD1hLmEuYWooaCk7aWYoIWgpcmV0dXJuITE7aC5wYXJlbnRJc1RvcD9hLmMuZigzKTphLmMuZig5KTt2YXIgbD0hMDt0cnl7dmFyIGI7VVJMJiZVUkwuY29uc3RydWN0b3ImJlVSTC5jb25zdHJ1Y3Rvci5uYW1lJiYiRnVuY3Rpb24iPT09VVJMLmNvbnN0cnVjdG9yLm5hbWU/Yj1uZXcgVVJMKGgudXJsKTooYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksYi5ocmVmPWgudXJsKTtsPSIiPT09Yi5wYXRobmFtZXx8Ii8iPT09Yi5wYXRobmFtZX1jYXRjaChlKXt9cmV0dXJue3VybDpoLnVybCxpc0NvcnJlY3Q6IWx9fTthLmEuYWo9ZnVuY3Rpb24oaCxsLGIsZSl7bD1hLmMuYztpZighaHx8bClyZXR1cm4hMTtsPWguZG9jdW1lbnQmJmguZG9jdW1lbnQucmVmZXJyZXI7aWYoIWx8fCFhLmEuYWsobCkpcmV0dXJuITE7aWYoaC5wYXJlbnQ9PT1oLnRvcClyZXR1cm57dXJsOmwscGFyZW50SXNUb3A6ITB9O2g9bG9jYXRpb24mJmxvY2F0aW9uLmFuY2VzdG9yT3JpZ2lucztiPWxvY2F0aW9uJiZsb2NhdGlvbi5vcmlnaW47aWYoIWh8fDA9PT1oLmxlbmd0aHx8IWIpcmV0dXJuITE7ZT0hMTtmb3IodmFyIGMsZD0wO2Q8aC5sZW5ndGg7ZCsrKWlmKGM9aFtkXSxiIT09Yyl7aWYoZSlyZXR1cm4hMTtlPSEwO2I9Y31yZXR1cm4gZSYmMD09PWwuc2VhcmNoKGhbaC5sZW5ndGgtMV0pP3t1cmw6bCxwYXJlbnRJc1RvcDohMX06ITF9O2EuYS5hZT1mdW5jdGlvbihoLGwpe2w9bHx8YS5hLmFiKCk7aWYoIWwpcmV0dXJuITE7dmFyIGI9YS5hLmFsKGgsbCk7aWYoYS5hLmFrKGIpKXJldHVybiBhLmMuZig2KSx7dXJsOmIsaXNDb3JyZWN0OiExfX07YS5hLmFsPWZ1bmN0aW9uKGEsbCl7dmFyIGI7Yj1hJiZhLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhvc3RuYW1lO2I9InN0cmluZyIhPT10eXBlb2YgYj8hMTpiLm1hdGNoKC9eKFteXC5dK1wuKSooZ29vZ2xlc3luZGljYXRpb25cLmNvbXxkb3VibGVjbGlja1wubmV0fGFkbnhzXC5jb20pJC8pJiZhLmxvY2F0aW9uLmhyZWY7aWYoIWJ8fCFsKXJldHVybiExO3ZhciBlPWVuY29kZVVSSUNvbXBvbmVudChsKS5yZXBsYWNlKC9bLiorXiR7fSgpfFtcXVxcXS9nLCJcXCQmIik7cmV0dXJuKGI9Yi5tYXRjaChuZXcgUmVnRXhwKCJbPyZdKD86dXJsfHJlZmVycmVyKT0oIitlKyIoPzolMkZbXiZdKnwkKSkiKSkpP2RlY29kZVVSSUNvbXBvbmVudChiWzFdKTohMX07YS5hLmFtPWZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT10eXBlb2YgYS5jLmcpcmV0dXJuIGEuYy5nO3ZhciBoPSExLGwsYj0vXmh0dHBzPzpcL1wvKC4qPylcLyhbXj8jXSopLzthLmMuYz8oaD13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUucmVwbGFjZSgid3d3LiIsIiIpLGgrPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk6KGw9YS5nLmEoKSxsLnBhcmVudD09PXdpbmRvdy50b3AmJihoPWwuZG9jdW1lbnQucmVmZXJyZXIpJiYobD1iLmV4ZWMoaCkpJiYoaD1sWzFdLnJlcGxhY2UoInd3dy4iLCIiKSsiLyIrbFsyXSkpOyJzdHJpbmciPT09dHlwZW9mIGgmJiIvIj09PWguY2hhckF0KGgubGVuZ3RoLTEpJiYoaD1oLnN1YnN0cigwLGgubGVuZ3RoLTEpKTtyZXR1cm4gaH07YS5hLmFuPWZ1bmN0aW9uKCl7dmFyIGg7YS5jLmM/aD0yOihoPWEuZy5hKCksaD1oLnBhcmVudD09PXdpbmRvdy50b3A/Mjpsb2NhdGlvbiYmbG9jYXRpb24uYW5jZXN0b3JPcmlnaW5zPzE6MCk7cmV0dXJuIGh9O2EuYS5hYj1mdW5jdGlvbigpe3ZhciBhPWxvY2F0aW9uJiZsb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnM7cmV0dXJuIGE/MD09PWEubGVuZ3RoPyExOmFbYS5sZW5ndGgtMV06ITF9O2EuYS5hbz1mdW5jdGlvbigpe3ZhciBoLGw9YS5hLmFhKCksYj1sJiZsLnNwbGl0KCIuIiksZT1iJiZiLmxlbmd0aDszPD1lP2g9ImNvIj09PWJbZS0yXXx8ImNvbSI9PT1iW2UtMl0/YltlLTNdKyIuIitiW2UtMl0rIi4iK2JbZS0xXTpiW2UtMl0rIi4iK2JbZS0xXToyPT1lJiYoaD1iW2UtMl0rIi4iK2JbZS0xXSk7cmV0dXJuIGgmJmRlY29kZVVSSUNvbXBvbmVudChoKXx8ZGVjb2RlVVJJQ29tcG9uZW50KGwpfTthLmEuYXA9ZnVuY3Rpb24oYSl7aWYoInN0cmluZyIhPT10eXBlb2YgYSlyZXR1cm4iIjt2YXIgYj1hLm1hdGNoKC9eKFteOl17Mix9OlwvXC9bXlwvXSopLyk7YiYmYlsxXSYmKGE9YlsxXSk7cmV0dXJuIGF9O2EuYS5hcT1mdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGF8fCJzdHJpbmciIT09dHlwZW9mIGJ8fCIiPT09YXx8IiI9PT1iKXJldHVybiBudWxsO3RyeXt2YXIgcD1uZXcgUmVnRXhwKGIrIj0oW14/JjsjXSopKD86JHxbPyY7I10pIikuZXhlYyhhKX1jYXRjaChlKXtyZXR1cm4gbnVsbH1yZXR1cm4gcCYmcFsxXX07YS5hLmFyPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBwPVthXSxlPTE7ZTw9YjtlKyspcC5wdXNoKGErZSkscC5wdXNoKGEtZSk7cD1wW3cuZmxvb3Iody5yYW5kb20oKSpwLmxlbmd0aCldO2U9dy5mbG9vcih3LnJhbmRvbSgpKnApO3JldHVybnttdWx0aXBsaWVyOnAsc2FtcGxlOjA9PWV9fTthLmEuYXM9ZnVuY3Rpb24oaCxiKXt2YXIgcD1hLmEuYXIoaCxiKTthLmEuYXQocC5tdWx0aXBsaWVyLHAuc2FtcGxlKTtyZXR1cm4gcH07YS5hLmF1PWZ1bmN0aW9uKCl7cmV0dXJuIGEuYS5hcyhhLmgsYS5pKS5zYW1wbGV9O2EuYS5hdD1mdW5jdGlvbihoLGIpe2EuYS5hcz1mdW5jdGlvbigpe3JldHVybnttdWx0aXBsaWVyOmgsc2FtcGxlOmJ9fX07YS5hLmF2PWZ1bmN0aW9uKCl7dmFyIGg9YS5hLnMoKTtyZXR1cm4gNT09PWh8fDY9PT1ofHw3PT09aH07YS5hLmF3PWZ1bmN0aW9uKGEpe3N3aXRjaChhLnMpe2Nhc2UhMTpyZXR1cm4idW5zYWZlIjtjYXNlITA6cmV0dXJuInNhZmUiO2RlZmF1bHQ6cmV0dXJuInNhZmUifX07YS5hLmF4PWZ1bmN0aW9uKGgsYil7cmV0dXJuLTEhPT1hLmEuaW5kZXhPZihoLGIpfTthLmEuYXk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGgpe2lmKCFoKXJldHVybiIiO2g9aC5tYXRjaCgvW1xkXSsvZyk7aC5sZW5ndGg9MztyZXR1cm4gaC5qb2luKCIuIil9dmFyIGI9ITEscD0iIjtpZihuYXZpZ2F0b3IucGx1Z2lucyYmbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoKXt2YXIgZT1uYXZpZ2F0b3IucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIl07ZSYmKGI9ITAsZS5kZXNjcmlwdGlvbiYmKHA9YShlLmRlc2NyaXB0aW9uKSkpO25hdmlnYXRvci5wbHVnaW5zWyJTaG9ja3dhdmUgRmxhc2ggMi4wIl0mJihiPSEwLHA9IjIuMC4wLjExIil9ZWxzZSBpZihuYXZpZ2F0b3IubWltZVR5cGVzJiZuYXZpZ2F0b3IubWltZVR5cGVzLmxlbmd0aCkoYj0oZT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdKSYmZS5lbmFibGVkUGx1Z2luJiZlLmVuYWJsZWRQbHVnaW4uZGVzY3JpcHRpb24pJiYocD1hKGUuZW5hYmxlZFBsdWdpbi5kZXNjcmlwdGlvbikpO2Vsc2UgdHJ5e2U9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjciKSxiPSEwLHA9YShlLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpKX1jYXRjaChjKXt0cnl7ZT1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNiIpLGI9ITAscD0iNi4wLjIxIn1jYXRjaChkKXt0cnl7ZT1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSxiPSEwLHA9YShlLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpKX1jYXRjaChmKXt9fX1yZXR1cm4gYj9wOiIwIn07YS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9ZnVuY3Rpb24oYSxiLHApe2I9Ynx8IioiO3A9cHx8ZG9jdW1lbnQ7aWYocC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXt2YXIgZT1bXSxjPXAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTtpZigiKiIhPT1iKXthPTA7Zm9yKHA9Yy5sZW5ndGg7YTxwO2ErKyl7dmFyIGQ9Y1thXTtkLnRhZ05hbWU9PT1iJiZlLnB1c2goZCl9cmV0dXJuIGV9cmV0dXJuIGN9Yz1bXTtiPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYik7cD1rKGEpO2Q9Yi5sZW5ndGg7Zm9yKGE9MDthPGQ7YSsrKWU9YlthXSxwKGUpJiZjLnB1c2goZSk7cmV0dXJuIGN9O2EuYS5hej1rO2EuYS5iYT1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTt2YXIgcD1uZXcgUmVnRXhwKCIoXnwgKSIrYisiKCR8ICkiKTtyZXR1cm4gYS5jbGFzc05hbWUmJmEuY2xhc3NOYW1lLm1hdGNoKHApfTthLmEuYmI9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBBLWEuZGV9O2EuYS5iYz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9eaHR0cDovLCIiKS5yZXBsYWNlKC9eXC9cLy8sIiIpLnJlcGxhY2UoL153d3dbXi5dKlwuLywiIikuc3BsaXQoIi8iKVswXX07YS5hLmJkPWZ1bmN0aW9uKGgsYixwKXtpZigoInVuZGVmaW5lZCI9PT10eXBlb2YgcHx8IXApJiZoJiYocD1hLmEuYmUoaCksIXApKXJldHVybjtpZihoJiZoLm5vZGVUeXBlKWlmKCJ1bmRlZmluZWQiPT09dHlwZW9mIE5vZGUpe2lmKDEhPWgubm9kZVR5cGUpcmV0dXJufWVsc2UgaWYoaC5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuO2lmKHAuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gcC5nZXRDb21wdXRlZFN0eWxlKGgsIiIpJiZwLmdldENvbXB1dGVkU3R5bGUoaCwiIilbYl07Zm9yKHA9Yi5pbmRleE9mKCItIik7LTE8cDspYj1wPT1iLmxlbmd0aC0xP2Iuc3Vic3RyKDAscCk6Yi5zdWJzdHIoMCxwKStiLmNoYXJBdChwKzEpLnRvVXBwZXJDYXNlKCkrYi5zdWJzdHIocCsyKSxwPWIuaW5kZXhPZigiLSIpO2lmKGguY3VycmVudFN0eWxlKXJldHVybiBoLmN1cnJlbnRTdHlsZVtiXTtpZihoLnN0eWxlKXJldHVybiBoLnN0eWxlW2JdfTthLmEuYmY9ZnVuY3Rpb24oaCl7aWYoIWgpcmV0dXJuITE7dmFyIGI9YS5hLmJkKGgsImJhY2tncm91bmQtaW1hZ2UiKTtifHwoYj1hLmEuYmQoaCwiYmFja2dyb3VuZEltYWdlIikpO3ZhciBwO2ImJihwPShwPWIubWF0Y2goInVybFxcKCguKilcXCkiKSkmJnBbMV0ucmVwbGFjZSgvXHgyMi9nLCIiKSk7cmV0dXJuIHB9O2EuYS5iZz1mdW5jdGlvbihoLGIscCl7aWYoIWgpcmV0dXJuW107dmFyIGU9ImJvb2xlYW4iPT09dHlwZW9mIHA/cDohMSxjPVtoXSxkPSExO2EuYS5mb3JFYWNoKCJudW1iZXIiPT09dHlwZW9mIGI/Yjo1MCxmdW5jdGlvbigpe2lmKChkPWEuYS5iaChoKSkmJjE9PWQubm9kZVR5cGUpaD1kLGMucHVzaChoKTtlbHNlIGlmKGUmJmQmJjk9PWQubm9kZVR5cGUpaWYoKGQ9YS5nLmIoaCkpJiYxPT1kLm5vZGVUeXBlKWg9ZCxjLnB1c2goaCk7ZWxzZSByZXR1cm4hMTtlbHNlIHJldHVybiExfSk7cmV0dXJuIGN9O2EuYS5iaT1mdW5jdGlvbihoLGIpe3ZhciBwPWEuYS5iZyhoKTtyZXR1cm4gcCYmLTEhPT1hLmEuaW5kZXhPZihwLGIpfTthLmEuYmg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZXx8YS5wYXJlbnRFbGVtZW50fHwhMX07YS5hLmJqPWZ1bmN0aW9uKGgpe2g9aHx8YS5hLmsoKTtyZXR1cm4hIS9pUGhvbmV8aVBvZC8uZXhlYyhoKX07YS5hLmJrPWZ1bmN0aW9uKGgpe2g9aHx8YS5hLmsoKTtyZXR1cm4hKCEvaVBhZC8uZXhlYyhoKSYmIWEuYS5tKGgpKX07YS5hLmJsPWZ1bmN0aW9uKCl7dmFyIGg9e307cmV0dXJuIGZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGhbYl0pcmV0dXJuIGhbYl07aFtiXT1udWxsO3ZhciBwPWZ1bmN0aW9uKCl7dmFyIGg9YS5hLmUoWzUsMV0pLGI9YS5hLmUoWzE5LDQ4LDM0LDQ1LDQ1LDMwLDQzXSksbD1hLmEuZShbMTUsMzQsMzksNDUsMzAsNDMsMzAsNDQsNDVdKSxwPWEuYS5lKFswLDQxLDQxLDM3LDMwLDEzLDMwLDQ4LDQ0XSksZT1hLmEuZShbOCwzOSw0NCw0NSwyNiwzMiw0MywyNiwzOF0pLGM9YS5hLmUoWzI0LDMwLDM3LDQxXSksZD1hLmEuZShbMTgsMzksMjYsNDEsMjgsMzMsMjYsNDVdKTtyZXR1cm57RkI6IlxcWyIraCxUd2l0dGVyOmIsUGludGVyZXN0OmwsQXBwbGVOZXdzOnAsSW5zdGFncmFtOmUsWWVscDpjLFNuYXBjaGF0OmR9fSgpO2EuYS5mb3JFYWNoKGEuYS5ibShwKSxmdW5jdGlvbihhKXtpZihuZXcgUmVnRXhwKHBbYV0pLnRlc3QoYikpcmV0dXJuIGhbYl09YSwhMX0pO3JldHVybiBoW2JdfX0oKTthLmEuYm49ZnVuY3Rpb24oKXt2YXIgaDtyZXR1cm4gZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBoKXJldHVybiBoO2g9e3Jlc3VsdHM6e2FydGljbGU6ITEscGFnZV9oZWlnaHQ6ITEsbWV0YV9wcm9wZXJ0aWVzOiExLGZhdmljb246ITF9LG1ldGFfZGF0YTp7bnVtX2FydGljbGVzOjAscGFnZV9oZWlnaHRfcmF0aW86bnVsbCxtZXRhX3Byb3BlcnR5X21hdGNoZXM6W119fTt2YXIgYj1hLmMuZSYmYS5jLmUuZG9jdW1lbnQscD0oYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYXJ0aWNsZSIpKS5sZW5ndGg7MDxwJiYoaC5yZXN1bHRzLmFydGljbGU9ITAsaC5tZXRhX2RhdGEubnVtX2FydGljbGVzPXApO3ZhciBwPWEuYy5oLGU9YS5jLmUmJmEuYy5lLmlubmVySGVpZ2h0LHA9cCYmZSYmcC9lOzEuNTw9cCYmKGgucmVzdWx0cy5wYWdlX2hlaWdodD0hMCxoLm1ldGFfZGF0YS5wYWdlX2hlaWdodF9yYXRpbz1wKTt2YXIgcD1iJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIiksYz17ImZiOmFwcF9pZCI6MSwib2c6c2l0ZV9uYW1lIjoxLCJvZzp0eXBlIjoxLCJmYjpwYWdlX2lkIjoxLCJ0d2l0dGVyOmFjY291bnRfaWQiOjEsInR3aXR0ZXI6c2l0ZSI6MX07YS5hLmZvckVhY2gocCxmdW5jdGlvbihhKXtpZigoYT1hLmdldEF0dHJpYnV0ZSgicHJvcGVydHkiKSkmJmMuaGFzT3duUHJvcGVydHkoYSkpcmV0dXJuIGgucmVzdWx0cy5tZXRhX3Byb3BlcnRpZXM9ITAsaC5tZXRhX2RhdGEubWV0YV9wcm9wZXJ0eV9tYXRjaGVzLnB1c2goYSksITF9KTtiPWImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTthLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGEpe2lmKCJpY29uIj09PWEuZ2V0QXR0cmlidXRlKCJyZWwiKSYmL2Zhdmljb25cLi8udGVzdChhLmdldEF0dHJpYnV0ZSgiaHJlZiIpKSlyZXR1cm4gaC5yZXN1bHRzLmZhdmljb249ITAsITF9KTtyZXR1cm4gaH19KCk7YS5hLmJvPWZ1bmN0aW9uKCl7dmFyIGg9YS5hLmJuKCkucmVzdWx0cyxiO2ZvcihiIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShiKSYmaFtiXSlyZXR1cm4hMDtyZXR1cm4hMX07YS5hLmJwPWZ1bmN0aW9uKCl7Zm9yKHZhciBoPVsxMDMsNDYsMTAwLDExMSwxMTcsOTgsMTA4LDEwMSw5OSwxMDgsMTA1LDk5LDEwNyw0NiwxMTAsMTAxLDExNl0sYj0iIixwPTAsZT1oLmxlbmd0aDtwPGU7cCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoaFtwXSk7cmV0dXJuIG5ldyBSZWdFeHAoIl5bXi5dKy4iK2IpLnRlc3QoYS5hLmFhKCkpfTthLmEuYnE9ZnVuY3Rpb24oKXt2YXIgaD1hLmMuZS5zY3JlZW47aWYoYS5hLm8oKSl7dmFyIGI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93Lm9yaWVudGF0aW9uPzA9PT13aW5kb3cub3JpZW50YXRpb258fDE4MD09PXdpbmRvdy5vcmllbnRhdGlvbj8oYj1oLndpZHRoLGg9aC5oZWlnaHQpOihiPWguaGVpZ2h0LGg9aC53aWR0aCk6Yj1oPTA7cmV0dXJue3c6YixoOmh9fWlmKGEuYS5xKCkpe2I9YS5jLmUuZGV2aWNlUGl4ZWxSYXRpbzt2YXIgZT0xOy4wNT53LmFicyhoLndpZHRoL2EuYy5lLmlubmVyV2lkdGgtYikmJihlPWIpO3JldHVybnt3Omgud2lkdGgvZSxoOmguaGVpZ2h0L2V9fXJldHVybnt3Omgud2lkdGgsaDpoLmhlaWdodH19O2EuYS5icj1mdW5jdGlvbigpe3ZhciBhPW51bGw7InN0cmluZyI9PT10eXBlb2YgbmF2aWdhdG9yLmRvTm90VHJhY2s/YT1uYXZpZ2F0b3IuZG9Ob3RUcmFjazoic3RyaW5nIj09PXR5cGVvZiBuYXZpZ2F0b3IubXNEb05vdFRyYWNrP2E9bmF2aWdhdG9yLm1zRG9Ob3RUcmFjazoic3RyaW5nIj09PXR5cGVvZiB3aW5kb3cuZG9Ob3RUcmFjayYmKGE9d2luZG93LmRvTm90VHJhY2spO3JldHVybiFhfHwiMSIhPT1hWzBdJiYieWVzIiE9PWE/ITE6ITB9O2EuYS5icz1mdW5jdGlvbigpe3ZhciBoO3JldHVybiBmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGgpe3ZhciBiPWEuYS5hbygpO2lmKCFiKXJldHVybiExO3ZhciBlPVthLmYuYShbMzksMzQsMjgsMzYsNzIsMjgsNDAsMzhdKSxhLmYuYShbMzksMzQsMjgsMzYsMzUsNDMsNzIsMjgsNDAsMzhdKV07aD1hLmEuYXgoZSxiKX1yZXR1cm4gaH19KCk7YS5hLmdldEF0dHJpYnV0ZT1mdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfHxhLmdldEF0dHJpYnV0ZShiKX07dmFyIGc9W2Z1bmN0aW9uKGEpe2lmKCFhfHwiSUZSQU1FIiE9PWEubm9kZU5hbWUpcmV0dXJuITE7dmFyIGI9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGlzTmFOKGIpfHwxNTxifHwiZ29vZ2xlX2NvbnZlcnNpb25fZnJhbWUiIT09YS5uYW1lPyExOiEwfV07YS5hLmJ0PWZ1bmN0aW9uKGgsYil7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgaHx8bnVsbD09PWh8fCExPT09aHx8IWEuYS5idShoKXx8aC5ub2RlTmFtZSYmIklNRyI9PWgubm9kZU5hbWUmJiFoLmNvbXBsZXRlfHxhLmEuZmlsdGVyKGcsZnVuY3Rpb24oYSl7cmV0dXJuIGEoaCl9KS5sZW5ndGh8fCEwPT09aFtEXT8hMTohMH07YS5hLmJ2PWZ1bmN0aW9uKGgsYixlKXthLmouYShiKTshMD09PWUmJmIuYWEmJihiLmFhW01dPXZvaWQgMCxiLmFhW0RdPXZvaWQgMCk7IWIuaGFzSWZyYW1lTGlzdGVuZXImJmgudGFnTmFtZSYmImlmcmFtZSI9PT1oLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmKGIuaGFzSWZyYW1lTGlzdGVuZXI9ITApO2IuY29tcG9uZW50cyYmYi5jb21wb25lbnRzLnNwbGljZSgwLDEsaCk7Yi5hYT1oO2Euay5hLnpheHMoImFkRWxlbWVudFVwZGF0ZSIpO2EuYS5idyhiLmFhKTthLmouYihiKTtiLnBlcmlzY29wZU1hbmFnZXImJmIucGVyaXNjb3BlTWFuYWdlci5yZWJ1aWxkUGl4ZWxUYXJnZXRzKGgsaC5wYXJlbnROb2RlKX07YS5hLmJ4PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLzovZywiJTNBIikucmVwbGFjZSgvPS9nLCIlM0QiKS5yZXBsYWNlKC8sL2csIiUyQyIpfTthLmEuYnk9ZnVuY3Rpb24oaCl7dmFyIGI9W107YS5hLmZvckVhY2goaCxmdW5jdGlvbihoLGUpe3ZhciBjPXR5cGVvZiBoOyJudW1iZXIiPT1jP2IucHVzaChhLmEuYngoZSkrIjoiK2EuYS5ieChoKyIiKSk6InN0cmluZyI9PWM/Yi5wdXNoKGEuYS5ieChlKSsiOiIrYS5hLmJ4KCciJytoKyciJykpOiJ1bmRlZmluZWQiPT1jP2IucHVzaChhLmEuYngoZSkrIjoiK2EuYS5ieCgidW5kZWZpbmVkIikpOiJib29sZWFuIj09Yz9iLnB1c2goYS5hLmJ4KGUpKyI6IithLmEuYngoaD8idHJ1ZSI6ImZhbHNlIikpOm51bGw9PT1oP2IucHVzaChhLmEuYngoZSkrIjoiK2EuYS5ieCgibnVsbCIpKToib2JqZWN0IiE9YyYmImZ1bmN0aW9uIiE9Y3x8IWgudG9TdHJpbmd8fGIucHVzaChhLmEuYngoZSkrIjoiK2EuYS5ieCgnIicraC50b1N0cmluZygpKyciJykpfSxudWxsLCEwKTtiLnNvcnQoKTtyZXR1cm4ieyIrYi5qb2luKCIsIikrIn0ifTthLmEuYno9ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoInN0cmluZyIhPXR5cGVvZiBhfHwieyIhPWEuY2hhckF0KDApKXJldHVybiExO2E9YS5zbGljZSgxLC0xKS5zcGxpdCgiLCIpO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgYz1hW2VdLnNwbGl0KCI6Iik7Y1sxXT11bmVzY2FwZShjWzFdKTsidHJ1ZSI9PWNbMV0/Y1sxXT0hMDoiZmFsc2UiPT1jWzFdP2NbMV09ITE6JyInPT1jWzFdLmNoYXJBdCgwKT9jWzFdPWNbMV0uc2xpY2UoMSwtMSk6Y1sxXT0idW5kZWZpbmVkIj09Y1sxXT92b2lkIDA6Im51bGwiPT1jWzFdP251bGw6Ik5hTiI9PWNbMV0/TmFOOnBhcnNlRmxvYXQoY1sxXSk7Ylt1bmVzY2FwZShjWzBdKV09Y1sxXX1yZXR1cm4gYn07YS5hLmJ1PWZ1bmN0aW9uKGgpe3ZhciBiPWgub2Zmc2V0V2lkdGgsZT1oLm9mZnNldEhlaWdodDtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEuYS5jYSYmIWEuYS5jYShiLGUpfHxhLmEueCYmZTxhLmEueHx8YS5hLnkmJmI8YS5hLnkpcmV0dXJuITE7YS5hLmZvckVhY2goYS5hLmJnKGgsMyksZnVuY3Rpb24oYSl7dmFyIGg9YS5zdHlsZSYmYS5zdHlsZS53aWR0aCxjPWEuc3R5bGUmJmEuc3R5bGUuaGVpZ2h0O2EmJmEuc3R5bGUmJiJoaWRkZW4iPT1hLnN0eWxlLm92ZXJmbG93JiYoIiIhPWh8fCIiIT1jKSYmKGE9cGFyc2VGbG9hdChoKSxjPXBhcnNlRmxvYXQoYyksYj0haXNOYU4oYSkmJmE8Yj9hOmIsZT0haXNOYU4oYykmJmM8ZT9jOmUpfSk7KGg9YS5hLmNiKGgpKSYmaC53aWR0aCpoLmhlaWdodDxhLmEudiYmKGI9aC53aWR0aDxiP2gud2lkdGg6YixlPWguaGVpZ2h0PGU/aC5oZWlnaHQ6ZSk7cmV0dXJuIGIqZT49YS5hLnZ9O3ZhciBjPXt9O2EuYS5jYj1mdW5jdGlvbihoKXtpZighaHx8IWgubm9kZU5hbWV8fCJJTUciPT0haC5ub2RlTmFtZXx8IWguY29tcGxldGUpcmV0dXJuITE7dmFyIGI9aC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFiKXJldHVybiExO2lmKGNbYl0pcmV0dXJuIGNbYl07dHJ5e2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGgubmF0dXJhbEhlaWdodCYmInVuZGVmaW5lZCIhPT10eXBlb2YgaC5uYXR1cmFsV2lkdGgpe3ZhciBlPXt3aWR0aDpoLm5hdHVyYWxXaWR0aCxoZWlnaHQ6aC5uYXR1cmFsSGVpZ2h0fTtyZXR1cm4gY1toLnNyY109ZX19Y2F0Y2goZCl7fXJldHVybiBhLmMuYSYmKGEuYy5hLnNyYz1iLGEuYy5hLmEpPyhlPXt3aWR0aDpwYXJzZUludChhLmMuYS5iKSxoZWlnaHQ6cGFyc2VJbnQoYS5jLmEuYyl9LGNbYl09ZSk6ITF9O2EuYS5jYz1mdW5jdGlvbigpe2lmKCFhLmMuaSl7dmFyIGg9YS5jLGI7YTppZihkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYidW5kZWZpbmVkIiE9PXR5cGVvZiBIVE1MU2NyaXB0RWxlbWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdC5jb25zdHJ1Y3Rvcj09PUhUTUxTY3JpcHRFbGVtZW50JiYhZG9jdW1lbnQuY3VycmVudFNjcmlwdFtEXSliPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQsYltEXT0hMDtlbHNle2Zvcih2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksYz1lLmxlbmd0aC0xOy0xPGM7Yy0tKXt2YXIgZD1iPWVbY10sZj1uZXcgUmVnRXhwKCJyZXV0ZXJzaGVhZGVyMTk0ODgzNTUyMDI0KC98JTJGKSIrIihtb2F0aGVhZGVyfHlpfHlpZWxkKS5qcyIucmVwbGFjZSgvXC4vLCJcXC4iKSk7aWYoZCYmZC5zcmMmJmYudGVzdChkLnNyYykmJigidW5kZWZpbmVkIj09PXR5cGVvZiBiW0RdfHwhMCE9PWJbRF0pKXtiW0RdPSEwO2JyZWFrIGF9fWI9dm9pZCAwfWguaT1ifXJldHVybiBhLmMuaT8oYS5jLmlbRF09ITAsYS5jLmkpOm51bGx9O2EuYS5jZD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgZSBpbiBiKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGUpJiYoYVtlXT1iW2VdKX07YS5hLmNlPWZ1bmN0aW9uKGEpe3ZhciBiLGU9L2h0dHBzOi9pO2lmKGEpYj1lLnRlc3QoYS5zcmN8fGEuaHJlZnx8Imh0dHA6Iik/Imh0dHBzOiI6Imh0dHA6IjtlbHNlIHRyeXtiPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH1jYXRjaChjKXthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxhLmhyZWY9IiIsYj1hLnByb3RvY29sfXJldHVybiJodHRwczoiPT09Yj8iaHR0cHM6IjoiaHR0cDoifTthLmEuY2Y9ZnVuY3Rpb24oYSl7dHJ5e3JldHVybi0xIT09KGEuc3JjfHxhLmdldEF0dHJpYnV0ZSgic3JjIikpLmluZGV4T2YoInBzZD0xIil9Y2F0Y2goYil7cmV0dXJuITF9fTthLmEuY2c9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyliLnB1c2goYVtlXSk7cmV0dXJuIGJ9O2EuYS5uZXh0RWxlbWVudFNpYmxpbmc9ZnVuY3Rpb24oYSl7aWYoYS5uZXh0RWxlbWVudFNpYmxpbmcpcmV0dXJuIGEubmV4dEVsZW1lbnRTaWJsaW5nO2Zvcig7YT1hLm5leHRTaWJsaW5nOylpZigxPT09YS5ub2RlVHlwZSlyZXR1cm4gYX07YS5hLnByZXZpb3VzRWxlbWVudFNpYmxpbmc9ZnVuY3Rpb24oYSl7aWYoYSl7aWYoYS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKXJldHVybiBhLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7Zm9yKHZhciBiPTA7KGE9YS5wcmV2aW91c1NpYmxpbmcpJiYxZTM+YjspaWYoYisrLGEmJjE9PT1hLm5vZGVUeXBlKXJldHVybiBhfX07YS5hLmNoPWZ1bmN0aW9uKGEsYixlKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBlJiYoYVtiXT1lKX07YS5hLmNpPWZ1bmN0aW9uKGgpe3JldHVybiBhLmEuZihoKT8wPT09aC5sZW5ndGg6ITB9O2EuYS5maWx0ZXI9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGU9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIoYVtjXSkmJmUucHVzaChhW2NdKTtyZXR1cm4gZX07YS5hLmNqPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKyllLnB1c2goYShiW2NdKSk7cmV0dXJuIGV9O2EuYS5jaz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWEoYltjXSk7bnVsbCE9ZCYmZS5wdXNoKGQpfXJldHVybiBlfTthLmEucmVkdWNlPWZ1bmN0aW9uKGgsYixlKXtpZighYS5hLmgoaCl8fCJmdW5jdGlvbiIhPT10eXBlb2YgYilyZXR1cm4hMTtlPWU/YihlLGhbMF0pOmhbMF07Zm9yKHZhciBjPTE7YzxoLmxlbmd0aDtjKyspZT1iKGUsaFtjXSk7cmV0dXJuIGV9O2EuYS5pbmRleE9mPWZ1bmN0aW9uKGgsYil7aWYoIWgpcmV0dXJuLTE7aWYoYS5hLmYoaCkpe2Zvcih2YXIgZT0wLGM9aC5sZW5ndGg7ZTxjO2UrKylpZihoW2VdPT09YilyZXR1cm4gZTtyZXR1cm4tMX1yZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBoP2J8fCJzdHJpbmciIT09dHlwZW9mIGI/aC5pbmRleE9mKGIpOi0xOi0xfTthLmEubGFzdEluZGV4T2Y9ZnVuY3Rpb24oaCxiKXtpZighaClyZXR1cm4tMTtpZihhLmEuZihoKSl7Zm9yKHZhciBlPWgubGVuZ3RoLTE7MDw9ZTtlLS0paWYoaFtlXT09PWIpcmV0dXJuIGU7cmV0dXJuLTF9cmV0dXJuInN0cmluZyI9PT10eXBlb2YgaD8iIj09PWI/LTE6aC5sYXN0SW5kZXhPZihiKTotMX07YS5hLmJpbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5hcHBseShhLGUpfX07YS5hLmNsPWZ1bmN0aW9uKGgsYil7aWYoIWh8fCFiKXJldHVybiExO3ZhciBlPWEuYS5jbShiKTtpZighZSlyZXR1cm4hMTtpZihhLmEuaGFzQ2hpbGROb2RlcyhlKSl7dmFyIGM9ZS5jaGlsZE5vZGVzW3cubWF4KDAsZS5jaGlsZE5vZGVzLmxlbmd0aC0xKV18fG51bGw7ZS5pbnNlcnRCZWZvcmUoaCxjKX1lbHNlIGUuYXBwZW5kQ2hpbGQoaCk7cmV0dXJuIGV9O2EuYS5jbj1mdW5jdGlvbihoLGIsZSl7aWYoInN0cmluZyIhPXR5cGVvZiBofHwhYnx8IWRvY3VtZW50KXJldHVybiExO2U9ZXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2I9YS5hLmNsKGUsYik7aWYoIWIpcmV0dXJuITE7ZS5zcmM9aDtyZXR1cm4gYn07YS5hLmhhc0NoaWxkTm9kZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmMDxhLmNoaWxkTm9kZXMubGVuZ3RofTthLmEuY209ZnVuY3Rpb24oaCl7aWYoIWgpcmV0dXJuITE7aWYoIk9CSkVDVCIhPT1oLm5vZGVOYW1lJiYiRU1CRUQiIT09aC5ub2RlTmFtZSlyZXR1cm4gaDtoPWEuYS5iZyhoKTt2YXIgYj0hMTthLmEuZm9yRWFjaChoLGZ1bmN0aW9uKGEpe2lmKGEmJiJPQkpFQ1QiIT09YS5ub2RlTmFtZSYmIkVNQkVEIiE9PWEubm9kZU5hbWUpcmV0dXJuIGI9YSwhMX0pO3JldHVybiBifTthLmEuY289ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBhKXJldHVybiExO2Zvcih2YXIgZT0wLGM9Yi5sZW5ndGg7ZTxjO2UrKylpZigic3RyaW5nIj09dHlwZW9mIGJbZV0pe3RyeXthPWFbYltlXV19Y2F0Y2goZCl7fWlmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpcmV0dXJuITF9cmV0dXJuIGF9O2EuYS5jcD1mdW5jdGlvbihhKXtyZXR1cm4gQiYmInVuZGVmaW5lZCIhPT10eXBlb2YgYSYmQlthXT9CW2FdOiExfTthLmEuY3E9ZnVuY3Rpb24oaCl7aWYoIWh8fCJvYmplY3QiIT09dHlwZW9mIGh8fCJudW1iZXIiIT09dHlwZW9mIGguenIpcmV0dXJuITE7dmFyIGI9YS5hLmNwKGguenIpO3JldHVybiBiJiZiPT09aH07YS5hLmNyPWZ1bmN0aW9uKGgsYil7Zm9yKHZhciBlPWEuYS5iZyhoLDUwLCEwKSxjPTA7YzxlLmxlbmd0aDtjKyspaWYoZVtjXT09PWIpcmV0dXJuITA7cmV0dXJuITF9O2EuYS5jcz1mdW5jdGlvbihhKXtpZighYXx8IWEuYWEpcmV0dXJuITE7aWYoIm51bWJlciIhPT10eXBlb2YgYS5BREFSRUEpe3ZhciBiLGU7aWYoYS5pc0NvbXBvc2l0ZUFkJiZhLmNvbXBvbmVudHMmJjE8YS5jb21wb25lbnRzLmxlbmd0aClmb3IoYj1hLkFEQVJFQT0wO2I8YS5jb21wb25lbnRzLmxlbmd0aDtiKyspYS5BREFSRUErPWEuY29tcG9uZW50c1tiXS5vZmZzZXRXaWR0aCphLmNvbXBvbmVudHNbYl0ub2Zmc2V0SGVpZ2h0O2Vsc2UgYS5lbGVtZW50UmVjdD8oYj1hLmVsZW1lbnRSZWN0LnJpZ2h0LWEuZWxlbWVudFJlY3QubGVmdCxlPWEuZWxlbWVudFJlY3QuYm90dG9tLWEuZWxlbWVudFJlY3QudG9wLGEuQURBUkVBPWIqZSk6YS5BREFSRUE9YS5hYS5vZmZzZXRXaWR0aCphLmFhLm9mZnNldEhlaWdodH1yZXR1cm4gYS5BREFSRUF9O2EuYS5idz1mdW5jdGlvbihiKXtpZighKCFifHxiJiZiLkNMSVBDSEVDS0lOR1RBUkdFVCkpe3ZhciBlPWEuYS5iZyhiLDMpLGM7ZSYmMDxlLmxlbmd0aCYmKGEuYS5mb3JFYWNoKGUsZnVuY3Rpb24oYSl7aWYoYSYmYS5zdHlsZSYmYS5zdHlsZS5jbGlwKXJldHVybiBjPWEsITF9KSwhYyYmYi5zdHlsZSYmYi5zdHlsZS5jbGlwJiYoYz1iKSxjJiYoYi5DTElQQ0hFQ0tJTkdUQVJHRVQ9YykpfX07dmFyIGI9L3JlY3RcKChcZCspcHgsPyA/KFxkKylweCw/ID8oXGQrKXB4LD8gPyhcZCspcHhcKS87YS5hLmN0PWZ1bmN0aW9uKGgpe2g9aC5tYXRjaChiKTt2YXIgZT0hMTtoJiYoaD1hLmEuY2ooZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfSxoKSxlPXt0b3A6aFsxXSxyaWdodDpoWzJdLGJvdHRvbTpoWzNdLGxlZnQ6aFs0XX0pO3JldHVybiBlfTthLmEuY3U9ZnVuY3Rpb24oYSxiKXt2YXIgZT0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl2YXIgZD1lbmNvZGVVUklDb21wb25lbnQoYVtjXSksZT1lKygiJiIrYysiPSIrZCk7cmV0dXJuIGUuc2xpY2UoMSl9O2EuYS5jdj1mdW5jdGlvbihhKXt2YXIgYj0wO2lmKDE+YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdmFyIGM9YS5jaGFyQ29kZUF0KGUpLGI9KGI8PDUpLWIrYyxiPWImYjtyZXR1cm4gdy5hYnMoYil9O2EuYS5jdz1mdW5jdGlvbihiLGUpe3ZhciBjPW5ldyBBLGM9W2MuZ2V0RnVsbFllYXIoKSwoIjAiKyhjLmdldE1vbnRoKCkrMSkpLnNsaWNlKC0yKSwoIjAiK2MuZ2V0RGF0ZSgpKS5zbGljZSgtMildLmpvaW4oIi0iKTtyZXR1cm4gYS5hLmN2KGIrKGUrYykpfTthLmEuY3g9ZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQrd2luZG93LmlubmVyV2lkdGgtMTowLGI9d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQtMTowO3JldHVybiBhfHxiPyFkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGEsYik6ITB9KCk7cmV0dXJuIGZ1bmN0aW9uKGIsZSxjKXtpZighYSl7dmFyIGQ9Yy5kZWZhdWx0Vmlld3x8Yy5wYXJlbnRXaW5kb3d8fHdpbmRvdztiKz1kLnBhZ2VYT2Zmc2V0O2UrPWQucGFnZVlPZmZzZXR9cmV0dXJuIGMuZWxlbWVudEZyb21Qb2ludChiLGUpfX0oKTthLmEuY3k9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O2EuYS5jej1mdW5jdGlvbihiKXtpZighYnx8IWIuc3R5bGV8fCFiLnN0eWxlLmZpbHRlcilyZXR1cm4hMTtiPWIuc3R5bGUuZmlsdGVyLnNwbGl0KCIgIik7dmFyIGU9ITEsYzthLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL1xkKy8pO2Euc2VhcmNoKC9vcGFjaXR5LykmJmImJjA8Yi5sZW5ndGgmJihjPXBhcnNlRmxvYXQoYi5qb2luKCIiKSksITE9PT1lfHxjPGUpJiYoZT1jKX0pO3JldHVybiBlfTthLmEuZGE9ZnVuY3Rpb24oYixlKXt2YXIgYztpZighYilyZXR1cm4gMTAwO2lmKGUmJmIuc3R5bGUmJiJoaWRkZW4iPT09Yi5zdHlsZS52aXNpYmlsaXR5KXJldHVybiAwO2M9Yi5zdHlsZSYmYi5zdHlsZS5vcGFjaXR5P3BhcnNlRmxvYXQoYi5zdHlsZS5vcGFjaXR5KTphLmEuY3ooYik7cmV0dXJuIGEuYS5kYihjKT9jOjEwMH07YS5hLmRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmJhY2tncm91bmRDb2xvcj8oYT1hLmJhY2tncm91bmRDb2xvciwidHJhbnNwYXJlbnQiPT09YT8wOi0xIT09YS5pbmRleE9mKCJyZ2IiKT80PmEuc3BsaXQoIiwiKS5sZW5ndGg/MTpwYXJzZUZsb2F0KGEuc3BsaXQoIiwiKVszXS5zcGxpdCgiKSIpWzBdKToxKTotMX07YS5hLmRkPWZ1bmN0aW9uKGIsZSl7dmFyIGM9LTE7aWYoYS5jLmUuZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIGQ9YS5jLmUuZ2V0Q29tcHV0ZWRTdHlsZShiKTtpZighZClyZXR1cm4gYztpZihlJiYiaGlkZGVuIj09PWQudmlzaWJpbGl0eXx8ImNvbGxhcHNlIj09PWQudmlzaWJpbGl0eXx8ZSYmMD09PWEuYS5kYyhkKSlyZXR1cm4gMDtjPXBhcnNlRmxvYXQoZC5vcGFjaXR5KX1yZXR1cm4gY307YS5hLmRlPWZ1bmN0aW9uKGIsZSxjKXtpZighYnx8IWIuYWEpcmV0dXJuITE7InVuZGVmaW5lZCI9PT10eXBlb2YgYi5wYXJlbnROb2RlVHJlZSYmKGIucGFyZW50Tm9kZVRyZWU9YS5hLmJnKGIuYWEucGFyZW50RWxlbWVudCw1MCwhMCksZSYmYi5wYXJlbnROb2RlVHJlZS5wdXNoKGIuYWEpKTt2YXIgZD0xMDAsZixnO2EuYS5mb3JFYWNoKGIucGFyZW50Tm9kZVRyZWUsZnVuY3Rpb24oYil7Zj1hLmEuZGEoYixjKTswPT09ZiYmKGc9YS5hLmRkKGIsYyksYS5hLmRiKGcpJiZnPj1mJiYoZj1nKSk7ZjxkJiYoZD1mKTtpZigwPT09ZClyZXR1cm4hMX0pO3JldHVybiBkfTthLmEuZGY9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBmdW5jdGlvbigpe2IuYXBwbHkoZXx8bnVsbCxhLmNvbmNhdChhLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpfX07YS5hLmJlPWZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hJiZhLm93bmVyRG9jdW1lbnQ7cmV0dXJuIGImJihiLmRlZmF1bHRWaWV3fHxiLnBhcmVudFdpbmRvdyl9Y2F0Y2goZSl7cmV0dXJuITF9fTthLmEuZGc9ZnVuY3Rpb24oYixlLGMpe2lmKCFifHwhZSlyZXR1cm4hMTt2YXIgZD1bXTsibnVtYmVyIiE9PXR5cGVvZiBjJiYoYz01MCk7Zm9yKHZhciBmPTA7ZjxjO2YrKylpZihlIT1lLnBhcmVudCl7aWYoYj1hLmcuYihiLGUpKWQucHVzaChiKTtlbHNlIGJyZWFrO2U9ZS5wYXJlbnR9ZWxzZSBicmVhaztyZXR1cm4gZH07YS5hLmRoPWZ1bmN0aW9uKGEpe2E9dy5tYXgoNCxhKTtyZXR1cm4oKDErdy5yYW5kb20oKSkqdy5wb3coMTYsYSl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLGEpfTthLmEuZGk9ZnVuY3Rpb24oKXt2YXIgYj1hLmEuZGg7cmV0dXJuIGIoNCkrIi0iK2IoNCkrIi0iK2IoNCkrIi0iK2IoNCl9O2EuYS5hPWZ1bmN0aW9uKGEpe3dpbmRvdyYmd2luZG93LmNsZWFyVGltZW91dCYmd2luZG93LmNsZWFyVGltZW91dChhKX07YS5hLmI9ZnVuY3Rpb24oYSl7d2luZG93JiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCYmd2luZG93LmNsZWFySW50ZXJ2YWwoYSl9O3ZhciBlPWZ1bmN0aW9uKGIsZSl7aWYoYS5hLmooZS50b1N0cmluZykpcmV0dXJuIGUudG9TdHJpbmcoKTtpZihhLmEuaihiJiZiLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZykpcmV0dXJuIGUudG9TdHJpbmc9Yi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsZS50b1N0cmluZygpO3ZhciBjPWEuYy5lIT09YiYmYS5jLmUmJmEuYy5lLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztpZihhLmEuaihjKSlyZXR1cm4gZS50b1N0cmluZz1jLGUudG9TdHJpbmcoKTtpZihhLmMuaiYmOD49YS5hLnMoKSlyZXR1cm4gZS50b1N0cmluZygpO3ZhciBjPWJ8fHdpbmRvdyxkPWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSUZSQU1FIik7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLnN0eWxlLndpZHRoPSIwcHgiO2Quc3R5bGUuaGVpZ2h0PSIwcHgiO2Qud2lkdGg9IjAiO2QuaGVpZ2h0PSIwIjthLmEuY2woZCxjLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7ZC5jb250ZW50V2luZG93JiYoZS50b1N0cmluZz1kLmNvbnRlbnRXaW5kb3cuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKTt2YXIgZj1lLnRvU3RyaW5nKCk7Yy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIGZ9O2EuYS50b1N0cmluZz1mdW5jdGlvbihiLGMpe2M9Y3x8YS5jLmU7dmFyIGQ7dHJ5e2Q9ZShjLGIpfWNhdGNoKGYpe2Q9Yi50b1N0cmluZygpfXJldHVybiBkfTthLmEuZGo9ZnVuY3Rpb24oYixlLGMpe2I9YS5hLnRvU3RyaW5nKGIsYyk7aWYoYS5jLmsoKSljLmV2YWwoIigiK2IrIikoIitlKyIpIik7ZWxzZSBpZihhLmMubChjKSluZXcgYy5GdW5jdGlvbigiKCIrYisiKSgiK2UrIikiKSgpO2Vsc2V7dmFyIGQ9Yy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7ZC50ZXh0PSIoIitiKyIpKCIrZSsiKSI7YS5hLmNsKGQsYy5kb2N1bWVudC5ib2R5KX19O2EuYS5kaz1mdW5jdGlvbihiLGUsYyxkKXtmdW5jdGlvbiBmKGEsYil7dHJ5e3JldHVybiBkKGJbYV0pfWNhdGNoKGgpe319dmFyIGcseDtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiExOyJmdW5jdGlvbiIhPT10eXBlb2YgZCYmKGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTtnPXdpbmRvdzt4PWYoYixnKTtpZigheCl7ZT1hLmcuYyhnLCJudW1iZXIiPT09dHlwZW9mIGU/ZToyMCk7aWYoIWUpcmV0dXJuITE7Zm9yKHZhciBuPTAsbT1lLmxlbmd0aDtuPG0mJihnPWVbbl0seD1mKGIsZyksInVuZGVmaW5lZCI9PT10eXBlb2YgeCk7bisrKTt9cmV0dXJuIGM/W3gsZ106eH07YS5hLmRsPWZ1bmN0aW9uKGEsYil7dmFyIGU9YS50b1N0cmluZygpO2ImJihlPSIoIitlKyIoIitiKyIpKSIpO3JldHVybiIoZnVuY3Rpb24oKXt0cnl7cmV0dXJuKCIrZSsiKSgpfWNhdGNoKGUpe3JldHVybiBmYWxzZX19KSgpIn07YS5hLmRtPWZ1bmN0aW9uKCl7aWYoIWEuYy5tKXJldHVybiExO3ZhciBiPWEuYS5rKCksZT1iJiYic3RyaW5nIj09PXR5cGVvZiBiLGM9L1ZlcnNpb25cLyhcZCopLyxkPS9DUFUuKk9TXHMoXGQqKV8vLGM9KGM9ZSYmYi5tYXRjaChjKSkmJjE8Yy5sZW5ndGg/cGFyc2VJbnQoY1sxXSwxMCk6ITE7Im51bWJlciIhPT10eXBlb2YgYyYmKGM9KGM9ZSYmYi5tYXRjaChkKSkmJjE8Yy5sZW5ndGg/cGFyc2VJbnQoY1sxXSwxMCk6ITEpO3JldHVybiBjfTthLmEuYm09ZnVuY3Rpb24oYSl7aWYoIm9iamVjdCI9PT10eXBlb2YgYSl7aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKGEpO3ZhciBiPVtdLGU7Zm9yKGUgaW4gYSliLnB1c2goZSk7cmV0dXJuIGJ9fTthLmEuZXZlcnk9ZnVuY3Rpb24oYSxiKXtpZigib2JqZWN0IiE9PXR5cGVvZiBhfHwhYXx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiKXJldHVybiExO2Zvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJiEwIT09YihhW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH07YS5hLmRuPWZ1bmN0aW9uKGEsYil7Yj1ifHx7d2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHN0eWxlOntsZWZ0OiItOTk5OXB4Iix0b3A6Ii05OTk5cHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9fTtmb3IodmFyIGUgaW4gYilpZihiLmhhc093blByb3BlcnR5KGUpKWlmKCJzdHlsZSI9PT1lKWlmKCJzdHJpbmciPT09dHlwZW9mIGJbZV0pYS5zZXRBdHRyaWJ1dGUoZSxiW2VdKTtlbHNlIGZvcih2YXIgYyBpbiBiW2VdKWJbZV0uaGFzT3duUHJvcGVydHkoYykmJihhW2VdW2NdPWJbZV1bY10pO2Vsc2UgYVtlXT1iW2VdfTthLmEuc29tZT1mdW5jdGlvbihhLGIpe2lmKCJvYmplY3QiIT09dHlwZW9mIGF8fCFhfHwiZnVuY3Rpb24iIT09dHlwZW9mIGIpcmV0dXJuITE7Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmITA9PT1iKGFbZV0pKXJldHVybiEwO3JldHVybiExfTthLmFbImRvIl09ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHwhMT09PWF8fCIiPT09YT8hMDohMX07YS5hLmRwPWZ1bmN0aW9uKGIpe3JldHVybiBiJiZhLmEuZihiKSYmMDxiLmxlbmd0aD9iWzBdOmJ9O2EuYS5kcT1mdW5jdGlvbihiLGUpe3ZhciBjPWV8fHdpbmRvdztpZighY3x8IWMucGVyZm9ybWFuY2V8fCFjLnBlcmZvcm1hbmNlLmdldEVudHJpZXMpcmV0dXJue21zZzoibnMifTt2YXIgYz1jLnBlcmZvcm1hbmNlLmdldEVudHJpZXMoKSxmPVtdO2EuYS5mb3JFYWNoKGMsZnVuY3Rpb24oYSl7Yi50ZXN0KGEubmFtZSkmJmYucHVzaChkKGEpKX0pO3JldHVybiAwPT09Zi5sZW5ndGg/e21zZzoibmYifTpmfTthLmEuZHI9ZnVuY3Rpb24oYixlLGMpe3JldHVybiBhLmEuZGIoYikmJmEuYS5kYihlKSYmYS5hLmRiKGMpP3cuYWJzKGItZSk8PWM6ITF9O2EuYS5kYj1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiYhaXNOYU4oYSl9O2EuYS5kcz1mdW5jdGlvbihiLGUpe2lmKCFhLmEuZihlKSlyZXR1cm4hMTt2YXIgYz0wO2EuYS5mb3JFYWNoKGUsZnVuY3Rpb24oYSl7YT09PWImJmMrK30pO3JldHVybiBjfTthLmEuYWs9ZnVuY3Rpb24oYSl7cmV0dXJuInN0cmluZyIhPT10eXBlb2YgYT8hMTovXig/Omh0dHBzPzpcL1wvKT9bXi46XC9dKyg/OlwuW14uOlwvXSspLy50ZXN0KGEpfTthLmEuZHQ9ZnVuY3Rpb24oYixlKXtyZXR1cm4gYS5hLmV2ZXJ5KGIsZnVuY3Rpb24oYil7cmV0dXJuIGEuYS5heChiLnZhbHVlcyxlW2IubG9va3VwXXx8IiIpfSl9O2EuYS5kdT1mdW5jdGlvbihhLGIpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhfHwic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiEwO3ZhciBlPWFbYi50b0xvd2VyQ2FzZSgpXSxjPWEuYWxsO3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIGU/ITEhPT1lOiJ1bmRlZmluZWQiIT09dHlwZW9mIGMmJiExIT09Y307YS5hLmR2PWZ1bmN0aW9uKGIsZSl7aWYoIWEuYS5mKGIpKXJldHVybiBhLmEuZHUoYixlKTt2YXIgYz0hMTthLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGIpe2lmKGEuYS5kdShiLGUpKXJldHVybiBjPSEwLCExfSk7cmV0dXJuIGN9O2EuYS5kdz1mdW5jdGlvbihiLGUpe2lmKCFhLmEuZihiKSlyZXR1cm4gYS5hLmR1KGIsZSk7aWYoIWIubGVuZ3RoKXJldHVybiExO3ZhciBjPSEwO2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYil7aWYoIWEuYS5kdShiLGUpKXJldHVybiBjPSExfSk7cmV0dXJuIGN9O2EuYS5keD1mdW5jdGlvbihhLGIpe2lmKGEmJiJvYmplY3QiPT09dHlwZW9mIGEpeyJzdHJpbmciIT09dHlwZW9mIGImJihiPSJhbGwiKTt2YXIgZT1hW2JdO3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIGU/ZTphLmFsbH19O2EuYS5keT1mdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGF8fCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIGE7YS5tYXRjaChiKXx8KGErPWIpO3JldHVybiBhfTthLmEuZHo9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuX0FEX0ZPUk1BVHx8bnVsbH07YS5hLmVhPWZ1bmN0aW9uKGIsZSl7dmFyIGM9YS5hLmR6KGUpO3JldHVybiFjfHxhLmEuYXgoYixjKX07YS5hLmViPWY7YS5hLmVjPWY7YS5hLmVkPWY7YS5hLmVlPWY7YS5hLmVmPWZ1bmN0aW9uKCl7cmV0dXJuITB9O2EuYS5lZz1mdW5jdGlvbihiKXt2YXIgZT0idW5kZWZpbmVkIiE9PXR5cGVvZiBiLng/Yi54OmIubGVmdDtpZigibnVtYmVyIj09PXR5cGVvZiBlKXt2YXIgYz0idW5kZWZpbmVkIiE9PXR5cGVvZiBiLnk/Yi55OmIudG9wO2lmKCJudW1iZXIiPT09dHlwZW9mIGMpe3ZhciBkLGYsZyx4O2Q9Yi53fHxiLndpZHRoO2lmKCJudW1iZXIiPT09dHlwZW9mIGQmJjAhPWQpZz1lK2Q7ZWxzZSBpZihnPSJ1bmRlZmluZWQiIT09dHlwZW9mIGIucj9iLnI6Yi5yaWdodCwibnVtYmVyIj09PXR5cGVvZiBnJiZnPmUpZD1nLWU7ZWxzZSByZXR1cm47Zj1iLmh8fGIuaGVpZ2h0O2lmKCJudW1iZXIiPT09dHlwZW9mIGYmJjAhPWYpeD1jK2Y7ZWxzZSBpZih4PSJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYj9iLmI6Yi5ib3R0b20sIm51bWJlciI9PT10eXBlb2YgeCYmYzx4KWY9eC1jO2Vsc2UgcmV0dXJuO2EuYS5jZChiLHt4OmUseTpjLHc6ZCxoOmYscjpnLGI6eH0pO3JldHVybiBifX19O2EuYS5laD1mdW5jdGlvbihiLGUsYyl7aWYoIm51bWJlciIhPT10eXBlb2YgZXx8MD49ZXx8aXNOYU4oZSkpZT1iLmxlbmd0aDtpZigibnVtYmVyIiE9PXR5cGVvZiBjfHwwPj1jfHxpc05hTihjKSljPXcubWluKGIubGVuZ3RoLDUwKTtiPWEuYS5jayhhLmEuZWcsYik7Yi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudypiLmgtYS53KmEuaH0pO2I9Yi5zbGljZSgwLGMpO3ZhciBkPVtdO2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYil7dmFyIGg9Yi54LGM9Yi55LGY9Yi5yLGc9Yi5iLHA9ITA7YS5hLmZvckVhY2goZCxmdW5jdGlvbihhKXt2YXIgYj1hLnksZT1hLnIsZD1hLmI7aD49YS54JiZjPj1iJiZmPD1lJiZnPD1kJiYocD0hMSk7cmV0dXJuIHB9LGQpO3AmJmQucHVzaChiKTtyZXR1cm4gZC5sZW5ndGg8ZX0pO3JldHVybiBkfX0pKHUpOyhmdW5jdGlvbihhKXthLmc9e307YS5nLmQ9ZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPXR5cGVvZiBhLmxvY2F0aW9uLnRvU3RyaW5nO2lmKCJ1bmRlZmluZWQiPT09ZHx8InVua25vd24iPT09ZClyZXR1cm4hMDt2YXIgZj10eXBlb2YgYS5kb2N1bWVudDtpZigidW5kZWZpbmVkIj09PWZ8fCJ1bmtub3duIj09PWYpcmV0dXJuITA7dmFyIGc9YS5pbm5lcldpZHRofHxhLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8YS5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRofHwwO3JldHVybiJudW1iZXIiIT09dHlwZW9mKGEuc2NyZWVuWHx8YS5zY3JlZW5MZWZ0fHwwKXx8Im51bWJlciIhPT10eXBlb2YgZz8hMDohMX1jYXRjaChjKXtyZXR1cm4hMH19fSkodSk7KGZ1bmN0aW9uKGEpe2EuZy5lPWZ1bmN0aW9uKGspe2lmKCFrKXJldHVybiBudWxsO3RyeXtpZihrLm1vYXRIb3N0aWxlSWZyYW1lKXJldHVybiBudWxsO3ZhciBkPWsuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZihkJiZkLnNsaWNlJiYiaHR0cCI9PT1kLnNsaWNlKDAsNCkmJmEuYS5iYyhkKSE9YS5hLmJjKHdhLmxvY2F0aW9uLnRvU3RyaW5nKCkpKXJldHVybiBrLm1vYXRIb3N0aWxlSWZyYW1lPSEwLG51bGw7dmFyIGY9ayYmKGsuY29udGVudERvY3VtZW50fHxrLmNvbnRlbnRXaW5kb3cmJmsuY29udGVudFdpbmRvdy5kb2N1bWVudCk7aWYoZiYmInN0cmluZyI9PT10eXBlb2YgZi5sb2NhdGlvbi50b1N0cmluZygpKXJldHVybiBmO2subW9hdEhvc3RpbGVJZnJhbWU9ITA7cmV0dXJuIG51bGx9Y2F0Y2goZyl7cmV0dXJuIGsubW9hdEhvc3RpbGVJZnJhbWU9ITAsbnVsbH19O2EuZy5iPWZ1bmN0aW9uKGssZCl7ZD1kfHxhLmEuYmUoayk7dHJ5e3JldHVybiBkJiZkLmZyYW1lRWxlbWVudH1jYXRjaChmKXtyZXR1cm4hMX19O2EuZy5mPWZ1bmN0aW9uKGssZCl7dmFyIGY7YS5hLmZvckVhY2goay5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksZnVuY3Rpb24oYSl7aWYoYSYmYS5jb250ZW50V2luZG93JiZhLmNvbnRlbnRXaW5kb3c9PWQpcmV0dXJuIGY9YSwhMX0pO3JldHVybiBmfTthLmcuZz1mdW5jdGlvbihrKXtpZihrPWEuZy5iKGspKXRyeXtyZXR1cm4gay5wYXJlbnROb2RlfWNhdGNoKGQpe31yZXR1cm4gbnVsbH07YS5nLmg9ZnVuY3Rpb24oayxkKXtpZighaylyZXR1cm4hMTt2YXIgZj0wLGc9W107Zm9yKGQ9ZHx8MTA7ZjxkOylpZihmKyssaz1hLmcuYihrKSlnLnB1c2goayk7ZWxzZSByZXR1cm4gZ307YS5nLmM9ZnVuY3Rpb24oayxkKXtpZighaylyZXR1cm4hMTt2YXIgZj0wLGc9W2tdLGM7Zm9yKGQ9ZHx8MTA7ZjxkOyl7ZisrO3RyeXtpZihrPShjPWsuZnJhbWVFbGVtZW50KSYmYS5hLmJlKGMpLGMmJmsmJiFhLmcuZChrKSlnLnB1c2goayk7ZWxzZSByZXR1cm4gZ31jYXRjaChiKXticmVha319cmV0dXJuIGd9O2EuZy5pPWZ1bmN0aW9uKGssZCxmKXtmdW5jdGlvbiBnKGMsYixlKXt2YXIgaD1bXTtjJiZoLnB1c2goYyk7ZT1lfHwwO2lmKDEwPGV8fCFjfHwhYy5mcmFtZXMpcmV0dXJuIGg7dmFyIGQ7dHJ5e2Q9aXNOYU4oYy5mcmFtZXMubGVuZ3RoKT8xMDA6Yy5mcmFtZXMubGVuZ3RofWNhdGNoKGYpe2Q9MTAwfWZvcih2YXIgcD0wO3A8ZDtwKyspdHJ5e3RyeXtpZih2b2lkIDA9PWMuZnJhbWVzW3BdKWJyZWFrfWNhdGNoKGYpe2JyZWFrfWImJiFhLmcuaihjLmZyYW1lc1twXSk/aC5wdXNoKGMuZnJhbWVzW3BdKTpoPWguY29uY2F0KGcoYy5mcmFtZXNbcF0sYixlKzEpKX1jYXRjaChmKXticmVha31yZXR1cm4gaH1yZXR1cm4gZyhrLGQsZil9O2EuZy5rPWZ1bmN0aW9uKGEsZCl7ZD0ibnVtYmVyIj09dHlwZW9mIGQmJjA8ZD9kOjE1O3ZhciBmPVtdLGc7dHJ5e2lmKGEpe2c9YS50b3A7Zm9yKHZhciBjPTA7YzxkO2MrKylpZigoYT1hLnBhcmVudCkmJmEhPWEudG9wKWYucHVzaChhKTtlbHNlIGJyZWFrO2YucHVzaChnKX19Y2F0Y2goYil7cmV0dXJuW119cmV0dXJuIGZ9O2EuZy5sPVtdO2EuZy5qPWZ1bmN0aW9uKGspe2Zvcih2YXIgZCxmPTAsZz1hLmcubC5sZW5ndGg7ZjxnO2YrKylhLmcubFtmXS53aW49PWsmJihkPWEuZy5sW2ZdKTtpZighZCl7ZD17d2luOmssZnJpZW5kbHk6ITF9O3RyeXtrLmRvY3VtZW50JiYoZC5mcmllbmRseT0hMCl9Y2F0Y2goYyl7fX1yZXR1cm4gZC5mcmllbmRseX07YS5nLm09ZnVuY3Rpb24oayxkLGYpe2s9YS5nLmMoaykucG9wKCk7az1hLmcuaShrLCEwKTtmb3IodmFyIGc9MCxjPWsubGVuZ3RoO2c8YztnKyspaWYoa1tnXT09ZCl7aWYoZiYmZC5wYXJlbnQmJmEuZy5kKGQucGFyZW50KSlicmVhaztyZXR1cm4hMH1yZXR1cm4hMX07YS5nLmE9ZnVuY3Rpb24oKXtpZihhLmMuYylyZXR1cm4gd2luZG93LnRvcDtmb3IodmFyIGs9MCxkPXdpbmRvdzs1MD5rOyl7aysrO2lmKGQ9PT13aW5kb3cudG9wfHxhLmcuZChkLnBhcmVudCkpYnJlYWs7ZD1kLnBhcmVudH1yZXR1cm4gZH19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhkKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz0hMTtyZXR1cm4gZnVuY3Rpb24oYyl7dHJ5e3JldHVybiBkJiZkLmFwcGx5P2QuYXBwbHkobnVsbCxhcmd1bWVudHMpOmQoYyl9Y2F0Y2goeCl7aWYoIWcpe2c9ITA7dmFyIGI9KG5ldyBBKS5nZXRUaW1lKCk7dGhpc1siTW9hdCNFVFMiXXx8KHRoaXNbIk1vYXQjRVRTIl09Yik7dGhpc1siTW9hdCNFTUMiXXx8KHRoaXNbIk1vYXQjRU1DIl09MCk7dmFyIGU9MzZlNTw9Yi10aGlzWyJNb2F0I0VUUyJdLGg9IiI7dHJ5e2g9ZC50b1N0cmluZygpfWNhdGNoKG4pe2g9ImZhaWxlZCJ9aD14Lm5hbWUrIiBpbiBjbG9zdXJlIChjYik6ICIreC5tZXNzYWdlKyIsIHN0YWNrPSIreC5zdGFjaysiLCBcbmNiPSIraCsiXG4iO2lmKCFlJiYxMD50aGlzWyJNb2F0I0VNQyJdKXt0aGlzWyJNb2F0I0VNQyJdKys7dHJ5e3ZhciBsPSJ1bmRlZmluZWQiIT09dHlwZW9mIG9taWROYXRpdmUmJigidW5kZWZpbmVkIj09PXR5cGVvZiBJbWFnZXx8SW1hZ2UmJkltYWdlLl9Nb2F0UHJveHlPZikscD1sPyIiOmRvY3VtZW50LnJlZmVycmVyLHQ9InVuZGVmaW5lZCIhPT10eXBlb2YgYSYmYS5jJiZhLmMubj9hLmMubjoiIixxPSJodHRwczovL3B4Lm1vYXRhZHMuY29tL3BpeGVsLmdpZj9lPTI0JmQ9ZGF0YSUzQWRhdGElM0FkYXRhJTNBZGF0YSZpPSIrZXNjYXBlKCJSRVVURVJTX0hFQURFUjEiKSsiJmFjPTEmaz0iK2VzY2FwZShoKSsiJmFyPSIrZXNjYXBlKCIyOWFkNTlkLWNsZWFuIikrIiZpdz0iK2VzY2FwZSgiMzFkNjk2NSIpKyImYnE9Iitlc2NhcGUodCkrIiZqPSIrZXNjYXBlKHApKyImY3M9IisobmV3IEEpLmdldFRpbWUoKTtpZihsKW9taWROYXRpdmUuc2VuZFVybChxKTtlbHNle3ZhciBrPW5ldyBJbWFnZSgxLDEpO2suc3JjPXF9fWNhdGNoKG4pe319ZWxzZSBpZihlKXt0aGlzWyJNb2F0I0VNQyJdPTE7dGhpc1siTW9hdCNFVFMiXT1iO3RyeXtwPShsPSJ1bmRlZmluZWQiIT09dHlwZW9mIG9taWROYXRpdmUmJigidW5kZWZpbmVkIj09PXR5cGVvZiBJbWFnZXx8SW1hZ2UmJkltYWdlLl9Nb2F0UHJveHlPZikpPyIiOmRvY3VtZW50LnJlZmVycmVyLHQ9InVuZGVmaW5lZCIhPT10eXBlb2YgYSYmYS5jJiZhLmMubj9hLmMubjoiIixxPSJodHRwczovL3B4Lm1vYXRhZHMuY29tL3BpeGVsLmdpZj9lPTI0JmQ9ZGF0YSUzQWRhdGElM0FkYXRhJTNBZGF0YSZpPSIrZXNjYXBlKCJSRVVURVJTX0hFQURFUjEiKSsiJmFjPTEmaz0iK2VzY2FwZShoKSsiJmFyPSIrZXNjYXBlKCIyOWFkNTlkLWNsZWFuIikrIiZpdz0iK2VzY2FwZSgiMzFkNjk2NSIpKyImYnE9Iitlc2NhcGUodCkrIiZqPSIrZXNjYXBlKHApKyImY3M9IisobmV3IEEpLmdldFRpbWUoKSxsP29taWROYXRpdmUuc2VuZFVybChxKTooaz1uZXcgSW1hZ2UoMSwxKSxrLnNyYz1xKX1jYXRjaChuKXt9fX19fX0oKX1hLmw9e307dmFyIGQ9e307YS5sLmE9ZDthLmwuYj1mdW5jdGlvbihkLGcpe2lmKCFkfHwic3RyaW5nIiE9PXR5cGVvZiBnfHwhZFtnXXx8ZD09d2luZG93KXJldHVybiExO2lmKCJzdHJpbmciPT09dHlwZW9mIGQubm9kZU5hbWUmJigiT0JKRUNUIj09PWQubm9kZU5hbWV8fCJFTUJFRCI9PT1kLm5vZGVOYW1lKSl7dmFyIGM9YSYmYS5iJiZhLmJbZ107aWYoYyYmYyE9PWRbZ10pcmV0dXJuIGN9cmV0dXJuITF9O2EubC5jPWZ1bmN0aW9uKGYsZyxjLGIpe3ZhciBlLGgsbD0hMTsidG91Y2hzdGFydCI9PT1nJiZhLmMubyYmKGw9e3Bhc3NpdmU6ITB9KTtiP2RbZytiXT9jPWRbZytiXTooYz1rKGMpLGRbZytiXT1jKTpjPWsoYyk7aWYoZi5hZGRFdmVudExpc3RlbmVyKWI9ImFkZEV2ZW50TGlzdGVuZXIiLGU9IiI7ZWxzZSBpZihmLmF0dGFjaEV2ZW50KWI9ImF0dGFjaEV2ZW50IixlPSJvbiI7ZWxzZSByZXR1cm4hMTtpZihoPWEubC5iKGYsYikpdHJ5e2guY2FsbChmLGUrZyxjLGwpfWNhdGNoKHApe2ZbYl0oZStnLGMsbCl9ZWxzZSBpZihmJiZiJiZmW2JdKXRyeXtmW2JdKGUrZyxjLGwpfWNhdGNoKHApe3JldHVybiExfX07YS5sLmQ9ZnVuY3Rpb24oZixnLGMsYil7dmFyIGUsaDtjPWI/ZFtnK2JdOmM7ZGVsZXRlIGRbZytiXTtpZighZilyZXR1cm4hMTtpZihmLnJlbW92ZUV2ZW50TGlzdGVuZXIpYj0icmVtb3ZlRXZlbnRMaXN0ZW5lciIsZT0iIjtlbHNlIGlmKGYuZGV0YWNoRXZlbnQpYj0iZGV0YWNoRXZlbnQiLGU9Im9uIjtlbHNlIHJldHVybiExO2lmKGg9YS5sLmIoZixiKSl0cnl7aC5jYWxsKGYsZStnLGMsITEpfWNhdGNoKGwpe2ZbYl0oZStnLGMsITEpfWVsc2UgdHJ5e2ZbYl0oZStnLGMsITEpfWNhdGNoKGwpe319O2EubC5lPWZ1bmN0aW9uKGQsZyl7ZD1rKGQpO3ZhciBjO3dpbmRvdyYmd2luZG93LnNldEludGVydmFsJiYoYz13aW5kb3cuc2V0SW50ZXJ2YWwoZCxnKSwxPT1jJiYoYS5hLmIoYyksYz13aW5kb3cuc2V0SW50ZXJ2YWwoZCxnKSksWC5wdXNoKGMpKTtyZXR1cm4gY307YS5sLmY9ZnVuY3Rpb24oZCxnKXt2YXIgYyxiPWsoZnVuY3Rpb24oYSl7ZGVsZXRlIE9bY107cmV0dXJuIGQmJmQuYXBwbHk/ZC5hcHBseShudWxsLGFyZ3VtZW50cyk6ZChhKX0pO3dpbmRvdyYmd2luZG93LnNldFRpbWVvdXQmJihjPXdpbmRvdy5zZXRUaW1lb3V0KGIsZyksMT09YyYmKGEuYS5hKGMpLGM9d2luZG93LnNldFRpbWVvdXQoYixnKSksT1tjXT0hMCk7cmV0dXJuIGN9O2EubC5nPWZ1bmN0aW9uKGQsZyxjLGIpe2lmKCFiKXJldHVybiExO2IrPSIiO0ZbYl0mJmEuYS5hKEZbYl0udGlkKTtGW2JdPXt9O0ZbYl0uY2FsbGJhY2s9ayhkKTtGW2JdLnBhcmFtcz1nO0ZbYl0uaW50ZXJ2YWw9YztGW2JdLnRpZD1hLmwuZihhLmwuaChiKSxjKX07YS5sLmg9ZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIUZ8fCFGW2RdKXJldHVybiExO3ZhciBnPUZbZF0uY2FsbGJhY2soRltkXS5wYXJhbXMpO2lmKCJib29sZWFuIj09PXR5cGVvZiBnJiYhMT09PWcpcmV0dXJuIGEuYS5hKEZbZF0udGlkKSxGW2RdPSExO0ZbZF0udGlkPWEubC5mKGEubC5oKGQpLEZbZF0uaW50ZXJ2YWwpfX07YS5sLmk9ZnVuY3Rpb24oZCl7RltkXSYmKGEuYS5hKEZbZF0udGlkKSxGW2RdPSExKX07YS5sLmo9ZnVuY3Rpb24oKXtyZXR1cm4gRn07YS5sLms9ZnVuY3Rpb24oZCxnLGMsYil7dmFyIGU9MCxoPWZ1bmN0aW9uKCl7ZSs9MTshMCE9PWQoKSYmKGU8Zz9hLmwuZihoLGMpOiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpKX07aCgpfTthLmwubD1rfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoKXtpZigibnVtYmVyIj09PXR5cGVvZiBhLmEucigpKXJldHVybiExO3ZhciBkPWEuYS5rKCk7cmV0dXJuKGQ9ZCYmZC5tYXRjaCgvQ2hyb20oZXxpdW0pXC8oWzAtOV0rKVwuLykpP3BhcnNlSW50KGRbMl0sMTApOiExfWEuYz17fTt2YXIgZD1hLmcuZCh3aW5kb3cucGFyZW50KTthLmMucD13aW5kb3chPXdpbmRvdy5wYXJlbnQ7YS5jLnE9YS5jLnAmJiFkO2EuYy5jPWQ/ITE6IWEuZy5kKHdpbmRvdy50b3ApO2EuYy5lPWEuYy5jP3dpbmRvdy50b3A6YS5jLnE/d2luZG93LnBhcmVudDp3aW5kb3c7YS5jLnI9ZnVuY3Rpb24oYSl7dmFyIGQsYyxiLGU9MCxoPTA7dHJ5eyhkPWEuZG9jdW1lbnQsYz1kLmRvY3VtZW50RWxlbWVudCxiPWQuYm9keSwidW5kZWZpbmVkIiE9PXR5cGVvZiBhLmlubmVyV2lkdGgpPyhlPWEuaW5uZXJXaWR0aCxoPWEuaW5uZXJIZWlnaHQpOiJDU1MxQ29tcGF0Ij09PWQuY29tcGF0TW9kZSYmNSE9PWQuZG9jdW1lbnRNb2RlfHwhYnx8InVuZGVmaW5lZCI9PT10eXBlb2YgYi5jbGllbnRXaWR0aD9jJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBjLmNsaWVudFdpZHRoJiYoZT1jLmNsaWVudFdpZHRoLGg9Yy5jbGllbnRIZWlnaHQpOihlPWIuY2xpZW50V2lkdGgsaD1iLmNsaWVudEhlaWdodCl9Y2F0Y2gobCl7fXJldHVybnt3aWR0aDplLGhlaWdodDpoLGxlZnQ6MCxyaWdodDplLHRvcDowLGJvdHRvbTpofX07YS5jLnM9ZnVuY3Rpb24oKXtpZighYS5jLmV8fCFhLmMuZS5zY3JlZW4pcmV0dXJuIG51bGw7dmFyIGQ9YS5jLmUuc2NyZWVuO3JldHVybnt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodCxhdmFpbFdpZHRoOmQuYXZhaWxXaWR0aCxhdmFpbEhlaWdodDpkLmF2YWlsSGVpZ2h0fX07YS5jLnQ9ZnVuY3Rpb24oKXt2YXIgZD1hLmMuZTtpZighZClyZXR1cm4hMTt0cnl7dmFyIGc9ZC5kb2N1bWVudCYmZC5kb2N1bWVudC5ib2R5LGM9ZC5kb2N1bWVudCYmZC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fXRyeXt2YXIgYj1hLmMucygpO2ImJihhLmMudT1iLmF2YWlsV2lkdGgsYS5jLnY9Yi5hdmFpbEhlaWdodCxhLmMudz1iLndpZHRoLGEuYy54PWIuaGVpZ2h0KX1jYXRjaChlKXthLmMudT1hLmMudXx8MCxhLmMudj1hLmMudnx8MCxhLmMudz1hLmMud3x8MCxhLmMueD1hLmMueHx8MH1iPWEuYy5yKGQpO2EuYy55PWIud2lkdGg7YS5jLno9Yi5oZWlnaHQ7dHJ5e2EuYy5hYT1kLm91dGVyV2lkdGh8fGQuZG9jdW1lbnQmJmQuZG9jdW1lbnQuYm9keSYmZC5kb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRofHwwLGEuYy5hYj1kLm91dGVySGVpZ2h0fHxkLmRvY3VtZW50JiZkLmRvY3VtZW50LmJvZHkmJmQuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR8fDB9Y2F0Y2goZSl7YS5jLmFhPTAsYS5jLmFiPTB9ZyYmYyYmKGEuYy5oPXcubWF4KGcuc2Nyb2xsSGVpZ2h0LGcub2Zmc2V0SGVpZ2h0LGMuY2xpZW50SGVpZ2h0LGMuc2Nyb2xsSGVpZ2h0LGMub2Zmc2V0SGVpZ2h0KSxhLmMuYWM9Zy5zY3JvbGxUb3B8fGMuc2Nyb2xsVG9wfHxkLnBhZ2VZT2Zmc2V0fHwwKX07YS5jLnQoKTthLmMuYj0wPD1TdHJpbmcoRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIik7YS5jLmFkPS0xIT09YS5hLmsoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImZpcmVmb3giKTthLmMuaj1hLmEudCgpO2EuYy5hZT0hIXdpbmRvdy5jaHJvbWUmJmEuYS5qKHdpbmRvdy5jaHJvbWUuY3NpLCEwKTthLmMuYWY9ISEoIm9wciJpbiB3aW5kb3cmJiJhZGRvbnMiaW4gd2luZG93Lm9wciYmYS5hLmood2luZG93LkRldGFjaGVkVmlld0NvbnRyb2xFdmVudCkpO2EuYy5hZz0hYS5jLmFlJiZFcnJvci5wcm9wZXJ0eUlzRW51bWVyYWJsZSgiY2FwdHVyZVN0YWNrVHJhY2UiKSYmdm9pZCAwIT09d2luZG93Lm9ub3JpZW50YXRpb25jaGFuZ2U7YS5jLmFoPWEuYy5hZnx8YS5jLmFnO2EuYy5haT1hLmMuYWUmJighIXdpbmRvdy5BdG9taWNzJiYhIXdpbmRvdy5BdG9taWNzLm5vdGlmeXx8ISF3aW5kb3cuRW50ZXJQaWN0dXJlSW5QaWN0dXJlRXZlbnR8fCEhd2luZG93LmNocm9tZS53ZWJzdG9yZSk7YS5jLmFqPWEuYy5hZSYmIWEuYy5haCYmdm9pZCAwIT09d2luZG93Lm9ub3JpZW50YXRpb25jaGFuZ2U7YS5jLmFrPWEuYy5haXx8YS5jLmFqO2EuYy5hbD1uYXZpZ2F0b3ImJm5hdmlnYXRvci5hcHBWZXJzaW9uJiYtMTxuYXZpZ2F0b3IuYXBwVmVyc2lvbi5zZWFyY2goL0VkZ2VcL1xkKi5cZCovKSYmIWRvY3VtZW50LmRvY3VtZW50TW9kZSYmISF3aW5kb3cuU3R5bGVNZWRpYTthLmMubT0wPE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpLmluZGV4T2YoIkNvbnN0cnVjdG9yIil8fHdpbmRvdy5IVE1MVmlkZW9FbGVtZW50JiZ3aW5kb3cuSFRNTFZpZGVvRWxlbWVudC5wcm90b3R5cGUmJiJ3ZWJraXRXaXJlbGVzc1ZpZGVvUGxheWJhY2tEaXNhYmxlZCJpbiB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudC5wcm90b3R5cGU7YS5jLmFtPWZ1bmN0aW9uKCl7dmFyIGQ7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgZClyZXR1cm4gZDtkPXtpc0luQXBwOjAsZW52OiJOb3QgYXBwIn07YS5hLnAoKT8oZC5pc0luQXBwPTEsZC5lbnY9InR2T1MiKTphLmEubygpPyhkLmlzSW5BcHA9MSxkLmVudj0iaU9TIik6YS5hLnEoKSYmKGQuaXNJbkFwcD0xLGQuZW52PSJBbmRyb2lkIik7cmV0dXJuIGR9fSgpO2EuYy5hbj1rO2EuYy5hbz1hLmMuYWkmJjQwPD1rKCk7YS5jLmFwPWZ1bmN0aW9uKCl7aWYoIWEuYy5hbylyZXR1cm4hMTt2YXIgZD1hLmYuYShbNDgsMzAsMjcsMjksNDMsMzQsNDcsMzAsNDNdKTtpZihuYXZpZ2F0b3ImJm5hdmlnYXRvcltkXSlyZXR1cm4hMDtpZig2Nj5rKCkpe3ZhciBkPWEuZi5hKFsyOCwzMyw0Myw0MCwzOCwzMF0pLGc9YS5mLmEoWzQzLDQ2LDM5LDQ1LDM0LDM4LDMwXSksYz1hLmYuYShbMjgsNDAsMzksMzksMzAsMjgsNDVdKTtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3dbZF0mJiEod2luZG93W2RdJiZ3aW5kb3dbZF1bZ10mJndpbmRvd1tkXVtnXVtjXSl9cmV0dXJuITF9O2EuYy5hcT1mdW5jdGlvbigpe2lmKGEuZi5iIT09YS5mLmMudG9TdHJpbmcoKSlyZXR1cm4hMTt2YXIgZD1hLmYuYShbNDgsMzAsMjcsMjksNDMsMzQsNDcsMzAsNDNdKTtyZXR1cm4gd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yW2RdfTthLmMuYXI9ZnVuY3Rpb24oKXtpZihhLmYuYiE9PWEuZi5kLnRvU3RyaW5nKCkpcmV0dXJuITE7dmFyIGQ9YS5mLmEoWzI2LDM3LDMwLDQzLDQ1XSksZz1hLmYuYShbMjgsNDAsMzksMzEsMzQsNDMsMzhdKSxjPWEuZi5hKFs0MSw0Myw0MCwzOCw0MSw0NV0pO3JldHVybiFhLmMuYW0oKS5pc0luQXBwJiZhLmMubSYmYS5jLmImJiFhLmEuaih3aW5kb3dbZF0sITApJiYhYS5hLmood2luZG93W2ddLCEwKSYmIWEuYS5qKHdpbmRvd1tjXSwhMCl9fSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoKXt2YXIgYT0xOS4udG9TdHJpbmcoMikubGVuZ3RoLTEsYz0xO3JldHVybiBmdW5jdGlvbigpe2M8PD0xOzAhPWM+PmEmJihjXj0xOSk7cmV0dXJuIGN9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIDk9PT1hPzMwOjEwPT09YT8zMTphfWEuZj17fTthLmYuZT0wO2EuZi5jPTE7YS5mLmY9MjthLmYuZD0zO2EuZi5nPTQ7dmFyIGY9YS5hLmQ7YS5mLmg9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPSIiLGI9MDtiPGEubGVuZ3RoO2IrKyl2YXIgZT1hLmNoYXJDb2RlQXQoYileODUsYz1jK1N0cmluZy5mcm9tQ2hhckNvZGUoZSk7YT1jO2Zvcih2YXIgYz0iIixlPWI9MCxoLGQscCx0PTA7dDxhLmxlbmd0aDsrK3QpZm9yKHA9YS5jaGFyQ29kZUF0KHQpLGQ9MjU1PHA/MDoxOzI+ZDsrK2QpYj0wPT09ZD9ifChwJjY1MjgwKS8yNTY8PGU6YnwocCYyNTUpPDxlLGUrPTgsMTM8ZSYmKGg9YiY4MTkxLDg4PGg/KGI+Pj0xMyxlLT0xMyk6KGg9YiYxNjM4MyxiPj49MTQsZS09MTQpLGMrPWYuY2hhckF0KGglOTEpLGMrPWYuY2hhckF0KGgvOTF8MCkpOzA8ZSYmKGMrPWYuY2hhckF0KGIlOTEpLDc8ZXx8OTA8YikmJihjKz1mLmNoYXJBdChiLzkxfDApKTtyZXR1cm4gY307YS5mLmk9ZnVuY3Rpb24oYSl7dmFyIGM9W107aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYSlmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGU9YS5jaGFyQ29kZUF0KGIpOzEyOD5lP2MucHVzaChlKToyMDQ4PmU/Yy5wdXNoKDE5MnxlPj42LDEyOHxlJjYzKTo1NTI5Nj5lfHw1NzM0NDw9ZT9jLnB1c2goMjI0fGU+PjEyLDEyOHxlPj42JjYzLDEyOHxlJjYzKTpiPGEubGVuZ3RoLTEmJihiKyssZT02NTUzNisoKGUmMTAyMyk8PDEwfGEuY2hhckNvZGVBdChiKSYxMDIzKSxjLnB1c2goMjQwfGU+PjE4LDEyOHxlPj4xMiY2MywxMjh8ZT4+NiY2MywxMjh8ZSY2MykpfWI9dy5mbG9vcigxZTMqdy5yYW5kb20oKSklMjUxO2E9WzQwKmIlMjUxXTtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKWI9KGIqYisoZSsxKSklMjUxLGEucHVzaChjW2VdXmIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LmJ0b2EpYz0iIjtlbHNle2M9W107Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhW2JdKSk7Yz1idG9hKGMuam9pbigiIikpfXJldHVybiBjfTthLmYuaj1mdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsYj1rKCksZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgaDtoPWQoYS5jaGFyQ29kZUF0KGUpKTt2YXIgbD0wPT09ZSUyP2IoKTotMSpiKCk7aD0wPT09bD9oOjEyNjxoK2w/MzArKGwtKDEyNi1oKS0xKTozMD5oK2w/MTI2KyhsKyhoLTMwKSsxKTpoK2w7Yys9U3RyaW5nLmZyb21DaGFyQ29kZSgzMD09PWg/OTozMT09PWg/MTA6aCl9cmV0dXJuIGN9O2EuZi5rPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixiPWsoKSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBoPWIoKSxsO2w9ZChhW2VdLmNoYXJDb2RlQXQoMCkpO2g9MD09PWUlMj9oOi0xKmg7bD0wPT09aD9sOjMwPmwtaD8xMjYtKGgtKGwtMzApLTEpOjEyNjxsLWg/MzAtKGgrKDEyNi1sKSsxKTpsLWg7Yys9U3RyaW5nLmZyb21DaGFyQ29kZSgzMD09PWw/OTozMT09PWw/MTA6bCl9cmV0dXJuIGN9O2EuZi5sPWZ1bmN0aW9uKGQsYyl7dmFyIGI9W107YS5hLmZvckVhY2goZCxmdW5jdGlvbihhLGgpe2lmKHZvaWQgMCE9PWEmJigic3RyaW5nIj09PXR5cGVvZihjP2FbY106YSl8fCJudW1iZXIiPT09dHlwZW9mKGM/YVtjXTphKXx8ImJvb2xlYW4iPT09dHlwZW9mKGM/YVtjXTphKSkpe3ZhciBkPVN0cmluZyhjP2FbY106YSkuc3BsaXQoIiYiKS5qb2luKCIlMjYiKS5zcGxpdCgiPSIpLmpvaW4oIiUzRCIpO2IucHVzaCgoIm51bWJlciI9PT10eXBlb2YgaD8iIjpoKyI9IikrZCl9fSxudWxsLCEwKTtiLnNvcnQoKTtyZXR1cm4gYi5qb2luKCImIil9O2EuZi5hPWEuYS5lO2EuZi5tPWZ1bmN0aW9uKCl7dmFyIGQ9ZG9jdW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlfHx7fTthLmYubj1bITA9PT0oISF3aW5kb3cuY2hyb21lJiYoISF3aW5kb3cuQXRvbWljcyYmISF3aW5kb3cuQXRvbWljcy5ub3RpZnl8fCEhd2luZG93LkVudGVyUGljdHVyZUluUGljdHVyZUV2ZW50fHwhIXdpbmRvdy5jaHJvbWUud2Vic3RvcmUpKT8xOjAsITA9PT0oInVuZGVmaW5lZCIhPT10eXBlb2YgSW5zdGFsbFRyaWdnZXJ8fCJNb3pBcHBlYXJhbmNlImluIGQpPzE6MCwhMD09PSEhd2luZG93Lm9wZXJhPzE6MCwhMD09PWEuYy5tPzE6MCwhMD09PSghKyJcdjEifHwhIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ISF3aW5kb3cuQWN0aXZlWE9iamVjdHx8Ii1tcy1zY3JvbGwtbGltaXQiaW4gZCYmIi1tcy1pbWUtYWxpZ24iaW4gZCk/MTowXTtmb3IodmFyIGQ9ITEsYz0wO2M8YS5mLm4ubGVuZ3RoO2MrKylpZigxPT09YS5mLm5bY10pe2Q9YzticmVha30hMSE9PWQmJihhLmYuYj1kKTtyZXR1cm4gYS5mLmJ9O2EuZi5iPWEuZi5tKCl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaygpe3JldHVybiExfWEuYy5hcz0iMjYiO2EuYy5hdD0iTW9hdFN1cGVyViI7YS5jLmF1PSItIjthLmMuZj1mdW5jdGlvbihiKXsic3RyaW5nIiE9PXR5cGVvZiBhLmMuZyYmKGEuYy5hdT1iKX07YS5jLmF2PXt9O2EuYy5hdz1hLmMuYXQrYS5jLmFzO2EuYy5uPTExO2EuYy5heD13aW5kb3cmJndpbmRvd1siTW9hdCNHIithLmMuYXNdfHx7fTthLmMuYXk9Ik1vYXQjRyIrYS5jLmFzO3dpbmRvd1thLmMuYXldPWEuYy5heDthLmMuYXguYXx8KGEuYy5heC5hPXcuZmxvb3Iody5yYW5kb20oKSp3LnBvdygxMCwxMikpKTthLmMuYXo9dy5mbG9vcih3LnJhbmRvbSgpKncucG93KDEwLDEyKSk7dmFyIGQ9YS5hLmFjKCk7YS5jLmJhPWQudXJsO2EuYy5iYj1kLmlzQ29ycmVjdDtkPWEubC5sKGZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnR9KTthLmMuYmM9ZCgpOyJzdHJpbmciIT09dHlwZW9mIGEuYy5iYyYmKGEuYy5iYz0iIik7YS5jLmJkPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX0oKTthLmMuYmU9ZnVuY3Rpb24oKXtyZXR1cm4hIXdpbmRvdy5vbWlkM3AmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5vbWlkM3AuY3VzdG9tTmF0aXZlfTthLmMuYmY9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmJnPWZ1bmN0aW9uKCl7dmFyIGI9YS5jLmJmKCl8fGEuYy5iZSgpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBifX0oKTthLmMuYmg9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt9fSgpO2EuYy5iaT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiExfX0oKTthLmMuYmo9KG5ldyBBKS5nZXRUaW1lKCk7YS5jLmJrPSEwO2EuYy5ibD0hMDthLmMuYm09ITE7YS5jLmJtPSEwO2EuYy5ibj1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiLiIpO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgZT0wOzM+ZTtlKyspe3ZhciBjPXBhcnNlSW50KGFbZV0pLGQ9cGFyc2VJbnQoYltlXSk7aWYoYyYmaXNOYU4oZCkpcmV0dXJuIDE7aWYoZCYmaXNOYU4oYykpcmV0dXJuIDA7aWYoYz5kKXJldHVybiAxO2lmKGQ+YylyZXR1cm4gMH1yZXR1cm4gMn07YS5jLmJvPWs7YS5jLmJwPWs7YS5jLmJxPWs7YS5jLmJyPWs7YS5jLmJzPWs7YS5jLmJ0PWs7YS5jLmJ1PWs7YS5jLmJ2PWs7dmFyIGY9ZnVuY3Rpb24oKXt2YXIgYj1mdW5jdGlvbihiKXtpZihhLmMuYW0oKS5pc0luQXBwKXJldHVybiExO3ZhciBlPWEubSYmYS5tLmEoKTtpZihhLmMuYnd8fGV8fGEuYy5ieCgpKXJldHVybiBhLmMuYnd8fGV8fGEuYy5ieCgpLCExO2I9YS5hLmNvKGIsWyIkc2YiXSk7aWYoIWIpcmV0dXJuITE7dmFyIGg9Yi5leHQ7Yj1oJiZoLmdlb207dmFyIGU9W1siZXhwIiwiYiIsInQiLCJsIiwiciJdLCJzZWxmIGIgdCBsIHIgaCB3IHhpdiB5aXYiLnNwbGl0KCIgIildLGMsZD0hMTtpZihoJiZiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGIpdHJ5e2lmKChiPWIoKSkmJmIud2luKXtpZihhLmEuZm9yRWFjaChiLndpbixmdW5jdGlvbihhKXtpZihhJiYoIm51bWJlciI9PT10eXBlb2YgYXx8InN0cmluZyI9PT10eXBlb2YgYSkmJjAhPT1wYXJzZUZsb2F0KGEsMTApKXJldHVybiBkPSEwLCExfSksIWQpcmV0dXJuITF9ZWxzZSByZXR1cm4hMTtpZihiLnBhcilyZXR1cm4hMDtmb3IodmFyIGg9MCxsPWUubGVuZ3RoO2g8bDtoKyspe2M9ZVtoXVswXTtmb3IodmFyIGc9MSxmPWVbaF0ubGVuZ3RoO2c8ZjtnKyspaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYltjXVtlW2hdW2ddXSlyZXR1cm4hMX1yZXR1cm4hMH1jYXRjaChwKXt9cmV0dXJuITF9LGUsYyxkLGc7YS5jLmJ5PWZ1bmN0aW9uKCl7aWYoZylyZXR1cm4hMDtlPXdpbmRvdztjPWRvY3VtZW50O2c9YihlKTtkPSEoIWcmJiFlLiRzZik7aWYoIWcmJmEuYy5xKWZvcih2YXIgZj0wOzIwPmYmJiFnO2YrKyl7dmFyIHg9YS5nLmIoYy5ib2R5KTtpZighMSE9PXgmJiF4KWJyZWFrO2M9KGU9YS5hLmJlKHgpKSYmZS5kb2N1bWVudDtnPWd8fGIoZSk7ZD1kfHxnfHxlLiRzZn1yZXR1cm4gZ307YS5jLmJ6PWZ1bmN0aW9uKCl7cmV0dXJuIGEuYy5ieSgpJiZlfTthLmMuY2E9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiBnJiZhLmMuYnkoKTtyZXR1cm4gZH19O2EuYy5jYj0hMTthLmMuY2M9ITE7YS5jLmNkPW51bGw7YS5jLmJ6PWZ1bmN0aW9uKCl7ZigpO3JldHVybiBhLmMuYnooKX07YS5jLmNhPWZ1bmN0aW9uKCl7ZigpO3JldHVybiBhLmMuY2EoKX07YS5jLmJ5PWZ1bmN0aW9uKCl7ZigpO3JldHVybiBhLmMuYnkoKX07dmFyIGc9ZnVuY3Rpb24oKXt2YXIgYj1mdW5jdGlvbihiKXtyZXR1cm4gYS5jLmNlKCk/ITE6YS5hLmNvKGIsWyJjb250ZXh0Iiwib2JzZXJ2ZUludGVyc2VjdGlvbiJdKT8hMDohMX0sZT13aW5kb3csYz1kb2N1bWVudCxkPWIoZSksZz0hKCFkJiYhZS5jb250ZXh0KTtpZighZCYmYS5jLnEpZm9yKHZhciBmPTA7MjA+ZiYmIWQ7ZisrKXtjPWEuZy5iKGMuYm9keSk7aWYoITEhPT1jJiYhYylicmVhaztjPShlPWEuYS5iZShjKSkmJmUuZG9jdW1lbnQ7ZD1kfHxiKGUpO2c9Z3x8ZHx8ZS5jb250ZXh0fWEuYy5jZj1mdW5jdGlvbigpe3JldHVybiBkJiZlfTthLmMuY2c9ZnVuY3Rpb24oYSl7ImJvb2xlYW4iPT09dHlwZW9mIGEmJihkPWEpO3JldHVybiBkfTthLmMuY2g9ZnVuY3Rpb24oKXtyZXR1cm4gZ319O2EuYy5jZj1mdW5jdGlvbigpe2coKTtyZXR1cm4gYS5jLmNmKCl9O2EuYy5jaD1mdW5jdGlvbigpe2coKTtyZXR1cm4gYS5jLmNoKCl9O2EuYy5jZz1mdW5jdGlvbigpe2coKTtyZXR1cm4gYS5jLmNnKCl9O2EuYy5jaT1mdW5jdGlvbigpe3ZhciBiPWEuYS5kaygiY29udGV4dCIpO2lmKGImJmEuYS5jbyhiLFsib2JzZXJ2ZUludGVyc2VjdGlvbiJdKSlyZXR1cm4gYjtiPWEuYS5kaygiQU1QX0NPTlRFWFRfREFUQSIpO2lmKGEuYS5jbyhiLFsiaW5pdGlhbEludGVyc2VjdGlvbiJdKSlyZXR1cm4gYn07dmFyIGM9ZnVuY3Rpb24oKXt2YXIgYixlPWZ1bmN0aW9uKGUpe3JldHVybihiPWEuYS5jbyhlLFsiYW1hem9ubW9iaWxlYWRzdmlld2FibGVicmlkZ2UiXSkpJiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lciYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldFZlcnNpb24/ITA6Yj0hMX0sYz1kb2N1bWVudCxkPXdpbmRvdyxnPWUoZCksZj1iJiYxLjE8PWIuZ2V0VmVyc2lvbigpO2lmKCFnJiZhLmMucSlmb3IodmFyIHg9MDsyMD54JiYhZzt4Kyspe2M9YS5nLmIoYy5ib2R5KTtpZighMSE9PWMmJiFjKWJyZWFrO2M9KGQ9YS5hLmJlKGMpKSYmZC5kb2N1bWVudDtnPWd8fGUoZCk7Zj1mfHxiJiYxLjE8PWIuZ2V0VmVyc2lvbigpfWEuYy5jaj1mdW5jdGlvbigpe3JldHVybiBnJiZkfTthLmMuY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZ307YS5jLmNsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9O2EuYy5jbT1mdW5jdGlvbigpe3JldHVybiBifX07YS5jLmNqPWZ1bmN0aW9uKCl7YygpO3JldHVybiBhLmMuY2ooKX07YS5jLmNrPWZ1bmN0aW9uKCl7YygpO3JldHVybiBhLmMuY2soKX07YS5jLmNsPWZ1bmN0aW9uKCl7YygpO3JldHVybiBhLmMuY2woKX07YS5jLmNtPWZ1bmN0aW9uKCl7YygpO3JldHVybiBhLmMuY20oKX07YS5jLmNuPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYy5jaygpJiZhLmMuY2woKX07YS5jLm89ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7dmFyIGI9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7YT0hMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxiKX1jYXRjaChlKXt9cmV0dXJuIGF9KCk7YS5jLmNvPWZ1bmN0aW9uKCl7dmFyIGI7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYilyZXR1cm4gYjt2YXIgZT1hLmMuZSxjPWEuYS5icSgpO2lmKGEuYy5lLm5hdmlnYXRvci5zdGFuZGFsb25lKWI9ITA7ZWxzZXt2YXIgZD1lLmlubmVyV2lkdGgvYy53LGU9ZS5pbm5lckhlaWdodC9jLmgsZD0haXNOYU4oZCkmJmlzRmluaXRlKGQpJiYuOTw9ZCYmMS4xPj1kLGU9IWlzTmFOKGUpJiZpc0Zpbml0ZShlKSYmLjc1PD1lJiYxLjE+PWU7Yj1kJiZlfWEuYy5lLk1vYXRNQUs/YS5jLmUuTW9hdE1BSy5uYW1lc3BhY2UmJihiPSExKTooZD1hLmMuZSkmJmQuaW1yYWlkJiYiZnVuY3Rpb24iPT09dHlwZW9mIGQuaW1yYWlkLmdldFZlbmRvck5hbWUmJiJpbm1vYmkiPT09ZC5pbXJhaWQuZ2V0VmVuZG9yTmFtZSgpJiYoYj0hMSk7cmV0dXJuIGJ9fSgpO2EuYy5jcD1mdW5jdGlvbigpe3ZhciBiPWEuYy5hbSgpLmlzSW5BcHA/MDp2b2lkIDA7YS5jLmNlKCk/Yj0zOmEuYy5jcSgpJiYoYj0xKTtyZXR1cm4gYn07YS5jLmNxPWZ1bmN0aW9uKCl7dmFyIGI9YS5jLmNvKCksZT1hLmEuYW8oKSxjPWEuYy5ibygpLGQ9d2luZG93LmxvY2F0aW9uJiYoImFwcGxld2ViZGF0YToiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sfHwiZGF0YToiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sKTtpZigiLSI9PT1lfHwiIj09PWUucmVwbGFjZSgvXlxzK3xccyskL2dtLCIiKXx8Y3x8ZClyZXR1cm4hMTtpZihifHxhLmEuYmwoYS5jLmJjKSlyZXR1cm4hMDtiPWEuYS5hcChhLmMuZCk7cmV0dXJuIGEuYy5jcihiKT8hMDohMX07YS5jLmNyPWZ1bmN0aW9uKGIpe3ZhciBlPSExO2lmKGIpe3ZhciBjPVthLmYuYShbNDgsNDgsNDgsNzIsNDgsMjYsMzcsMzgsMjYsNDMsNDUsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsNTAsMjYsMzMsNDAsNDAsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMzEsNDAsNDksMzksMzAsNDgsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbMzgsMjYsMzQsMzcsNzIsNTAsMjYsMzMsNDAsNDAsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjgsMzMsMzAsNDQsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsNDEsMjgsMzMsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjgsNDAsNDAsMzcsMzgsMjYsNDUsMzMsMzIsMjYsMzgsMzAsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMzIsMzcsNDAsMjcsNDAsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjgsMjYsNDMsMzIsNDYsNDMsNDYsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbMzgsMjYsMzQsMzcsNzIsMjYsNDAsMzcsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjgsMzksMzksNzIsMjgsNDAsMzhdKSxhLmYuYShbNTQsNTYsNTksNDQsNDEsNDAsNDMsNDUsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDEsMzAsNDAsNDEsMzcsMzAsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsNDUsMzMsMzAsMjksMzAsMzcsMzQsNDUsMzAsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMzMsNDYsMzcsNDYsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMzMsMzcsMzksNzIsMjcsMzBdKSxhLmYuYShbNDgsNDgsNDgsNzIsNDQsNDEsMjYsNDMsMzYsMzksNDAsNDUsMzAsNDQsNzIsMjgsNDAsMzhdKSxhLmYuYShbMzcsNDAsNDUsNDUsNDAsNzIsNDEsMjgsMzMsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjgsMzksMzAsNDUsNzIsMjgsNDAsMzhdKSxhLmYuYShbNDgsNDgsNDgsNzIsMjYsMzcsMzcsNDMsMzAsMjgsMzQsNDEsMzAsNDQsNzIsMjgsNDAsMzhdKV07YS5hLmZvckVhY2goYyxmdW5jdGlvbihhKXtpZigwPT1iLmluZGV4T2YoYSl8fDA9PWIuaW5kZXhPZigiaHR0cHM6Ly8iK2EpKXJldHVybiBlPSEwLCExfSl9cmV0dXJuIGV9O2EuYy5jZT1mdW5jdGlvbigpe3ZhciBiO3JldHVybiBmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGIpcmV0dXJuIGI7dmFyIGU9YS5hLnEoKXx8YS5hLm8oKTtyZXR1cm4gYj1hLmMuY3MoKXx8ZSYmYS5jLmJnKCl8fGEuYy5iaSgpPyEwOmEuYy5jcSgpPyExOmV9fSgpO2EuYy5jdD1mdW5jdGlvbigpe3JldHVybiBhLmMuZS53ZWJraXQmJmEuYy5lLndlYmtpdC5tZXNzYWdlSGFuZGxlcnMmJmEuYy5lLndlYmtpdC5tZXNzYWdlSGFuZGxlcnMuX196X21vYXRfYnJpZGdlX199O2EuYy5jcz1mdW5jdGlvbigpe3JldHVybiExfTthLmMuY3U9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmN2PWZ1bmN0aW9uKGIpe3JldHVybiBhLm4mJmEubi5hKGIpfTthLmMuY3c9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmN4PWZ1bmN0aW9uKCl7cmV0dXJuITF9O2EuYy5jeT1mdW5jdGlvbigpe3JldHVybiExfTthLmMuY3o9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmRhPWZ1bmN0aW9uKCl7aWYoYS5jLmN5KCl8fGEuYy5jeigpKXJldHVybiEwO3ZhciBiPSExO3JldHVybiBhLmMuY3x8YS5jLmNjP2I9Ynx8YS5jLmNjfHxhLmMuY3EoKXx8YS5jLmJyKCl8fGEuYy5jbigpOmJ9O2EuYy5wcm90b2NvbD1hLmEuY2UoKTthLmMuZGI9YS5hLmwoKTthLmMuZGM9IWEuYy5jO2EuYy5kZD1mdW5jdGlvbihiKXt2YXIgZT0wO2I9Ynx8d2luZG93O3RyeXtpZighYS5jLmMpe3ZhciBjO2ZvcihjPTA7MjA+YyYmYiE9d2luZG93LnRvcDtjKyspYj1iLnBhcmVudDtlPWN9fWNhdGNoKGQpe31yZXR1cm4gZX07YS5jLmN8fGEuYS5hYigpfHwxPT1hLmMuZGQoYS5nLmEoKSk/YS5jLmRlPTE6YS5jLmRlPTA7YS5jLmVbYS5jLmF5XXx8KGEuYy5lW2EuYy5heV09bmV3IGEuYy5lLk9iamVjdCk7YS5jLmFtKCkuaXNJbkFwcCYmYS5jLmMmJihhLmMuYz1hLmMuZGEoKXx8YS5jLmNlKCkpO2EuYy5kZj1mdW5jdGlvbigpe3JldHVybiExfTthLmMuZGc9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmQ9YS5jLmUuZG9jdW1lbnQucmVmZXJyZXJ8fCIiO3RyeXthLmMuZGg9YS5jLmUuaGlzdG9yeSYmYS5jLmUuaGlzdG9yeS5sZW5ndGh9Y2F0Y2goaCl7fWEuYy5kaT1mdW5jdGlvbigpe2lmKEIpZm9yKHZhciBhIGluIEIpaWYoQi5oYXNPd25Qcm9wZXJ0eShhKSlyZXR1cm4hMDtyZXR1cm4hMX07YS5jLmRqPWZ1bmN0aW9uKGIpe3ZhciBlPSEwO2EuYS5mb3JFYWNoKGImJmIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLmNoaWxkTm9kZXMsZnVuY3Rpb24oYil7aWYoYS5hLmF4KFsiRElWIiwiSUZSQU1FIiwiQSIsIkVNQkVEIiwiT0JKRUNUIl0sYi5ub2RlTmFtZSkpcmV0dXJuIGU9ITF9KTtyZXR1cm4gZX07YS5jLmRrPWZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIEIpaWYoQi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGI9QlthXTtpZihiJiZiLmFhJiZiLmFhW0RdKXJldHVybiEwfXJldHVybiExfTthLmMuZGw9ZnVuY3Rpb24oKXtyZXR1cm4gYS5jLmFtKCkuaXNJbkFwcD9hLmMuY3EoKT9hLmMuYzphLmMuZGEoKTphLmMuY307YS5jLmJ4PWZ1bmN0aW9uKCl7cmV0dXJuIGEuYy5kbSYmYS5jLmRtKCl9O2EuYy5kbj1mdW5jdGlvbigpe3JldHVybiBhLmMuY2J9O2EuY1siZG8iXT1mdW5jdGlvbigpe3JldHVybiBhLmMuYnkmJmEuYy5ieSgpfTthLmMuZHA9ZnVuY3Rpb24oKXtyZXR1cm4gYS5jLmNnJiZhLmMuY2coKX07YS5jLmRxPWZ1bmN0aW9uKCl7cmV0dXJuIGEubSYmYS5tLmEoKX07YS5jLmRyPWZ1bmN0aW9uKGIpe3ZhciBlPSExO2EubyYmYS5vLmEmJihiJiZiLnBlcmlzY29wZU1hbmFnZXI/Yi5wZXJpc2NvcGVNYW5hZ2VyLm1lYXN1cmFibGUmJihlPSEwKTplPSEwKTtyZXR1cm4gZX07YS5jLmRzPWZ1bmN0aW9uKGIpe3JldHVybiBhLmMuZHEoKXx8YS5jLmRyKGIpfTthLmMuZHQ9ZnVuY3Rpb24oYixlKXtyZXR1cm4hYnx8YiYmYi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpfHxhLmQuYygpJiYhZT8hMTphLmMuZGwoKXx8YS5jLmR1KCl8fHZvaWQgMH07YS5jLmR2PWZ1bmN0aW9uKGIpe2lmKCFifHxiJiZiLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCl8fGEuZC5jKCkpcmV0dXJuITE7dmFyIGU9ITE7YS5tJiZhLm0uYSgpP2U9ITA6YS5vJiZhLm8uYSYmYi5wZXJpc2NvcGVNYW5hZ2VyJiZiLnBlcmlzY29wZU1hbmFnZXIuZnVsbHlNZWFzdXJhYmxlJiZiLmFvJiYxIT1iLmFvLnNraW4mJihlPSEwKTtyZXR1cm4gYS5jLmRsKCl8fGEuYy5kdSgpfHxlfTthLmMuZHc9ZnVuY3Rpb24oKXthLmMuYms9ITE7YS5jLmJsPSEwO2EuYy5ibT0hMH07YS5jLmR4PSEwO2EuYy5keT0hMDsibWxiLmNvbSI9PT1hLmEuYW8oKSYmKGEuYS5iaigpfHxhLmEuYmsoKSkmJihhLmMuZHk9ITEpO2EuYy5kej1mdW5jdGlvbigpe3JldHVybiExfTthLmMuZWE9ZnVuY3Rpb24oKXthLmMuY2UoKTtyZXR1cm4hMX07YS5jLmViPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2EuYy5lYz1mdW5jdGlvbigpe3JldHVybiExfTthLmMuZWQ9ZnVuY3Rpb24oKXt2YXIgYj1hLmMuYmM7cmV0dXJuKGI9YiYmYi5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pKT9wYXJzZUludChiWzFdLDEwKTohMX07YS5jLmJ3PSExO2EuYy5lZT0hMTthLmMuYT1uZXcgYS5jLmUuSW1hZ2U7YS5jLms9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBhLmMuZVsiTW9hdCNFVkEiXSlyZXR1cm4hMDt0cnl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYS5jLmUuZXZhbCYmKGEuYy5lLmV2YWwoIihmdW5jdGlvbih3aW4peyB3aW5bJ01vYXQjRVZBJ10gPSB0cnVlOyB9KSh3aW5kb3cpIiksInVuZGVmaW5lZCIhPT10eXBlb2YgYS5jLmVbIk1vYXQjRVZBIl0pKXJldHVybiEwfWNhdGNoKGIpe31yZXR1cm4hMX07YS5jLmw9ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBuZXcgYS5GdW5jdGlvbigiIiksITB9Y2F0Y2goYil7cmV0dXJuITF9fTthLmMuZWY9ZnVuY3Rpb24oKXt2YXIgYT1uYXZpZ2F0b3ImJm5hdmlnYXRvci5hcHBWZXJzaW9uJiZuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvV2luZG93cyBOVCAoXGRcZHswLDF9XC5cZCkvKTtyZXR1cm4gYT9wYXJzZUZsb2F0KGFbMV0pOi0xfTthLmMuZWc9ZnVuY3Rpb24oKXtyZXR1cm4gNi4xPT09YS5jLmVmKCl9O2EuYy5laD1mdW5jdGlvbigpe3ZhciBiPWEuYy5lO3JldHVybiBiLm5hdmlnYXRvciYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLm5hdmlnYXRvci5nZXRCYXR0ZXJ5fTthLmMuZHU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5jLmVpPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2EuYy5laj1hLmEuYnIoKTthLmMuZWs9ZnVuY3Rpb24oYil7cmV0dXJuIGI9KGI9YS5jLmVqKXx8YS5hLmJzKCl9O3ZhciBiPXthOiJhIixiOiJiIixjOiJjIixkOiJkIixlOiJlIixmOiJmIn0sZT17YToid2FpdGluZyIsYjoibm9IaXN0RGF0YSIsYzoiZGF0YUF2YWlsYWJsZSIsZDoic2xvdFdhaXRpbmciLGU6InNsb3ROb0hpc3REYXRhIixmOiJzbG90Tm9TbG90RGF0YSJ9O2EuYy5lbD1mdW5jdGlvbigpe3ZhciBjPXt9O2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYSxiKXtjW2FdPWVbYl19KTthLmEuZm9yRWFjaChlLGZ1bmN0aW9uKGEsYil7Y1thXT1hfSk7cmV0dXJuIGN9KCk7YS5jLmVtPWV9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhhLGYsZyl7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIuY2FsbChudWxsLGFbY10sYyl9ZnVuY3Rpb24gYihhKXt2YXIgYj1bXTtjKGEsZnVuY3Rpb24oYSxlKXtiLnB1c2goZSl9KTtyZXR1cm4gYn1hPWZbYV07YSYmYS54YS5zb2RlfHwoYS54YS5zb2RlPWZ1bmN0aW9uKCl7dGhpcy5kZXN3PXt9O3RoaXMueGZnZj1bXTt0aGlzLnB1Ymxpc2hpbmdfPSExO3RoaXMueGtjZD17fTt0aGlzLmVkd3M9W119LGEueGEuc29kZS5wcm90b3R5cGUudXhpbj1mdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGEpe2E9Zy5tYXgoNCxhKTtyZXR1cm4oKDErZy5yYW5kb20oKSkqZy5wb3coMTYsYSl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLGEpfTtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGEoNCkrIi0iK2EoNCkrIi0iK2EoNCkrIi0iK2EoNCl9fSgpLGEueGEuc29kZS5wcm90b3R5cGUueHN6YT1mdW5jdGlvbihhKXt0aGlzLmRlc3dbYV18fCh0aGlzLmRlc3dbYV09e30pO3JldHVybiB0aGlzLmRlc3dbYV19LGEueGEuc29kZS5wcm90b3R5cGUuZXNnZj1mdW5jdGlvbihhLGIpe3RoaXMucHVibGlzaGluZ18/dGhpcy54ZmdmLnB1c2goYXJndW1lbnRzKTp0aGlzLnpheHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLnhhLnNvZGUucHJvdG90eXBlLmtzd2E9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy54a2NkW2FdfHxbXSxkPWMmJmMubGVuZ3RoLGc9MDtnPGQ7ZysrKWlmKGNbZ109PT1iKXJldHVybiExO2MucHVzaChiKTtjLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1ifSk7dGhpcy54a2NkW2FdPWN9LGEueGEuc29kZS5wcm90b3R5cGUuYWtzdz1mdW5jdGlvbihhLGIpe2lmKCF0aGlzLnhrY2RbYV0pcmV0dXJuITE7Zm9yKHZhciBjPXRoaXMueGtjZFthXSxkPS0xLGc9YyYmYy5sZW5ndGgsZj0wO2Y8ZztmKyspaWYoY1tmXT09PWIpe2Q9ZjticmVha30tMSE9ZCYmYy5zcGxpY2UoZCwxKTt0aGlzLnhrY2RbYV09Y30sYS54YS5zb2RlLnByb3RvdHlwZS5fZ2V0RXZlbnRQcmlvcml0aWVzXz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54a2NkW2FdfHxbXX0sYS54YS5zb2RlLnByb3RvdHlwZS5henN4PWZ1bmN0aW9uKGEsYixjKXtjPWN8fHt9O3ZhciBkPWMuaWR8fHRoaXMudXhpbigpLGc7Zz1jLnByaW9yaXR5O2c9IWlzTmFOKGcpJiZpc0Zpbml0ZShnKT9wYXJzZUludChnLDEwKToxMDtmb3IodmFyIGY9dGhpcy54c3phKGEpLGs9MDtmW2RdJiYhYy5pZCYmMTA+azspaysrLGQ9dGhpcy51eGluKCk7ZltnXXx8KGZbZ109e30pO3RoaXMua3N3YShhLGcpO2MucHJpb3JpdHk9ZztmW2ddW2RdPXtjYjpiLG9wdGlvbnM6Y307cmV0dXJuIGR9LGEueGEuc29kZS5wcm90b3R5cGUuemF4cz1mdW5jdGlvbihhLGIpe2lmKCF0aGlzLmRlc3dbYV0pcmV0dXJuITE7dGhpcy5wdWJsaXNoaW5nXz0hMDtmb3IodmFyIGM9dGhpcy5lZHdzLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGQ9dGhpcy5fZ2V0RXZlbnRQcmlvcml0aWVzXyhhKS5zbGljZSgwKSxnPTAsZj1kLmxlbmd0aDtnPGY7ZysrKXt2YXIgaz10aGlzLmRlc3dbYV1bZFtnXV0seDtmb3IoeCBpbiBrKWlmKGsuaGFzT3duUHJvcGVydHkoeCkpe3ZhciBuPWtbeF07aWYobil7dmFyIG07bT1uLm9wdGlvbnMmJm4ub3B0aW9ucy5pbmNsdWRlSWQ/W3hdLmNvbmNhdChjKTpjO2lmKCFuLm9wdGlvbnN8fCFuLm9wdGlvbnMuY29uZGl0aW9ufHxuLm9wdGlvbnMuY29uZGl0aW9uJiZuLm9wdGlvbnMuY29uZGl0aW9uLmFwcGx5KG51bGwsbSkpbi5vcHRpb25zJiZuLm9wdGlvbnMub25jZSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygbi5vcHRpb25zLnByaW9yaXR5JiZ0aGlzLnN4YXooYSx7aWQ6eCxwcmlvcml0eTpuLm9wdGlvbnMucHJpb3JpdHl9KSxuLmNiLmFwcGx5KG51bGwsbSl9fX10aGlzLnB1Ymxpc2hpbmdfPSExO2ZvcihjPTA7MDx0aGlzLnhmZ2YubGVuZ3RoJiY1MDA+YztjKyspdGhpcy56YXhzLmFwcGx5KHRoaXMsdGhpcy54ZmdmLnBvcCgpKX0sYS54YS5zb2RlLnByb3RvdHlwZS5zd2FxPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZz0hMTtpZih0aGlzLmRlc3dbYV0mJnRoaXMuZGVzd1thXVtkXSl0cnl7ZGVsZXRlIHRoaXMuZGVzd1thXVtkXVtjXSxnPSEwfWNhdGNoKGYpe30wPT09Yih0aGlzLmRlc3dbYV1bZF0pLmxlbmd0aCYmdGhpcy5ha3N3KGEsZCk7cmV0dXJuIGd9LGEueGEuc29kZS5wcm90b3R5cGUuc3hhej1mdW5jdGlvbihhLGIpe2lmKCFifHwib2JqZWN0IiE9dHlwZW9mIGJ8fCF0aGlzLmRlc3dbYV0pcmV0dXJuITE7aWYoYi5pZCYmdm9pZCAwIT09Yi5wcmlvcml0eSlyZXR1cm4gdGhpcy5zd2FxKGEsYi5pZCxiLnByaW9yaXR5KTtpZihiLmlkfHxiLmNhbGxiYWNrKWZvcih2YXIgYz10aGlzLl9nZXRFdmVudFByaW9yaXRpZXNfKGEpLGQ9MCxnPWMubGVuZ3RoO2Q8ZztkKyspe3ZhciBmPWNbZF07aWYoYi5pZCYmYi5jYWxsYmFjayl7aWYodGhpcy5kZXN3W2FdW2ZdW2IuaWRdJiZ0aGlzLmRlc3dbYV1bZl1bYi5pZF0uY2I9PWIuY2FsbGJhY2spcmV0dXJuIHRoaXMuc3dhcShhLGIuaWQsZil9ZWxzZSBpZihiLmlkKXtpZih0aGlzLmRlc3dbYV1bZl1bYi5pZF0pcmV0dXJuIHRoaXMuc3dhcShhLGIuaWQsZil9ZWxzZSBmb3IodmFyIGsgaW4gdGhpcy5kZXN3W2FdW2ZdKWlmKHRoaXMuZGVzd1thXVtmXVtrXSYmdGhpcy5kZXN3W2FdW2ZdW2tdLmNiPT1iLmNhbGxiYWNrKXJldHVybiB0aGlzLnN3YXEoYSxrLGYpfXJldHVybiExfSxhLnhhLnNvZGUucHJvdG90eXBlLnVnaW49ZnVuY3Rpb24oYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYSlpZih0aGlzLmRlc3dbYV0pZGVsZXRlIHRoaXMuZGVzd1thXTtlbHNlIHJldHVybiExO2Vsc2UgdGhpcy5kZXN3PXt9O3JldHVybiEwfSl9YS5rPXt9O2Euay5iPWZ1bmN0aW9uKGQpe2QueGEuc29kZXx8KGQueGI9PXdpbmRvdz9rKGEuYy5hdyx3aW5kb3csdyk6YS5hLmRqKGssIiciK2EuYy5hdysiJyx3aW5kb3csIE1hdGgiLGQueGIpKTthLmsuYT1uZXcgZC54YS5zb2RlfX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGEsZil7ZnVuY3Rpb24gZyhhKXt2YXIgYj1lLnhiLk1hdGgucG93LGM9ZS54Yi5NYXRoLnJhbmRvbTthPSgwLGUueGIuTWF0aC5tYXgpKDQsYSk7cmV0dXJuKCgxK2MoKSkqYigxNixhKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDAsYSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGEoYil9fWZ1bmN0aW9uIGIoYSxiKXtpZighYXx8InN0cmluZyIhPT10eXBlb2YgYnx8IWFbYl18fGE9PXdpbmRvdylyZXR1cm4hMTtpZigic3RyaW5nIj09PXR5cGVvZiBhLm5vZGVOYW1lJiYoIk9CSkVDVCI9PT1hLm5vZGVOYW1lfHwiRU1CRUQiPT09YS5ub2RlTmFtZSkpe3ZhciBlPWRvY3VtZW50JiZkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5W2JdO2lmKGUmJmUhPT1hW2JdKXJldHVybiBlfXJldHVybiExfWZbYV09ZlthXXx8e3pzOiExLHpyOjAseWY6e30saDowLG06MCxpOnt9LHhhOnt9LHhiOmYseGM6e30seHlkczp7fX07dmFyIGU9ZlthXSxoPXt9LGw9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7dmFyIGI9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7YT0hMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxiKX1jYXRjaChlKXt9cmV0dXJuIGF9KCk7ZS54Yy5kb3dnPWZ1bmN0aW9uKGEsYil7ZSYmKGUueHlkc3x8KGUueHlkcz17fSksZSYmZS54eWRzJiYoZS54eWRzW2JdP2UueHlkc1tiXS5wdXNoKGEpOmUueHlkc1tiXT1bYV0pKX07ZS54Yy5oc3hrPWZ1bmN0aW9uKCl7ZS5kY3N4JiZlLmRjc3guZGN3bigpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGEmJmEmJmUueGMuZXNkZShhKTt2YXIgYTtlLnhjLmV4ZGUoZS54Yy5oc3hrLDFlMyl9O2UueGMuZXNkZT1mdW5jdGlvbihhKXt3aW5kb3cmJndpbmRvdy5jbGVhclRpbWVvdXQmJndpbmRvdy5jbGVhclRpbWVvdXQoYSl9O2UueGMueW5kcz1mdW5jdGlvbihhLGUsZCxnKXt2YXIgZixuLG09ITE7InRvdWNoc3RhcnQiPT09ZSYmbCYmKG09e3Bhc3NpdmU6ITB9KTtnP2hbZStnXT9kPWhbZStnXTooZD1jKGQpLGhbZStnXT1kKTpkPWMoZCk7aWYoYS5hZGRFdmVudExpc3RlbmVyKWc9ImFkZEV2ZW50TGlzdGVuZXIiLGY9IiI7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWc9ImF0dGFjaEV2ZW50IixmPSJvbiI7ZWxzZSByZXR1cm4hMTtpZihuPWIoYSxnKSl0cnl7bi5jYWxsKGEsZitlLGQsbSl9Y2F0Y2goSSl7YVtnXShmK2UsZCxtKX1lbHNlIGlmKGEmJmcmJmFbZ10pdHJ5e2FbZ10oZitlLGQsbSl9Y2F0Y2goSSl7cmV0dXJuITF9fTtlLnhjLmVuZ249ZnVuY3Rpb24oYSxlLGMsZCl7dmFyIGcsZj1lK2QsbDtpZighYSlyZXR1cm4gZGVsZXRlIGhbZl0sITE7Yz0hMSE9PWQ/aFtmXTpjO2lmKGEucmVtb3ZlRXZlbnRMaXN0ZW5lcilkPSJyZW1vdmVFdmVudExpc3RlbmVyIixnPSIiO2Vsc2UgaWYoYS5kZXRhY2hFdmVudClkPSJkZXRhY2hFdmVudCIsZz0ib24iO2Vsc2UgcmV0dXJuIGRlbGV0ZSBoW2ZdLCExO2lmKGw9YihhLGQpKXRyeXtsLmNhbGwoYSxnK2UsYywhMSl9Y2F0Y2goSSl7YVtkXShnK2UsYywhMSl9ZWxzZSB0cnl7YVtkXShnK2UsYywhMSl9Y2F0Y2goSSl7fWRlbGV0ZSBoW2ZdfTtlLnhjLmV4ZGU9ZnVuY3Rpb24oYSxiKXthPWMoYSk7dmFyIGU7d2luZG93JiZ3aW5kb3cuc2V0VGltZW91dCYmKGU9d2luZG93LnNldFRpbWVvdXQoYSxiKSk7cmV0dXJuIGV9O2UueGMuZXhhZT1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5hcHBseShlfHxudWxsLGEuY29uY2F0KGEuc2xpY2UuY2FsbChhcmd1bWVudHMpKSl9fTtlLnhjLnV4aW49ZnVuY3Rpb24oKXtyZXR1cm4gZyg0KSsiLSIrZyg0KSsiLSIrZyg0KSsiLSIrZyg0KX07ZS54Yy50d2VyPWZ1bmN0aW9uKGEsYil7ZSYmKGUueWZ8fChlLnlmPXt9KSxlJiZlLnlmJiYoZS55ZltiXT9lLnlmW2JdLnB1c2goYSk6ZS55ZltiXT1bYV0pKX19YS5wPXt9O2EucC5hPWZ1bmN0aW9uKGQpe3ZhciBmPWEucC5iKGQpLGc9ITE7Znx8KGY9YS5wLmMoZCksZz0hMCxmLnhjLmV4ZGUoZi54Yy5oc3hrLDFlMykpO3dpbmRvd1thLmMuYXddPWY7YS5rLmIoZik7ZyYmKGYuc3dkZT1uZXcgZi54YS5zb2RlKTthLmsuYS5henN4KCJhZEtpbGxlZCIsYS5wLmQpO3JldHVybiBmfTthLnAuZT1mdW5jdGlvbigpe2EuYy5pPW51bGw7YS5wLmYoYS5jLmF4LmEsYS5jLmF6KTthLmsuYS5zeGF6KCJhZEtpbGxlZCIse2NhbGxiYWNrOmEucC5kfSk7YS5wLmcocil9O2EucC5kPWZ1bmN0aW9uKGQpe2lmKHIpe3RyeXt2YXIgZj1yLnlmW2EuYy5heC5hXTtpZihmKXt2YXIgZz1hLmEuaW5kZXhPZihmLGQueWcpOy0xPGcmJmYuc3BsaWNlKGcsMSl9fWNhdGNoKGMpe31hLnAuZyhyKX19O2EucC5oPWZ1bmN0aW9uKGQsZil7dmFyIGc9YS5wLmIoYS5jLmUpO2cmJmcueGMudHdlcihkLGYpfTthLnAuaT1mdW5jdGlvbihkLGYpe3ZhciBnPWEucC5iKGEuYy5lKTtnJiZnLnhjLmRvd2coZixkKX07YS5wLmY9ZnVuY3Rpb24oZCxmKXt2YXIgZz1yLnh5ZHNbZF07aWYoZyl7dmFyIGM9YS5hLmluZGV4T2YoZyxmKTstMTxjJiZnLnNwbGljZShjLDEpfX07YS5wLmc9ZnVuY3Rpb24oYSl7fTthLnAuYz1mdW5jdGlvbihkKXtkPT13aW5kb3c/ayhhLmMuYXcsd2luZG93KTphLmEuZGooaywiJyIrYS5jLmF3KyInLHdpbmRvdyIsZCk7cmV0dXJuIGEucC5iKGQpfTthLnAuYj1mdW5jdGlvbihkKXt0cnl7cmV0dXJuIGQ9ZHx8YS5jLmUsZFthLmMuYXddfWNhdGNoKGYpe3JldHVybiBudWxsfX07YS5wLmo9ZnVuY3Rpb24oZCl7dHJ5e3ZhciBmPVtdO2Q9ZHx8YS5jLmU7aWYoIWQpcmV0dXJuITE7dmFyIGc9YS5jLmF0O2lmKCFnKXJldHVybiExO3ZhciBjPW5ldyBSZWdFeHAoIl4iK2cpO2lmKCFjKXJldHVybiExO2EuYS5mb3JFYWNoKGQsZnVuY3Rpb24oYSxlKXstMTxlLnNlYXJjaChjKSYmYSYmIm51bWJlciI9PT10eXBlb2YgYS56ciYmZi5wdXNoKGEpfSk7cmV0dXJuIGZ9Y2F0Y2goYil7cmV0dXJuITF9fTthLnAuaz1mdW5jdGlvbihkKXt0cnl7dmFyIGY9W107ZD1kfHxhLmMuZTtyZXR1cm4gZD8oZj1hLnAuaihkKSk/MDxmLmxlbmd0aD8hMDohMTohMTohMX1jYXRjaChnKXtyZXR1cm4hMX19O2EucC5sPWZ1bmN0aW9uKGQpe3ZhciBmPWEucC5iKCk7ZiYmKGYuaVtkXT0hMCl9fSkodSk7dmFyIHI9dS5wLmEodS5jLmUpLGthPXUuYy5jLFU9dS5hLmwoKSxSPXUuYy5iaix3YT11LmMuZTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhhLGYsZyl7dmFyIGM9ZlthXTtjJiZjLnhhLnR4YWV8fChjLnhhLnR4YWU9ZnVuY3Rpb24oYSxlKXt0aGlzLnN4ZGM9Yy54Yy51eGluKCk7dGhpcy5jZHhzPWE7dGhpcy54c2NkPXt9O3RoaXMuc3dkZT1lfSxjLnhhLnR4YWUucHJvdG90eXBlLndzZWQ9ZnVuY3Rpb24oYSxlLGQsZyxmKXt0aGlzLnhzY2RbZ118fCh0aGlzLnhzY2RbZ109e30pO3RoaXMueHNjZFtnXS5ldnQ9ZTt0aGlzLnhzY2RbZ10udGFyZ2V0PWE7dGhpcy54c2NkW2ddLnBlcmlvZGljPSEwO3ZhciB0O3Q9Yy54Yy5leGFlKFt0aGlzXSxmdW5jdGlvbihrLHkpe2MueGMuZW5nbihhLGUsbnVsbCxnKTtpZihrLnhzY2RbZ10pe2sueHNjZFtnXS50aWQmJmMueGMuZXNkZShrLnhzY2RbZ10udGlkKTtrLnhzY2RbZ10udGlkPWMueGMuZXhkZShmdW5jdGlvbigpe2sueHNjZFtnXS50aWQ9bnVsbDtjLnhjLnluZHMoYSxlLHQsZyl9LGYpO3RyeXtrLnN3ZGUuemF4cyhkLHkpfWNhdGNoKHgpe319fSk7Yy54Yy55bmRzKGEsZSx0LGcpfSxjLnhhLnR4YWUucHJvdG90eXBlLndzcWE9ZnVuY3Rpb24oYSl7dGhpcy54c2NkW2FdJiYoYy54Yy5lc2RlKHRoaXMueHNjZFthXS50aWQpLGMueGMuZW5nbih0aGlzLnhzY2RbYV0udGFyZ2V0LHRoaXMueHNjZFthXS5ldnQsbnVsbCxhKSxkZWxldGUgdGhpcy54c2NkW2FdKX0sYy54YS50eGFlLnByb3RvdHlwZS5xYXdzPWZ1bmN0aW9uKCl7dGhpcy53c2VkKHRoaXMuY2R4cywic2Nyb2xsIiwic2Nyb2xsIiwiZ2xvYmFsU2Nyb2xsZXZlbnQiK3RoaXMuc3hkYywxZTMpO3ZhciBhPXRoaXMuY2R4cy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dGhpcy53c2VkKGEsIm1vdXNlZG93biIsIm1vdXNlRXZlbnQiLCJnbG9iYWxNb3VzZURvd24iK3RoaXMuc3hkYywxZTMpO3RoaXMud3NlZChhLCJtb3VzZW92ZXIiLCJtb3VzZUV2ZW50IiwiZ2xvYmFsTW91c2VPdmVyIit0aGlzLnN4ZGMsMWUzKTt0aGlzLndzZWQoYSwibW91c2Vtb3ZlIiwibW91c2VFdmVudCIsImdsb2JhbE1vdXNlTW92ZSIrdGhpcy5zeGRjLDVlMyk7dGhpcy53c2VkKHRoaXMuY2R4cywibW91c2V3aGVlbCIsIm1vdXNlRXZlbnQiLCJnbG9iYWxNb3VzZVdoZWVsIit0aGlzLnN4ZGMsNWUzKTt0aGlzLndzZWQodGhpcy5jZHhzLCJET01Nb3VzZVNjcm9sbCIsIm1vdXNlRXZlbnQiLCJnbG9iYWxNb3VzZVNjcm9sbCIrdGhpcy5zeGRjLDVlMyk7dGhpcy53c2VkKGEsInRvdWNoc3RhcnQiLCJtb3VzZUV2ZW50IiwiZ2xvYmFsVG91Y2hTdGFydEV2ZW50Iit0aGlzLnN4ZGMsMWUzKTt0aGlzLndzZWQoYSwia2V5ZG93biIsImtleWJvYXJkRXZlbnQiLCJnbG9iYWxLZXlib2FyZEV2ZW50Iit0aGlzLnN4ZGMsMWUzKX0sYy54YS50eGFlLnByb3RvdHlwZS5hcXN3PWZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMueHNjZCl0aGlzLmVuZ24oe2xpc3RlbmVyTmFtZTphfSl9LGMueGEudHhhZS5wcm90b3R5cGUueW5kcz1mdW5jdGlvbihhLGUsZCxnKXtpZighdGhpcy54c2NkW2ddKXt0aGlzLnhzY2RbZ109e307dGhpcy54c2NkW2ddLmV2dD1lO3RoaXMueHNjZFtnXS50YXJnZXQ9YTt0aGlzLnhzY2RbZ10ucHVibGlzaEV2dD1kO3ZhciBmO2Y9Yy54Yy5leGFlKFt0aGlzXSxmdW5jdGlvbihhLGIpe2EueHNjZFtnXSYmYS5zd2RlLnpheHMoZCxiKX0pO2MueGMueW5kcyhhLGUsZixnKX19LGMueGEudHhhZS5wcm90b3R5cGUuZW5nbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEsYil7YS54c2NkW2JdLnBlcmlvZGljP2Eud3NxYShiKTooYy54Yy5lbmduKGEueHNjZFtiXS50YXJnZXQsYS54c2NkW2JdLmV2dCxudWxsLGIpLGRlbGV0ZSBhLnhzY2RbYl0pfXZhciBkPWEudGFyZ2V0JiZhLmV2dCxnPWEudGFyZ2V0JiYhYS5ldnQsZj1hLmFsbDtpZihhLmxpc3RlbmVyTmFtZSl0aGlzLnhzY2RbYS5saXN0ZW5lck5hbWVdJiZlKHRoaXMsYS5saXN0ZW5lck5hbWUpO2Vsc2UgaWYoZClmb3IodmFyIHQgaW4gdGhpcy54c2NkKShkPXRoaXMueHNjZFt0XSkmJmQuZXZ0PT1hLmV2dCYmZC50YXJnZXQ9PWEudGFyZ2V0JiZlKHRoaXMsdCk7ZWxzZSBpZihnKWZvcih0IGluIHRoaXMueHNjZCkoZD10aGlzLnhzY2RbdF0pJiZkLnRhcmdldD09YS50YXJnZXQmJmUodGhpcyx0KTtlbHNlIGlmKGYpZm9yKHQgaW4gdGhpcy54c2NkKShkPXRoaXMueHNjZFt0XSkmJmUodGhpcyx0KX0sYy54YS50eGFlLnByb3RvdHlwZS5rZG13PWZ1bmN0aW9uKGEpe2Muc3dkZS5lc2dmKGEucHVibGlzaEV2dCl9LGMueGEudHhhZS5wcm90b3R5cGUuZGN3bj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueHNjZCxlO2ZvcihlIGluIGEpe3ZhciBjPWFbZV07InVubG9hZCI9PT1jLmV2dCYmYy50YXJnZXQmJmMudGFyZ2V0LmNsb3NlZCYmdGhpcy5rZG13KGMpfX0pfWEucT17fTthLnEuYT1mdW5jdGlvbihkKXtkJiYoZC54YS50eGFlfHwoZC54Yj09d2luZG93P2soYS5jLmF3LHdpbmRvdyx3KTphLmEuZGooaywiJyIrYS5jLmF3KyInLHdpbmRvdywgTWF0aCIsZC54YikpLGQuenN8fChkLmRjc3g9bmV3IGQueGEudHhhZShhLmMuZSxkLnN3ZGUpLGQuenM9ITApKX07YS5rLmEuYXpzeCgibW9kdWxlc1JlYWR5IixhLnEuYSx7b25jZTohMH0pO2Euay5hLmF6c3goInN0YXJ0QWRUcmFja2luZyIsZnVuY3Rpb24oZCl7ciYmci56cyYmIXIueHomJihyLmRjc3g/KHIueHo9ITAsci5kY3N4LnFhd3MoKSk6YS5xLmEociksYS5mb2N1cy5zZXRGb2N1c0xpc3RlbmVycygpKX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYSxiLGUpe2EuSVI1Lk1JTltlXT13Lm1pbihiLGEuSVI1Lk1JTltlXSl8fGJ8fDE7YS5JUjUuTUFYW2VdPXcubWF4KGIsYS5JUjUuTUFYW2VdKXx8Yn1mdW5jdGlvbiBkKGIpe2lmKHEpcmV0dXJuITA7dmFyIGU9ci5zd2RlLmF6c3goImZvY3VzU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciBjPXt0eXBlOiJibHVyIn07ZXx8KGEuci5nKGMsYiksYS5yLmgoYyxiKSl9KTthLmsuYS5henN4KCJhZEtpbGxlZCIsZnVuY3Rpb24oKXtyLnN3ZGUuc3hheigiZm9jdXNTdGF0ZUNoYW5nZSIse2lkOmV9KX0se29uY2U6ITAsY29uZGl0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBiLnpyPT1hLnpyfX0pO3E9ITB9ZnVuY3Rpb24gZihhLGIpe2IuYmU9dy5tYXgoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5iZT9iLmJlOjAsYS1iLmJmKTsidW5kZWZpbmVkIj09PXR5cGVvZiBiLmJ5JiY1MDA8PWIuYmUmJihiLmJ5PWIuYmspfWZ1bmN0aW9uIGcoYil7Yi5hej09PWEuci5hLmQuYT9iLmF6PWEuci5hLmQuYjpiLmF6PT09YS5yLmEuZC5iJiYoYi5hej1hLnIuYS5kLmEpfWZ1bmN0aW9uIGMoYil7Yi5iYT09PWEuci5hLmQuYT9iLmJhPWEuci5hLmQuYjpiLmJhPT09YS5yLmEuZC5iJiYoYi5iYT1hLnIuYS5kLmEpfWZ1bmN0aW9uIGIoYil7Yi5heD09PWEuci5hLmIuYT9iLmF4PWEuci5hLmIuYjpiLmF4PT09YS5yLmEuYi5iJiYoYi5heD1hLnIuYS5iLmEpfWZ1bmN0aW9uIGUoYil7Yi5heT09PWEuci5hLmMuYT9iLmF5PWEuci5hLmMuYjpiLmF5PT09YS5yLmEuYy5iJiYoYi5heT1hLnIuYS5jLmEpfWZ1bmN0aW9uIGgoYSxiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBiLmJrJiYoYi5iaz0wKTtiLmJrKz1hLWIuYm87Yi5ibz1hfWZ1bmN0aW9uIGwoYSxiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBiLmJsJiYoYi5ibD0wKTtiLmJsKz1hLWIuYnA7Yi5icD1hfWZ1bmN0aW9uIHAoYSxiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBiLmJnJiYoYi5iZz0wKTsidW5kZWZpbmVkIj09PXR5cGVvZiBiLmJjJiYoYi5iYz0wKTtiLmJ1PWEtYi5icztiLmJ1PmIuYmMmJihiLmJjPWIuYnUpO2IuYmcrPWEtYi5icTs1MDA8PWIuYmMmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuYncmJihiLmJrKz1hLWIuYm8sYi5idz1iLmJrKTtiLmJxPWF9ZnVuY3Rpb24gdChhLGIpeyJ1bmRlZmluZWQiPT09dHlwZW9mIGIuYmgmJihiLmJoPTApOyJ1bmRlZmluZWQiPT09dHlwZW9mIGIuYmQmJihiLmJkPTApO2IuYnY9YS1iLmJ0O2IuYnY+Yi5iZCYmKGIuYmQ9Yi5idik7Yi5iaCs9YS1iLmJyOzUwMDw9Yi5iZCYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5ieCYmKGIuYmwrPWEtYi5icCxiLmJ4PWIuYmwpO2IuYnI9YX1hLnI9e307dmFyIHE9ITE7YS5yLmE9e307YS5yLmEuYT17fTthLnIuYS5hLmE9MDthLnIuYS5hLmI9MTthLnIuYS5iPXt9O2Euci5hLmIuYT0wO2Euci5hLmIuYj0xO2Euci5hLmM9e307YS5yLmEuYy5hPTA7YS5yLmEuYy5iPTE7YS5yLmEuZD17fTthLnIuYS5kLmE9MDthLnIuYS5kLmI9MTthLnIuYS5lPXt9O2Euci5hLmUuYT0wO2Euci5hLmUuYj0xO2Euci5hLmY9e307YS5yLmEuZi5hPTA7YS5yLmEuZi5iPTE7YS5yLmEuZi5jPTI7YS5yLmI9ZnVuY3Rpb24oYSl7ayhhLGEuYWosIngiKTtrKGEsYS5haywieSIpO2EuSVI1LkFSRUE9KGEuSVI1Lk1BWC54LWEuSVI1Lk1JTi54KSooYS5JUjUuTUFYLnktYS5JUjUuTUlOLnkpfTthLnIuYz1mdW5jdGlvbihiKXtmdW5jdGlvbiBlKCl7NTAwPD0obmV3IEEpLmdldFRpbWUoKS1yYSYmKGEuci5kKHt0eXBlOiJwYXJrIn0sYiksY2xlYXJJbnRlcnZhbChkKSxiLmF1PWEuci5hLmEuYSl9dmFyIGM9Yi5hdTtpZihjPT09YS5yLmEuYS5hKXtyYT0obmV3IEEpLmdldFRpbWUoKTt2YXIgZD1hLmwuZShlLDUwKTtiLmF1PWEuci5hLmEuYn1lbHNlIGM9PT1hLnIuYS5hLmImJihyYT0obmV3IEEpLmdldFRpbWUoKSl9O2Euci5lPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGUoKXszZTM8PShuZXcgQSkuZ2V0VGltZSgpLW5hJiYoYS5yLmYoe3R5cGU6InBhcmsifSxiKSxjbGVhckludGVydmFsKGQpLGIuYXY9YS5yLmEuYS5hKX12YXIgYz1iLmF2O2lmKGM9PT1hLnIuYS5hLmEpe25hPShuZXcgQSkuZ2V0VGltZSgpO3ZhciBkPWEubC5lKGUsNTApO2IuYXY9YS5yLmEuYS5ifWVsc2UgYz09PWEuci5hLmEuYiYmKG5hPShuZXcgQSkuZ2V0VGltZSgpKX07YS5yLmc9ZnVuY3Rpb24oYixlKXt2YXIgYz1iLnR5cGU7ZChlKTtpZihlLmF6PT09YS5yLmEuZC5hKXtpZigibW91c2VvdmVyIj09PWN8fCJtb3VzZW1vdmUiPT09YyllLmJvPShuZXcgQSkuZ2V0VGltZSgpLGcoZSl9ZWxzZSBpZihlLmF6PT09YS5yLmEuZC5iKXsibW91c2Vtb3ZlIj09PWMmJmgoKG5ldyBBKS5nZXRUaW1lKCksZSk7aWYoIm1vdXNlb3V0Ij09PWN8fCJibHVyIj09PWMpaCgobmV3IEEpLmdldFRpbWUoKSxlKSxnKGUpOyJzY29vcGVyIj09PWMmJmgoKG5ldyBBKS5nZXRUaW1lKCksZSl9fTthLnIuaD1mdW5jdGlvbihiLGUpe3ZhciBoPWIudHlwZTtkKGUpO2lmKGUuYmE9PT1hLnIuYS5kLmEpe2lmKCJtb3VzZW92ZXIiPT09aHx8Im1vdXNlbW92ZSI9PT1oKWUuYnA9KG5ldyBBKS5nZXRUaW1lKCksYyhlKX1lbHNlIGlmKGUuYmE9PT1hLnIuYS5kLmIpeyJtb3VzZW1vdmUiPT09aCYmbCgobmV3IEEpLmdldFRpbWUoKSxlKTtpZigibW91c2VvdXQiPT09aHx8ImJsdXIiPT09aClsKChuZXcgQSkuZ2V0VGltZSgpLGUpLGMoZSk7InNjb29wZXIiPT09aCYmbCgobmV3IEEpLmdldFRpbWUoKSxlKX19O2Euci5kPWZ1bmN0aW9uKGUsYyl7aWYoMiE9Yy5hbil7dmFyIGQ9ZS50eXBlO2lmKGMuYXg9PT1hLnIuYS5iLmEpe2lmKCJtb3VzZW92ZXIiPT09ZHx8Im1vdXNlbW92ZSI9PT1kKWMuYnE9KG5ldyBBKS5nZXRUaW1lKCksYy5icz0obmV3IEEpLmdldFRpbWUoKSxiKGMpfWVsc2UgYy5heD09PWEuci5hLmIuYiYmKCJtb3VzZW1vdmUiIT09ZCYmIm1vdXNlb3V0IiE9PWR8fHAoKG5ldyBBKS5nZXRUaW1lKCksYyksInBhcmsiPT09ZCYmcCgobmV3IEEpLmdldFRpbWUoKS01MDAsYyksIm1vdXNlb3V0IiE9PWQmJiJwYXJrIiE9PWR8fGIoYykpfX07YS5yLmY9ZnVuY3Rpb24oYixjKXtpZigyIT1jLmFuKXt2YXIgZD1iLnR5cGU7aWYoYy5heT09PWEuci5hLmMuYSl7aWYoIm1vdXNlb3ZlciI9PT1kfHwibW91c2Vtb3ZlIj09PWQpYy5icj0obmV3IEEpLmdldFRpbWUoKSxjLmJ0PShuZXcgQSkuZ2V0VGltZSgpLGUoYyl9ZWxzZSBjLmF5PT09YS5yLmEuYy5iJiYoIm1vdXNlbW92ZSIhPT1kJiYibW91c2VvdXQiIT09ZHx8dCgobmV3IEEpLmdldFRpbWUoKSxjKSwicGFyayI9PT1kJiZ0KChuZXcgQSkuZ2V0VGltZSgpLTNlMyxjKSwibW91c2VvdXQiIT09ZCYmInBhcmsiIT09ZHx8ZShjKSl9fTthLnIuaT1mdW5jdGlvbihiLGUpe3ZhciBjPWIudHlwZTtpZihlLmJiPT1hLnIuYS5lLmEpe2lmKCJtb3VzZW92ZXIiPT1jfHwibW91c2Vtb3ZlIj09YyllLmJmPShuZXcgQSkuZ2V0VGltZSgpLGUuYmI9YS5yLmEuZS5ifWVsc2UgZS5iYj09YS5yLmEuZS5iJiYoIm1vdXNlb3V0Ij09Yz8oZigobmV3IEEpLmdldFRpbWUoKSxlKSxlLmJiPWEuci5hLmUuYSk6Im1vdXNlbW92ZSIhPWMmJiJzY29vcGVyIiE9Y3x8ZigobmV3IEEpLmdldFRpbWUoKSxlKSl9fSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYil7YS5mb2N1cy5wYWdlSXNQcmVyZW5kZXJlZCgpfHwoYS5rLmEuemF4cygibm9Mb25nZXJQcmVSZW5kZXJlZCIpLGEubC5kKGRvY3VtZW50LHAsaywicHIiKSl9ZnVuY3Rpb24gZChhKXsidW5kZWZpbmVkIj09dHlwZW9mIGUmJihlPWEpfWEuZm9jdXM9e307dmFyIGY9ITEsZz1hLmMuYmMsZz0tMTxnLmluZGV4T2YoIlNhZmFyaSIpJiYtMT09Zy5pbmRleE9mKCJDaHJvbWUiKSYmLTE9PWcuaW5kZXhPZigiQ2hyb21pdW0iKSYmIWEuYS5sKCksYz1hLmEudCgpJiYhYS5hLmwoKSxiPSJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50Lmhhc0ZvY3VzLGUsaD17dmlzaWJsZTowLGhpZGRlbjoxLHByZXJlbmRlcjoyfSxsLHAsdCxxOyJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50LmhpZGRlbj8obD0iaGlkZGVuIixwPSJ2aXNpYmlsaXR5Y2hhbmdlIik6InVuZGVmaW5lZCIhPT10eXBlb2YgZG9jdW1lbnQubW96SGlkZGVuPyhsPSJtb3pIaWRkZW4iLHA9Im1venZpc2liaWxpdHljaGFuZ2UiKToidW5kZWZpbmVkIiE9PXR5cGVvZiBkb2N1bWVudC5tc0hpZGRlbj8obD0ibXNIaWRkZW4iLHA9Im1zdmlzaWJpbGl0eWNoYW5nZSIpOiJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50LndlYmtpdEhpZGRlbiYmKGw9IndlYmtpdEhpZGRlbiIscD0id2Via2l0dmlzaWJpbGl0eWNoYW5nZSIpO2Zvcih2YXIgeT1bInYiLCJtb3pWIiwibXNWIiwid2Via2l0ViJdLHg9MDt4PHkubGVuZ3RoO3grKyl7dmFyIG49eVt4XSsiaXNpYmlsaXR5U3RhdGUiO2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50W25dJiZudWxsIT09ZG9jdW1lbnRbbl0pe3Q9bjticmVha319cT0idW5kZWZpbmVkIiE9PXR5cGVvZiBsO3ZhciBtLEk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT9tPSJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiOiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJihtPSJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKTtJPWcmJiJzdHJpbmciPT10eXBlb2YgbSYmIXE7dmFyIEc9KG5ldyBBKS5nZXRUaW1lKCk7SSYmZnVuY3Rpb24gRSgpe0c9KG5ldyBBKS5nZXRUaW1lKCk7aWYoIWYpd2luZG93W21dKEUpfSgpO2EuZm9jdXMuZm9jdXNTdGFydFRpbWU9ITE7dmFyIEo9ci5zd2RlLmF6c3goImZvY3VzU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGIpe2ImJihhLmZvY3VzLmZvY3VzU3RhcnRUaW1lPShuZXcgQSkuZ2V0VGltZSgpLHIuc3dkZS5zeGF6KCJmb2N1c1N0YXRlQ2hhbmdlIix7aWQ6Sixwcmlvcml0eToxfSkpfSx7cHJpb3JpdHk6MX0pO2EuZm9jdXMuZ2V0Rm9jdXNNZXRob2Q9ZnVuY3Rpb24oKXtyZXR1cm4gZX07YS5mb2N1cy52aXNpYmlsaXR5Y2hhbmdlPXA7YS5mb2N1cy5zZXRGb2N1c0xpc3RlbmVycz1mdW5jdGlvbigpe307YS5mb2N1cy5nZXRRdWVyeVN0cmluZz1mdW5jdGlvbihhKXthPXt9O2EuZW09ZTt6JiYoYS5lbz0xKTsidW5kZWZpbmVkIiE9dHlwZW9mIHQmJihhLmVuPWhbZG9jdW1lbnRbdF1dKTtyZXR1cm4gYX07YS5mb2N1cy5zdXBwb3J0c1BhZ2VWaXNBUEk9ZnVuY3Rpb24oKXtyZXR1cm4gcX07YS5mb2N1cy5jaGVja0ZvY3VzPWZ1bmN0aW9uKCl7aWYoYS5mb2N1cy5zdXBwb3J0c1BhZ2VWaXNBUEkoKSlyZXR1cm4gZCgwKSwhZG9jdW1lbnRbbF07aWYoSSlyZXR1cm4gZCgxKSwxMDA+KG5ldyBBKS5nZXRUaW1lKCktRztpZihjJiZiKXJldHVybiBkKDIpLGRvY3VtZW50Lmhhc0ZvY3VzKCk7ZCgzKTtyZXR1cm4hMH07dmFyIEM9ITE7YS5mb2N1cy5wYWdlSXNWaXNpYmxlPWZ1bmN0aW9uKCl7dmFyIGI9YS5mb2N1cy5jaGVja0ZvY3VzKCk7aWYoQyE9YiYmciYmci5zd2RlKXRyeXtyLnN3ZGUuemF4cygiZm9jdXNTdGF0ZUNoYW5nZSIsYil9Y2F0Y2goZSl7fXJldHVybiBDPWJ9O2EuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiB0PyJwcmVyZW5kZXIiPT1kb2N1bWVudFt0XTohMX07YS5mb2N1cy5wYWdlSXNWaXNpYmxlKCk7YS5rLmEuYXpzeCgiYWxsTG9jYWxBZHNLaWxsZWQiLGZ1bmN0aW9uKCl7Zj0hMH0se29uY2U6ITB9KTthLmZvY3VzLnBhZ2VJc1ByZXJlbmRlcmVkKCkmJmEubC5jKGRvY3VtZW50LHAsaywicHIiKTt2YXIgej1hLmZvY3VzLnBhZ2VJc1ByZXJlbmRlcmVkKCl9KSh1KTsoZnVuY3Rpb24oYSl7YS5zPXt9O2Eucy5hPWZ1bmN0aW9uKCl7dmFyIGs9YS50LmE7YS50LmIoWyJpZnJhbWVbaWRePSdlYkJhbm5lcklGcmFtZSddIiwiJFtpZHxlYkJhbm5lcklGcmFtZV8oWzAtOV0rX1swLTldKyldLy4uLi9ib2R5LyNleWVEaXYvaWZyYW1lW2lkXj0nZWJBZCddW2lkKj0ncGFuZWwnXVtpZCo9J2lmcmFtZSddW2lkKj0nJDAnXSIsWyJleHBhbmRVbmxvYWRzIiwidXNlSXNGb3VuZEFkS25vd24iLCJydW5XaXRob3V0RXhwYW5kIl1dLCJTaXptZWsgYmFja3JlZiIpO2EudC5iKFsiaWZyYW1lW2lkXj0nZWJCYW5uZXJJRnJhbWUnXSIsIi4uLi9ib2R5LyNleWVEaXYvaWZyYW1lW2lkXj0nZWJBZCddW2lkKj0ncGFuZWwnXVtpZCo9J2lmcmFtZSddIixbImV4cGFuZFVubG9hZHMiLCJ1c2VJc0ZvdW5kQWRLbm93biIsInJ1bldpdGhvdXRFeHBhbmQiLCJzZXRDb2xsYXBzZVByb3h5SW5Mb29wIl0sITEsIi4uLi9ib2R5LyNleWVEaXYiXSwiU2l6bWVrIGN1c3RvbSIpO2EudC5iKFsiW2lkXj0nZW52SXBvbGxpJ11bbmFtZV49J2Vudklwb2xsaSddIiwiW2lkXj0nZW52SXBvbGxpJ11bbmFtZV49J2Vudklwb2xsaSddLyRbaWR8ZW52SXBvbGxpKFxcZCspXS8uLi4vYm9keS9pZnJhbWVbaWQ9J2V4cElwb2xsaSQwX2lmcmFtZSddIixbInJ1bldpdGhvdXRFeHBhbmQiLCJleHBhbmRVbmxvYWRzIiwibm9Db2xsYXBzZVZhbGlkYXRpb24iXV0sIklwb2xsaSIpO2EudC5iKFsiW2lkXj0nT3JpZ2luUGxhdGZvcm1BZFVuaXQnXVtpZCQ9J2lucGFnZSddIiwiJFtpZHxPcmlnaW5QbGF0Zm9ybUFkVW5pdC0oXFxkKyktaW5wYWdlXS8uLi4uLi9baWQ9J09yaWdpblBsYXRmb3JtQWRVbml0LSQwLW92ZXJ0aGVwYWdlJ10iLFsiZXhwYW5kVW5sb2FkcyIsInVzZUlzRm91bmRBZEtub3duIiwicnVuV2l0aG91dEV4cGFuZCJdXSwiT3JpZ2luIHBsYXRmb3JtIik7YS50LmIoWyIjY2FjX2FkaGVyZSIsIi4uLi4vJFtpZHxjbUFkRnJhbWVfX2NyaXNwLSguKildLy4uLi4uL2lmcmFtZSNjYWNQYW5lbElmcmFtZV9fY3Jpc3AtJDAiLFsidXNlSXNGb3VuZEFkS25vd24iLCJmaW5kRXhwYW5kSW5Mb29wIiwic2V0RXhwYW5kUHJveHlJbkxvb3AiXSwhMSwhMSwiaWZyYW1lLz0+L2RpdltpZD0ncGFuZWxDb250YWluZXJEaXYnXSJdLCJjYWNfYWRoZXJlIik7YS5jLmJ0JiZhLmMuYnQoKSYmIkFkTWFydmVsIj09YS5jLmJ0KCkmJihhLnQuYihbImRpdiNub3JtYWwiLCJkaXYjZXhwYW5kZWQiLFsibm9Jbml0aWFsVmFsaWRhdGlvbiJdXSwiT3BlcmEgTVJBSUQgMSIpLGEudC5iKFsiZGl2I25vcm1hbCIsImRpdiNyZXNpemVkIixbIm5vSW5pdGlhbFZhbGlkYXRpb24iXV0sIk9wZXJhIE1SQUlEIDIiKSk7ay5wdXNoKHtuYW1lOiJwaWN0ZWxhIixvbkZpbmRBZDpmdW5jdGlvbihkLGYsZyl7aWYoKGQ9YS5jLmRiP2EudS5hKFsiZGl2W2lkXj0ncHRlbGFfdW5pdFdyYXBwZXInXSJdLGQpWzBdOmEudS5hKFsiZGl2W2lkXj0ncHRlbGFzd2Zob2xkZXInXSJdLGQpWzBdKSYmYS5hLmJ0KGQpKXJldHVybiBkfX0se25hbWU6IkZsYXNodGFsa2luZyIsY29sbGFwc2VkUmU6L2Z0ZGl2XGQrLyxleHBhbmRlZFJlOi9mdGluXGQrLyxjbGlwUmU6L3JlY3RcKChcZCspcHgsPyAoXGQrKXB4LD8gKFxkKylweCw/IChcZCspcHhcKS8sb25GaW5kQWQ6ZnVuY3Rpb24oZCxmLGcpe3ZhciBjPWEudC5jKGQsdGhpcy5jb2xsYXBzZWRSZSk7ZD1hLnQuYyhkLHRoaXMuZXhwYW5kZWRSZSk7aWYoYyYmZClyZXR1cm4gYS50LmRbZl09YS50LmUoYyxmLGcpLGEudC5kW2ZdLmV4cGFuZGVkRWw9ZCxjfSxvbkxvb3A6ZnVuY3Rpb24oZCl7dmFyIGY9ITEsZz1kLmV4cGFuZGVkRWwuc3R5bGUuY2xpcCxnPWcmJmcubWF0Y2godGhpcy5jbGlwUmUpOyIwIj09PShnJiZnWzRdKSYmKGY9ITApO2YmJiFkLmV4cGFuZGVkSXNPcGVuP2EudC5mKGQuZXhwYW5kZWRFbCwiZGl2IixudWxsLGQuYWROdW0pOiFmJiZkLmV4cGFuZGVkSXNPcGVuJiZhLnQuZyhkLCEwKX19LHtuYW1lOiJkb3VibGVjbGljayBzaWRla2ljayIscmU6LyhESVYpXyhcZHs2fSlfMV8oXGR7MTN9KS8sb25GaW5kQWQ6ZnVuY3Rpb24oZCxmLGcpe2lmKGQ9YS50LmMoZCx0aGlzLnJlKSlyZXR1cm4gYS50LmRbZl09YS50LmUoZCxmLGcpLGR9LGZpbmRFeHBhbmRlZDpmdW5jdGlvbihhKXtpZihhPWEuaWQubWF0Y2godGhpcy5yZSkpZm9yKHZhciBmPVthWzNdLE51bWJlcihhWzNdKSsxXSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBjPVsiRElWIixhWzJdLCIyIixmW2ddXS5qb2luKCJfIik7aWYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjKSlyZXR1cm4gY319fSx7bmFtZToiUG9pbnRyb2xsIDEiLHJlOi9wcihmbHNoKShbQS1aMC05XSspLyxvbkZpbmRBZDpmdW5jdGlvbihkLGYsZyl7aWYoYS5jLmRiKXt2YXIgYz13aW5kb3cucHJCbnI7aWYoYyYmMT09PWMubm9kZVR5cGUmJmEuYS5idChjKSl7dmFyIGI9ZCYmZC5pbm5lckhUTUwmJmQuaW5uZXJIVE1MLm1hdGNoKC9wcmFkaShbQS1aMC05XSspLyk7aWYoKGI9YiYmYlsxXSkmJmMuaWQmJmMuaWQubWF0Y2goYikmJihkPWQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJmIitiKSkpcmV0dXJuIGEudC5kW2ZdPWEudC5lKGMsZixnKSxhLnQuZFtmXS51bmNsZT1kLGN9fX0sb25Mb29wOmZ1bmN0aW9uKGQpe3ZhciBmPSExLGc9ZC51bmNsZTtnJiZnLmNoaWxkcmVuJiYxPT09Zy5jaGlsZHJlbi5sZW5ndGgmJihnPWcuY2hpbGRyZW5bMF0pJiYxPT09Zy5jaGlsZHJlbi5sZW5ndGgmJihkLmV4cGFuZGVkRWw9ZyxmPSEwKTtmJiYhZC5leHBhbmRlZElzT3Blbj9hLnQuZihkLmV4cGFuZGVkRWwsImRpdiIsbnVsbCxkLmFkTnVtKTohZiYmZC5leHBhbmRlZElzT3BlbiYmYS50LmcoZCwhMCl9fSx7bmFtZToiUG9pbnRyb2xsIDIiLHJlOi9wcmFkaShbQS1aMC05XSspLyxvbkZpbmRBZDpmdW5jdGlvbihkLGYsZyl7dmFyIGM9ZCYmZC5pbm5lckhUTUwmJmQuaW5uZXJIVE1MLm1hdGNoKHRoaXMucmUpO2lmKGMpe3ZhciBiPWQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQ7ZD1iLmdldEVsZW1lbnRCeUlkKCJwcmYiK2NbMV0pO3ZhciBlO2lmKGQpe3ZhciBoPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIiksbD1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxwPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2gmJmhbMF0mJmEuYS5idShoWzBdKT9lPWhbMF06bCYmbFswXSYmYS5hLmJ1KGxbMF0pP2U9bFswXTpwJiYwPHAubGVuZ3RoJiZhLmEuZm9yRWFjaChwLGZ1bmN0aW9uKGIpe2ImJiJtYWwtYWQtY29udGFpbmVyIj09PWIuaWQmJmEuYS5idChiKSYmKGU9Yil9KTshZSYmZC5jaGlsZHJlbiYmMT09PWQuY2hpbGRyZW4ubGVuZ3RoJiYoaD1kLmNoaWxkcmVuWzBdKSYmMT09PWguY2hpbGRyZW4ubGVuZ3RoJiZhLmEuYnQoaC5jaGlsZHJlblswXSkmJihlPWguY2hpbGRyZW5bMF0pfWV8fChjPWIuZ2V0RWxlbWVudEJ5SWQoInBydyIrY1sxXSkpJiZhLmEuYnQoYykmJihlPWMpO2lmKGUpcmV0dXJuIGEudC5kW2ZdPWEudC5lKGUsZixnKSxhLnQuZFtmXS51bmNsZT1kLGV9fSxvbk5ld0FkOmZ1bmN0aW9uKGQsZil7ZCYmZC51bmNsZSYmYS5qLmMoZixkLnVuY2xlKX19LHtuYW1lOiJVbmljYXN0IDEiLHJlOi9Wd1AoXGQrKURpdi8sb25GaW5kQWQ6ZnVuY3Rpb24oZCxmLGcpe2lmKGQ9YS50LmMoZCx0aGlzLnJlKSl7dmFyIGM9ZC5pZC5tYXRjaCh0aGlzLnJlKTtpZihjJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVndQIitjWzFdKyJEaXYyIikpJiYoYz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKSwzIT09Yy5sZW5ndGgmJjE9PT1jLmxlbmd0aCkpe2M9Y1swXTtpZihhLmEuYnQoYykpcmV0dXJuIGM7YS50LmRbZl09YS50LmUoZCxmLGcpO3JldHVybiBkfX19LGZpbmRFeHBhbmRlZDpmdW5jdGlvbihkKXtpZigoZD1kLmlkLm1hdGNoKHRoaXMucmUpKSYmKGQ9KGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlZ3UCIrZFsxXSsiRGl2MiIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKSkmJmRbMF0pJiZhLmEuYnQoZCkpcmV0dXJuIGR9fSk7ay5wdXNoKHtuYW1lOiJCbGVlZCIsb25GaW5kQWQ6ZnVuY3Rpb24oZCxmLGcpe2lmKGEudS5hKFsic2NyaXB0W3NyYyo9J2pldHBhY2tkaWdpdGFsJ10iXSxkKVswXSYmKGQ9YS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpwc3VwZXJoZWFkZXIiKSkmJmEuYS5idChkKSl7dmFyIGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7aWYoYyYmMT09PWMubGVuZ3RoJiZjWzBdLmlkJiZjWzBdLmlkLm1hdGNoKCJqcF9lbWJlZCIpKXJldHVybiBjPWNbMF0sYS50LmRbZl09YS50LmUoZCxmLGcpLGEudC5kW2ZdLmV4cGFuZGVkRWw9YyxhLnQuZFtmXS5iZ0NoZWNrPWMmJmMucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnBhcmVudE5vZGUsZH19LG9uTG9vcDpmdW5jdGlvbihkKXt2YXIgZj0hMTtkLmJnQ2hlY2suY2xhc3NOYW1lJiZkLmJnQ2hlY2suY2xhc3NOYW1lLm1hdGNoKCJiYWNrZ3JvdW5kMSIpJiYoZj0hMCk7ZiYmIWQuZXhwYW5kZWRJc09wZW4/KGEudC5mKGQuZXhwYW5kZWRFbCxudWxsLG51bGwsZC5hZE51bSksYS5qLmIoQltkLmFkTnVtXSxzdGFnZS5iZ0NoZWNrKSk6IWYmJmQuZXhwYW5kZWRJc09wZW4mJmEudC5nKGQsITApfX0pO2sucHVzaCh7bmFtZToiSlBEIixpc0ZvdW5kQWRLbm93bjpmdW5jdGlvbihkLGYsZyl7aWYoZC5jbGFzc05hbWUmJmQuY2xhc3NOYW1lLm1hdGNoKCJqcHBsYXRmb3JtIikpdmFyIGM9YS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpwX292ZXJsYXkiKSxiPSEwO2Vsc2UgZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUuaWQmJiJqcGRfZXhwZm9vdGVyIj09PWQucGFyZW50Tm9kZS5pZCYmKGM9YS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpwZF9leHBmb290ZXJfb3ZlcmxheSIpLGI9ITEpO2lmKGMpe3ZhciBlPWEuYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqcHBhbmVsIiwiRElWIixjKTtpZihlJiYwPGUubGVuZ3RoKXJldHVybiBkPWEudC5lKGQsZixnKSxhLnQuZFtmXT1kLGEudC5kW2ZdLm92ZXJsYXk9YyxhLnQuZFtmXS5wYW5lbHM9ZSxhLnQuZFtmXS5pZ25vcmVWaWRlbz1iLCEwfX0sb25Mb29wOmZ1bmN0aW9uKGQpe3ZhciBmLGc9ITE7aWYoZC5vdmVybGF5JiZkLm92ZXJsYXkuc3R5bGUmJiItOTk5OXB4IiE9PWQub3ZlcmxheS5zdHlsZS50b3Ape2lmKCFkLmV4cGFuZGVkRWx8fGQuZXhwYW5kZWRFbCYmZC5leHBhbmRlZEVsLnN0eWxlJiYiLTk5OTlweCI9PT1kLmV4cGFuZGVkRWwuc3R5bGUudG9wKWQuaWdub3JlVmlkZW8/YS5hLmZvckVhY2goZC5wYW5lbHMsZnVuY3Rpb24oYSl7aWYoYSYmYS5zdHlsZSYmIi05OTk5cHgiIT09YS5zdHlsZS50b3AmJjA9PT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aClyZXR1cm4gZj1hLCExfSk6YS5hLmZvckVhY2goZC5wYW5lbHMsZnVuY3Rpb24oYSl7aWYoYSYmYS5zdHlsZSYmIi05OTk5cHgiIT09YS5zdHlsZS50b3ApcmV0dXJuIGY9YSwhMX0pLGYmJmEuYS5idChmKSYmKGQuZXhwYW5kZWRFbD1mKTtkLmV4cGFuZGVkRWwmJihnPSEwKX1nJiYhZC5leHBhbmRlZElzT3Blbj9hLnQuZihkLmV4cGFuZGVkRWwsImRpdiIsbnVsbCxkLmFkTnVtKTohZyYmZC5leHBhbmRlZElzT3BlbiYmYS50LmcoZCwhMCl9fSk7ay5wdXNoKHtuYW1lOiJBZGZvcm0gVHdvRWxlbWVudCIsaXNGb3VuZEFkS25vd246ZnVuY3Rpb24oZCxmLGcpe3ZhciBjPUJbZl07aWYoYy5hZGZvcm1Db2xsYXBzZWRFbCYmYy5hZGZvcm1FeHBhbmRlZEVsKXJldHVybiBkPWEudC5lKGQsZixnKSxhLnQuZFtmXT1kLGEudC5kW2ZdLmV4cGFuZGVkRWw9Yy5hZGZvcm1FeHBhbmRlZEVsLGEudC5kW2ZdLmhpZGRlbkNsYXNzUng9LyhefCApYWRmb3JtLWFkYm94LWhpZGRlbigkfCApLywhMH0sb25Mb29wOmZ1bmN0aW9uKGQpe3ZhciBmPSExO2QuaGlkZGVuQ2xhc3NSeC50ZXN0KGQuY29sbGFwc2VkRWwuY2xhc3NOYW1lKSYmKGY9ITApO2YmJiFkLmV4cGFuZGVkSXNPcGVuP2EudC5mKGQuZXhwYW5kZWRFbCxudWxsLG51bGwsZC5hZE51bSk6IWYmJmQuZXhwYW5kZWRJc09wZW4mJmEudC5nKGQsITApfX0pO2sucHVzaCh7bmFtZToiU2l6bWVrIExlYXZlYmVoaW5kIixmaW5kQ29sbGFwc2VkQWQ6ZnVuY3Rpb24oZCl7aWYoIWQpcmV0dXJuITE7aWYoZD1kLmdldEVsZW1lbnRCeUlkKCJleWVEaXYiKSl7dmFyIGYsZz0vZWJBZFxkK19jb250cmFjdGVkcGFuZWxfYXNzZXRfLiovaTtpZigoZD1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSkmJjA8ZC5sZW5ndGgmJihhLmEuZm9yRWFjaChkLGZ1bmN0aW9uKGEpe2lmKGEmJmEuaWQubWF0Y2goZykpcmV0dXJuIGY9YSwhMX0pLGYpKXJldHVybiBmfXJldHVybiExfSxmaW5kRXhwYW5kZWRBZDpmdW5jdGlvbihkKXtpZighZClyZXR1cm4hMTtpZihkPWQuZ2V0RWxlbWVudEJ5SWQoImV5ZURpdiIpKXt2YXIgZixnPS9lYkFkXGQrX2V4cGFuZGVkcGFuZWxcZCpfYXNzZXRfLiovaTtpZigoZD1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSkmJjA8ZC5sZW5ndGgmJihhLmEuZm9yRWFjaChkLGZ1bmN0aW9uKGEpe2lmKGEmJmEuaWQubWF0Y2goZykpcmV0dXJuIGY9YSwhMX0pLGYpKXJldHVybiBmfXJldHVybiExfSxpc0FkRXhwYW5kZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmluZEV4cGFuZGVkQWQoYSk/ITA6ITF9LG9uRmluZEFkOmZ1bmN0aW9uKGQsZixnKXtpZighZHx8IWEudS5hKFsiZGl2I21tQmlsbGJvYXJkU2hpbSJdLGQpWzBdKXJldHVybiExO3ZhciBjPWEuYy5lJiZhLmMuZS5kb2N1bWVudDtkPXRoaXMuZmluZENvbGxhcHNlZEFkKGMpO2M9dGhpcy5maW5kRXhwYW5kZWRBZChjKTtpZihkfHxjKXtpZihkJiYhZFtEXSlyZXR1cm4gZz1hLnQuZShkLGYsZyksYS50LmRbZl09ZyxkO2lmKGMmJmEuYS5idChjKSlyZXR1cm4gZz1hLnQuZShjLGYsZyksYS50LmRbZl09ZyxjfX0sYWZ0ZXJBZFN0YXRlQ3JlYXRlZDpmdW5jdGlvbihkKXtkLnBhZ2VEb2N1bWVudD1hLmMuZS5kb2N1bWVudDtkLmNvbGxhcHNlVW5sb2Fkcz0hMH0sb25Mb29wOmZ1bmN0aW9uKGQpe3ZhciBmPXRoaXMuaXNBZEV4cGFuZGVkKGQucGFnZURvY3VtZW50KTshMT09PWQuZXhwYW5kZWRJc09wZW4mJmY/KGQuZXhwYW5kZWRFbD10aGlzLmZpbmRFeHBhbmRlZEFkKGQucGFnZURvY3VtZW50KSxhLnQuZihkLmV4cGFuZGVkRWwsbnVsbCxudWxsLGQuYWROdW0pKTpkLmV4cGFuZGVkSXNPcGVuJiYwPT1mJiYoZC5jb2xsYXBzZWRFbD10aGlzLmZpbmRDb2xsYXBzZWRBZChkLnBhZ2VEb2N1bWVudCksYS50LmgoZC5jb2xsYXBzZWRFbCxudWxsLG51bGwsZC5hZE51bSkpfX0pO2sucHVzaCh7bmFtZToiU2l6bWVrIFB1c2hkb3duIixmaW5kRXhwYW5kZWRBZDpmdW5jdGlvbihkKXtpZighZClyZXR1cm4hMTtpZihkPWQuZ2V0RWxlbWVudEJ5SWQoImV5ZURpdiIpKXt2YXIgZixnPS9lYmFkXGQrX3BhbmVsXGQqX2Fzc2V0Xy4qL2k7aWYoKGQ9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IikpJiYwPGQubGVuZ3RoJiYoYS5hLmZvckVhY2goZCxmdW5jdGlvbihhKXtpZihhJiZhLmlkLm1hdGNoKGcpKXJldHVybiBmPWEsITF9KSxmKSlyZXR1cm4gZn1yZXR1cm4hMX0saXNBZEV4cGFuZGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZpbmRFeHBhbmRlZEFkKGEpPyEwOiExfSxpc0ZvdW5kQWRLbm93bjpmdW5jdGlvbihkKXtpZighZClyZXR1cm4hMTtpZihkLmlkJiZkLmlkLm1hdGNoKCJlYlJpY2hCYW5uZXJGbGFzaCIpKXtkPUwmJkwucGFyZW50Tm9kZSYmTC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTt2YXIgZj0hMTthLmEuZm9yRWFjaChkLGZ1bmN0aW9uKGEpe2lmKGEmJmEuc3JjJiZhLnNyYy5tYXRjaCgiZWJFeHBCYW5uZXIiKSlyZXR1cm4gZj0hMCwhMX0pO2lmKGYpcmV0dXJuITB9fSxhZnRlckFkU3RhdGVDcmVhdGVkOmZ1bmN0aW9uKGQpe2QucGFnZURvY3VtZW50PWEuYy5lLmRvY3VtZW50fSxvbkxvb3A6ZnVuY3Rpb24oZCl7dmFyIGY9dGhpcy5pc0FkRXhwYW5kZWQoZC5wYWdlRG9jdW1lbnQpOyExPT09ZC5leHBhbmRlZElzT3BlbiYmZj8oZC5leHBhbmRlZEVsPXRoaXMuZmluZEV4cGFuZGVkQWQoZC5wYWdlRG9jdW1lbnQpLGEudC5mKGQuZXhwYW5kZWRFbCxudWxsLG51bGwsZC5hZE51bSkpOmQuZXhwYW5kZWRJc09wZW4mJjA9PWYmJmEudC5nKGQsITApfX0pO2sucHVzaCh7bmFtZToiQ2VsdHJhIEJhbm5lci9WaWRlbyIsZmluZEV4cGFuZGVkQWQ6ZnVuY3Rpb24oZCl7aWYoZC5leHBhbmRlZEVsKXJldHVybiBkLmV4cGFuZGVkRWw7dmFyIGYsZyxjO2lmKCJiYW5uZXIiPT09ZC5leHBhbmRUeXBlKXtnPWEudi5hKGQucGFnZURvYy5ib2R5LGEudi5iKTtmb3IodmFyIGI9Zy5sZW5ndGgtMTswPD1iO2ItLSlpZigoYz1nW2JdLmNvbnRlbnRXaW5kb3cpJiZjLnJ1bnRpbWVQYXJhbXMmJmMucnVudGltZVBhcmFtcy5wbGFjZW1lbnRJZCYmYy5ydW50aW1lUGFyYW1zLmNsaWVudFRpbWVzdGFtcCYmYy5ydW50aW1lUGFyYW1zLnBsYWNlbWVudElkPT09ZC5jZWx0cmFJZCYmYy5ydW50aW1lUGFyYW1zLmNsaWVudFRpbWVzdGFtcD09PWQuY2VsdHJhVGltZXN0YW1wJiYoZj1jLmRvY3VtZW50JiZjLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjZWx0cmEtbW9kYWwiKSkmJmEuYS5idChmKSlyZXR1cm4gZC5wYXJlbnRGcmFtZXx8KGQucGFyZW50RnJhbWU9YS5nLmcoZikpLGQuZXhwYW5kZWRFbD1mfWVsc2UgaWYoInZpZGVvIj09PWQuZXhwYW5kVHlwZSl7Zz1kLnBhZ2VEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoZC5hZFdpbiYmZC5hZFdpbi52aWRlb0NvbnRleHQmJmQuYWRXaW4udmlkZW9Db250ZXh0LnVybCl7dmFyIGU9ZC5hZFdpbi52aWRlb0NvbnRleHQudXJsO2EuYS5mb3JFYWNoKGcsZnVuY3Rpb24oYSl7aWYoYSYmYS5zcmM9PT1lKXJldHVybiBmPWEsITF9KX1lbHNlIGEuYS5mb3JFYWNoKGcsZnVuY3Rpb24oYSl7aWYoYSYmYS5zcmMmJmEuc3JjLm1hdGNoJiZhLnNyYy5tYXRjaCgiY2VsdHJhIikpcmV0dXJuIGY9YSwhMX0pO2lmKGYmJmEuYS5idChmKSlyZXR1cm4gZC5leHBhbmRlZEVsPWZ9cmV0dXJuITF9LGlzQWRFeHBhbmRlZDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLmZpbmRFeHBhbmRlZEFkKGQpO3JldHVybiBmPyhkPWQucGFyZW50RnJhbWV8fGEuZy5nKGYpKSYmZC5zdHlsZSYmIm5vbmUiPT09ZC5zdHlsZS5kaXNwbGF5PyExOiEwOiExfSxpc0ZvdW5kQWRLbm93bjpmdW5jdGlvbihkLGYsZyl7aWYoIWQpcmV0dXJuITE7aWYoZC5pZCYmZC5pZC5tYXRjaCgiY2VsdHJhIil8fGQuY2xhc3NOYW1lJiZkLmNsYXNzTmFtZS5tYXRjaCgiY2VsdHJhIikpe3ZhciBjPWQub3duZXJEb2N1bWVudCYmKGQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8ZC5vd25lckRvY3VtZW50LnBhcmVudFdpbmRvdyk7aWYoYyYmYy5FeHBhbmRhYmxlQmFubmVyJiZjLnJ1bnRpbWVQYXJhbXMmJmMucnVudGltZVBhcmFtcy5wbGFjZW1lbnRJZCYmYy5ydW50aW1lUGFyYW1zLmNsaWVudFRpbWVzdGFtcClyZXR1cm4gZD1hLnQuZShkLGYsZyksYS50LmRbZl09ZCxhLnQuZFtmXS5leHBhbmRUeXBlPSJiYW5uZXIiLGEudC5kW2ZdLnBhZ2VEb2M9YS5jLmUuZG9jdW1lbnQsYS50LmRbZl0uY2VsdHJhSWQ9Yy5ydW50aW1lUGFyYW1zLnBsYWNlbWVudElkLGEudC5kW2ZdLmNlbHRyYVRpbWVzdGFtcD1jLnJ1bnRpbWVQYXJhbXMuY2xpZW50VGltZXN0YW1wLCEwO2lmKGMmJmMuVmlkZW9Db250ZXh0KXJldHVybiBkPWEudC5lKGQsZixnKSxhLnQuZFtmXT1kLGEudC5kW2ZdLmV4cGFuZFR5cGU9InZpZGVvIixhLnQuZFtmXS5wYWdlRG9jPWEuYy5lLmRvY3VtZW50LGEudC5kW2ZdLmFkV2luPWMsITB9fSxvbkxvb3A6ZnVuY3Rpb24oZCl7dmFyIGY9dGhpcy5pc0FkRXhwYW5kZWQoZCk7ZiYmIWQuZXhwYW5kZWRJc09wZW4/YS50LmYoZC5leHBhbmRlZEVsLCJkaXYiLG51bGwsZC5hZE51bSk6IWYmJmQuZXhwYW5kZWRJc09wZW4mJmEudC5nKGQsITApfX0pfX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGEsYixjKXt0aGlzLmNvbGxhcHNlZEVsPWE7dGhpcy5leHBhbmRlZEVsPW51bGw7dGhpcy5leHBhbmRlZElzT3Blbj0hMTt0aGlzLmFkTnVtPWI7dGhpcy5jb25maWdJbmRleD1jfWZ1bmN0aW9uIGQoYixjKXt2YXIgZD1hLnQuZFtjXTtpZighMCE9PWQuZmluZGluZ0V4cGFuZGVkKXtkLmZpbmRpbmdFeHBhbmRlZD0hMDt2YXIgZz1mdW5jdGlvbigpe2QuZmluZGluZ0V4cGFuZGVkPSExfSxrPUJbY10uYWE7YS5sLmsoZnVuY3Rpb24oKXt2YXIgZD1iLmZpbmRFeHBhbmRlZChrKTtpZihkKXJldHVybiBhLnYuYyhkLGMsZiwhMSxnKSwhMH0sNSw1MDAsZyl9fWZ1bmN0aW9uIGYoYixjLGQsZyl7YltNXT1nO2JbRF09ITA7Yz1CW2ddO2c9YS50LmRbZ107Zy5leHBhbmRlZElzT3Blbj0hMDthLmEuYnYoYixjKTtnLmZpbmRpbmdFeHBhbmRlZD0hMTtyZXR1cm4hMH1mdW5jdGlvbiBnKGIsYyl7YS5hLmJ2KGIuY29sbGFwc2VkRWwsQltiLmFkTnVtXSwhMCk7Yi5leHBhbmRlZElzT3Blbj0hMTtjfHwoYi5leHBhbmRlZEVsJiYoYi5leHBhbmRlZEVsW01dPXZvaWQgMCxiLmV4cGFuZGVkRWxbRF09dm9pZCAwKSxiLmV4cGFuZGVkRWw9bnVsbCl9ZnVuY3Rpb24gYyhiLGMsZCxnKXtpZighYilyZXR1cm4hMTtiW01dPWc7YltEXT0hMDthLnQuZFtnXS5leHBhbmRlZElzT3Blbj0hMTthLmEuYnYoYixCW2ddKTtyZXR1cm4hMH1hLnQ9e307YS50Lmk9ImJhYyI7dmFyIGI9W107YS50LmE9YjthLnQuZD17fTthLnQuZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBrKGEsYixjKX07YS50Lmo9ZnVuY3Rpb24oYil7dmFyIGM9YS50LmRbYi56cl07YyYmKGMuY29sbGFwc2VkRWw9bnVsbCxjLmV4cGFuZGVkRWw9bnVsbCxkZWxldGUgYS50LmRbYi56cl0pfTthLnQuaz1mdW5jdGlvbihiKXtyZXR1cm4oYj1hLnQuZFtiXSkmJiEwPT09Yi5leHBhbmRlZElzT3Blbn07YS50Lmw9ZnVuY3Rpb24oYil7cmV0dXJuKGI9YS50LmRbYl0pJiYhMD09PWIuY29sbGFwc2VVbmxvYWRzfTthLnQubT1mdW5jdGlvbihlLGgpe2U9ZS5yZXBsYWNlKC9eb24vLCIiKTt2YXIgZj1hLnQuZFtoXSxwPUJbaF07aWYoZil7dmFyIGs9YltmLmNvbmZpZ0luZGV4XTtpZigibW91c2Vkb3duIj09PWUmJmsuZmluZEV4cGFuZGVkJiYhZi5leHBhbmRlZElzT3BlbilkKGssaCk7ZWxzZSBpZigibW91c2VvdmVyIj09PWUmJmsub25Nb3VzZU92ZXImJiFmLmV4cGFuZGVkSXNPcGVuKWsub25Nb3VzZU92ZXIoZik7ZWxzZSBpZigibG9vcCI9PT1lJiZrLm9uTG9vcClrLm9uTG9vcChmKTtlbHNlIGlmKCJkZXBhcnRlZCI9PT1lJiZmLmV4cGFuZGVkSXNPcGVuKWcoZik7ZWxzZSBpZigiY29sbGFwc2VVbmxvYWRzIj09PWUmJmYuZXhwYW5kZWRJc09wZW4pYyhmLmNvbGxhcHNlZEVsLG51bGwsbnVsbCxoKTtlbHNlIGlmKCJuZXdhZCI9PT1lJiZrLm9uTmV3QWQpay5vbk5ld0FkKGYscCl9fTthLnQubj1mdW5jdGlvbihlLGMpe2Zvcih2YXIgZD1jLmFkTnVtLGc9MDtnPGIubGVuZ3RoO2crKyl7dmFyIGY9YltnXSxrPWYub25GaW5kQWQmJmYub25GaW5kQWQoZSxkLGcpO2lmKGspcmV0dXJuIGEuay5hLmF6c3goImFkS2lsbGVkIixhLncuYSx7b25jZTohMCxjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGEuenI9PWR9fSksYS50LmRbZF0mJmYuYWZ0ZXJBZFN0YXRlQ3JlYXRlZCYmZi5hZnRlckFkU3RhdGVDcmVhdGVkKGEudC5kW2RdKSxjLmFjdGl2ZUNvbmZpZz1mLm5hbWUsa319O2EudC5vPWZ1bmN0aW9uKGUpe2lmKGUhPT1hLnQuaSYmZS5hYSYmZS5hbyYmIWEudC5kW2RdKWZvcih2YXIgYz1lLmFhLGQ9ZS5hby5hZE51bSxnPTA7ZzxiLmxlbmd0aDtnKyspe3ZhciBmPWJbZ107aWYoZiYmZi5pc0ZvdW5kQWRLbm93biYmZi5pc0ZvdW5kQWRLbm93bihjLGQsZykpe2Euay5hLmF6c3goImFkS2lsbGVkIixhLncuYSx7b25jZTohMCxjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGEuenI9PWUuenJ9fSk7YS50LmRbZF18fChjPW5ldyBrKGMsZCxnKSxhLnQuZFtkXT1jKTtmLmFmdGVyQWRTdGF0ZUNyZWF0ZWQmJmYuYWZ0ZXJBZFN0YXRlQ3JlYXRlZChhLnQuZFtkXSk7ZS5hby5hY3RpdmVDb25maWc9Zi5uYW1lO2JyZWFrfX19O2EudC5wPWZ1bmN0aW9uKGEpe3JldHVybiJJTUciPT09YS50YWdOYW1lJiZhLmlkJiZhLmlkLm1hdGNoKC9ecHJhZGlbMC05QS1aXSskLykmJmEub25sb2FkJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEub25sb2FkLnRvU3RyaW5nJiZhLm9ubG9hZC50b1N0cmluZygpLm1hdGNoKC9zaG9ja3dhdmUvKX07YS50LnE9ZnVuY3Rpb24oYixjKXthLnQuayhjLnpyKSYmKGEudC5sKGMuenIpP2EudC5tKCJjb2xsYXBzZVVubG9hZHMiLGMuenIpOmEudC5tKCJkZXBhcnRlZCIsYy56ciksYi5zaG91bGRLaWxsQWQ9ITEpfTthLmsuYS5henN4KCJiZWZvcmVBZEtpbGxlZCIsYS50LnEse3ByaW9yaXR5OjV9KTthLnQuYj1mdW5jdGlvbihlLGQpe3ZhciBsPVtlWzBdXSxwPVtlWzFdXSx0PWVbMl0scT1lWzNdJiZbZVszXV0seT1lWzRdJiZbZVs0XV0seD1lWzVdJiZbZVs1XV0sbj1lWzZdLG09ZVs3XSxJPSExLEc9ITEsSj0hMSxDPSExLHo9ITEsSz0hMSxFPSExLFAsdj1QPSExLEg9ITEscj0hMSx1PSExLHc9ITEsUT0hMTt0JiYoYS5hLmF4KHQsImNoZWNrSGlkZGVuU3R5bGVzIikmJihJPSEwKSxhLmEuYXgodCwibm9Jbml0aWFsVmFsaWRhdGlvbiIpJiYoRz0hMCksYS5hLmF4KHQsIm5vTG9vcFZhbGlkYXRpb24iKSYmKEo9ITApLGEuYS5heCh0LCJub0NvbGxhcHNlVmFsaWRhdGlvbiIpJiYoQz0hMCksYS5hLmF4KHQsInJ1bldpdGhvdXRFeHBhbmQiKSYmKHo9ITApLGEuYS5heCh0LCJjb2xsYXBzZVVubG9hZHMiKSYmKEs9ITApLGEuYS5heCh0LCJleHBhbmRVbmxvYWRzIikmJihFPSEwKSxhLmEuYXgodCwidXNlSXNGb3VuZEFkS25vd24iKSYmKFA9ITApLGEuYS5heCh0LCJzZXRDb2xsYXBzZVByb3h5SW5Mb29wIikmJih2PSEwKSxhLmEuYXgodCwic2V0RXhwYW5kUHJveHlJbkxvb3AiKSYmKEg9ITApLGEuYS5heCh0LCJmaW5kRXhwYW5kSW5Mb29wIikmJih6PXI9ITApLGEuYS5heCh0LCJhZGRFeHBhbmRUYWciKSYmKHU9ITApLGEuYS5heCh0LCJzZXRJZnJhbWVBc3NldFR5cGUiKSYmKHc9ITApLGEuYS5heCh0LCJwcmVmZXJDb2xsYXBzZSIpJiYoUT0hMCkpO2IucHVzaCh7bmFtZTpkLGlzRm91bmRBZEtub3duOmZ1bmN0aW9uKGIsYyxlKXtpZighUHx8IWIpcmV0dXJuITE7aWYobiYmbSl7aWYoKGI9KGI9QltjXS5hbykmJmJbbl0pJiYhYS5hLmF4KG0sYikpcmV0dXJuITF9ZWxzZSBpZihhLnUuYShsLGIpWzBdKXtpZih6KXJldHVybiBhLnQuZFtjXT1uZXcgayhiLGMsZSksYS50LmRbY10uY29sbGFwc2VkUXVlcnk9bCxhLnQuZFtjXS5leHBhbmRlZFF1ZXJ5PXAsYS50LmRbY10uc2VhcmNoYWJsZUVsPWIsYS50LmRbY10uY2hlY2tIaWRkZW5TdHlsZXM9SSxhLnQuZFtjXS5jb2xsYXBzZVVubG9hZHM9SyxhLnQuZFtjXS5ub0xvb3BWYWxpZGF0aW9uPUosYS50LmRbY10uZXhwYW5kVW5sb2Fkcz1FLGEudC5kW2NdLmV4cGFuZGVkU2VsZWN0b3I9cSxhLnQuZFtjXS5jb2xsYXBzZVByb3h5RWw9eSxhLnQuZFtjXS5leHBhbmRQcm94eUVsPXgsYS50LmRbY10uY29sbGFwc2VVbmxvYWRzPUssYS50LmRbY10uc2V0Q29sbGFwc2VQcm94eUluTG9vcD12LGEudC5kW2NdLnNldEV4cGFuZFByb3h5SW5Mb29wPUgsYS50LmRbY10uZmluZEV4cGFuZEluTG9vcD1yLGEudC5kW2NdLmFkZEV4cGFuZFRhZz11LGEudC5kW2NdLnNldElmcmFtZUFzc2V0VHlwZT13LGEudC5kW2NdLnByZWZlckNvbGxhcHNlPVEseSYmYS51LmIoeSxCW2NdLGIpLCEwO3ZhciBkPWEudS5hKHAsYilbMF07aWYoZCYmKEd8fGEuYS5idShkKSkpcmV0dXJuIGEudC5kW2NdPW5ldyBrKGIsYyxlKSxhLnQuZFtjXS5jb2xsYXBzZWRRdWVyeT1sLGEudC5kW2NdLmV4cGFuZGVkUXVlcnk9cCxhLnQuZFtjXS5zZWFyY2hhYmxlRWw9YixhLnQuZFtjXS5jaGVja0hpZGRlblN0eWxlcz1JLGEudC5kW2NdLmNvbGxhcHNlVW5sb2Fkcz1LLGEudC5kW2NdLm5vTG9vcFZhbGlkYXRpb249SixhLnQuZFtjXS5leHBhbmRVbmxvYWRzPUUsYS50LmRbY10uZXhwYW5kZWRTZWxlY3Rvcj1xLGEudC5kW2NdLmV4cGFuZGVkRWw9ZCxhLnQuZFtjXS5jb2xsYXBzZVByb3h5RWw9eSxhLnQuZFtjXS5leHBhbmRQcm94eUVsPXgsYS50LmRbY10uY29sbGFwc2VVbmxvYWRzPUssYS50LmRbY10uc2V0Q29sbGFwc2VQcm94eUluTG9vcD12LGEudC5kW2NdLnNldEV4cGFuZFByb3h5SW5Mb29wPUgsYS50LmRbY10uZmluZEV4cGFuZEluTG9vcD1yLGEudC5kW2NdLmFkZEV4cGFuZFRhZz11LGEudC5kW2NdLnNldElmcmFtZUFzc2V0VHlwZT13LGEudC5kW2NdLnByZWZlckNvbGxhcHNlPVEseSYmYS51LmIoeSxCW2NdLGIpLHgmJmEudS5iKHgsQltjXSxkKSwhMH19LG9uRmluZEFkOmZ1bmN0aW9uKGIsYyxlKXtpZihQKXJldHVybiExO3ZhciBkPWEudS5hKGwsYilbMF07aWYoZCYmQyYmIWRbRF18fGEuYS5idChkKSl7aWYoeilyZXR1cm4gYS50LmRbY109bmV3IGsoZCxjLGUpLGEudC5kW2NdLmNvbGxhcHNlZFF1ZXJ5PWwsYS50LmRbY10uZXhwYW5kZWRRdWVyeT1wLGEudC5kW2NdLnNlYXJjaGFibGVFbD1iLGEudC5kW2NdLmNoZWNrSGlkZGVuU3R5bGVzPUksYS50LmRbY10uY29sbGFwc2VVbmxvYWRzPUssYS50LmRbY10ubm9Mb29wVmFsaWRhdGlvbj1KLGEudC5kW2NdLmV4cGFuZFVubG9hZHM9RSxhLnQuZFtjXS5leHBhbmRlZFNlbGVjdG9yPXEsYS50LmRbY10uY29sbGFwc2VQcm94eUVsPXksYS50LmRbY10uZXhwYW5kUHJveHlFbD14LGEudC5kW2NdLmNvbGxhcHNlVW5sb2Fkcz1LLGEudC5kW2NdLnNldENvbGxhcHNlUHJveHlJbkxvb3A9dixhLnQuZFtjXS5zZXRFeHBhbmRQcm94eUluTG9vcD1ILGEudC5kW2NdLmZpbmRFeHBhbmRJbkxvb3A9cixhLnQuZFtjXS5hZGRFeHBhbmRUYWc9dSxhLnQuZFtjXS5zZXRJZnJhbWVBc3NldFR5cGU9dyxhLnQuZFtjXS5wcmVmZXJDb2xsYXBzZT1RLGQ7dmFyIGg9YS51LmEocCxiKVswXTtpZihoJiYoR3x8YS5hLmJ1KGgpKSlyZXR1cm4gYS50LmRbY109bmV3IGsoZCxjLGUpLGEudC5kW2NdLmNvbGxhcHNlZFF1ZXJ5PWwsYS50LmRbY10uZXhwYW5kZWRRdWVyeT1wLGEudC5kW2NdLnNlYXJjaGFibGVFbD1iLGEudC5kW2NdLmNoZWNrSGlkZGVuU3R5bGVzPUksYS50LmRbY10uY29sbGFwc2VVbmxvYWRzPUssYS50LmRbY10ubm9Mb29wVmFsaWRhdGlvbj1KLGEudC5kW2NdLmV4cGFuZFVubG9hZHM9RSxhLnQuZFtjXS5leHBhbmRlZFNlbGVjdG9yPXEsYS50LmRbY10uZXhwYW5kZWRFbD1oLGEudC5kW2NdLmNvbGxhcHNlUHJveHlFbD15LGEudC5kW2NdLmV4cGFuZFByb3h5RWw9eCxhLnQuZFtjXS5jb2xsYXBzZVVubG9hZHM9SyxhLnQuZFtjXS5zZXRDb2xsYXBzZVByb3h5SW5Mb29wPXYsYS50LmRbY10uc2V0RXhwYW5kUHJveHlJbkxvb3A9SCxhLnQuZFtjXS5maW5kRXhwYW5kSW5Mb29wPXIsYS50LmRbY10uYWRkRXhwYW5kVGFnPXUsYS50LmRbY10uc2V0SWZyYW1lQXNzZXRUeXBlPXcsYS50LmRbY10ucHJlZmVyQ29sbGFwc2U9USxkfX0sb25OZXdBZDpmdW5jdGlvbihiLGMpe2IuY29sbGFwc2VQcm94eUVsJiYhYi51c2VJc0ZvdW5kQWRLbm93biYmYS51LmIoYi5jb2xsYXBzZVByb3h5RWwsYyxjLmFhKX0sb25Mb29wOmZ1bmN0aW9uKGIpe2lmKGIuc3RvcExvb3ApcmV0dXJuITE7dmFyIGU9ITE7Yi5zZXRJZnJhbWVBc3NldFR5cGUmJihCW2IuYWROdW1dLmhhc0lmcmFtZUxpc3RlbmVyPSEwLGIuc2V0SWZyYW1lQXNzZXRUeXBlPSExKTtpZihiLmV4cGFuZFVubG9hZHMpe3ZhciBkPWEudS5hKGIuZXhwYW5kZWRRdWVyeSxiLnNlYXJjaGFibGVFbClbMF07Yi5leHBhbmRlZEVsPWR9Yi5maW5kRXhwYW5kSW5Mb29wJiYhYi5leHBhbmRlZEVsJiYoZD1hLnUuYShiLmV4cGFuZGVkUXVlcnksYi5zZWFyY2hhYmxlRWwpWzBdLGIuZXhwYW5kZWRFbD1kKTtpZihiLmV4cGFuZGVkRWwmJihiLm5vTG9vcFZhbGlkYXRpb258fGEuYS5idShiLmV4cGFuZGVkRWwpKSlpZihiLmNoZWNrSGlkZGVuU3R5bGVzJiYoYi5leHBhbmRlZEVsLnN0eWxlJiYiaGlkZGVuIj09PWIuZXhwYW5kZWRFbC5zdHlsZS52aXNpYmlsaXR5fHwibm9uZSI9PT1iLmV4cGFuZGVkRWwuc3R5bGUuZGlzcGxheSl8fCIwIj09PWEuYS5iZChiLmV4cGFuZGVkRWwsIm9wYWNpdHkiKSllPSExO2Vsc2UgaWYoYi5leHBhbmRlZFNlbGVjdG9yJiYhYS51LmEoYi5leHBhbmRlZFNlbGVjdG9yLGIuZXhwYW5kZWRFbClbMF0pZT0hMTtlbHNlIGlmKGU9ITAsYi5zZXRDb2xsYXBzZVByb3h5SW5Mb29wJiZiLmNvbGxhcHNlUHJveHlFbCYmIWIuY29sbGFwc2VQcm94eVNldCYmKGIuY29sbGFwc2VQcm94eVNldD1hLnUuYihiLmNvbGxhcHNlUHJveHlFbCxCW2IuYWROdW1dLGIuY29sbGFwc2VkRWwpKSxiLnNldEV4cGFuZFByb3h5SW5Mb29wJiZiLmV4cGFuZFByb3h5RWwmJiFiLmV4cGFuZFByb3h5U2V0JiYoYi5leHBhbmRQcm94eVNldD1hLnUuYihiLmV4cGFuZFByb3h5RWwsQltiLmFkTnVtXSxiLmV4cGFuZGVkRWwpKSxiLmFkZEV4cGFuZFRhZyYmYi5leHBhbmRlZEVsLnBhcmVudE5vZGUmJihkPUwmJkwuc3JjJiZMLnNyYy5yZXBsYWNlKC9tb2F0Q2xpZW50TGV2ZWw0PVteJl0qJi8sIm1vYXRDbGllbnRMZXZlbDQ9RXhwYW5kZWQmIikpKXJldHVybiBhLmEuY24oZCxiLmV4cGFuZGVkRWwucGFyZW50Tm9kZSksYi5hZGRFeHBhbmRUYWc9ITEsYi5zdG9wTG9vcD0hMCwhMTtiLnByZWZlckNvbGxhcHNlJiZhLmEuYnUoYi5jb2xsYXBzZWRFbCkmJihlPSExKTtlJiYhYi5leHBhbmRlZElzT3Blbj9mKGIuZXhwYW5kZWRFbCwiZGl2IixudWxsLGIuYWROdW0pOiFlJiZiLmV4cGFuZGVkSXNPcGVuJiYoYi5jb2xsYXBzZVVubG9hZHM/KGU9YS51LmEoYi5jb2xsYXBzZWRRdWVyeSxiLnNlYXJjaGFibGVFbClbMF0sYyhlLG51bGwsbnVsbCxiLmFkTnVtKSk6ZyhiLCEwKSl9fSl9O2EudC5mPWY7YS50Lmc9ZzthLnQuaD1jO2EudC5jPWZ1bmN0aW9uKGIsYyxkKXtkPWR8fHt9O3ZhciBnPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2QuaW5jbFNlYXJjaGFibGVFbCYmKGc9YS5hLmNnKGcpLGcucHVzaChiKSk7Zm9yKGI9MDtiPGcubGVuZ3RoO2IrKyl7dmFyIGY9Z1tiXTtpZihmLmlkLm1hdGNoKGMpJiYoZC5hbnlTaXplfHxhLmEuYnQoZikpKXJldHVybiBmfX07YS5zLmEoKX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGIsYyxlLGQsaCl7KCJyZW1vdmUiPT09aD9hLmwuZDphLmwuYykoYixjLGZ1bmN0aW9uKGMpe2M9Y3x8dGhpcy5ldmVudDt2YXIgZD1jLmN1cnJlbnRUYXJnZXR8fGI7dHJ5e3ZhciBoPWRbTV19Y2F0Y2goZyl7aD1kW01dfWlmKGg9QltoXSl7dmFyIGY7Zj1jO3ZhciBuPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Zj0tMSE9Zi50eXBlLmluZGV4T2YoInRvdWNoIikmJmYuY2hhbmdlZFRvdWNoZXMmJjA8Zi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg/e3g6cGFyc2VJbnQoZi5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLW4ubGVmdCwxMCkseTpwYXJzZUludChmLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFktbi50b3AsMTApfTp7eDpwYXJzZUludChmLmNsaWVudFgtbi5sZWZ0LDEwKSx5OnBhcnNlSW50KGYuY2xpZW50WS1uLnRvcCwxMCl9O2guYWo9Zi54O2guYWs9Zi55O2guZG18fChoLmNiPTI9PWEuZm9jdXMuZ2V0Rm9jdXNNZXRob2QoKT9oLmNvdW50ZXJzLmxheER3ZWxsLnRDdXI6aC5jb3VudGVycy5zdHJpY3REd2VsbC50Q3VyLGguZG09MSk7ZS5jYWxsKGIsYyxkLGgpfX0sImdlbm1vdXNlIil9ZnVuY3Rpb24gZChiLGUsZCl7ayhiLCJjbGljayIsdCxlLGQpO2soYiwibW91c2Vkb3duIixnLGUsZCk7VT9hLmMuZHkmJmsoYiwidG91Y2hzdGFydCIsYyxlLGQpOihrKGIsIm1vdXNlbW92ZSIsZixlLGQpLGsoYiwibW91c2VvdmVyIixsLGUsZCksayhiLCJtb3VzZW91dCIscCxlLGQpKX1mdW5jdGlvbiBmKGIsYyxlKXthLmsuYS56YXhzKCJtb3VzZUV2ZW50T25BZCIsZSk7Yj1ifHx3aW5kb3cuZXZlbnQ7Yz1iLnRhcmdldHx8Yi5zcmNFbGVtZW50O2lmKDEhPWUuYW8uc2tpbnx8IWEueC5hKGMsZS5hZENvbnRlbnQsYikpe2lmKCFVJiYoZS5haiE9PWUuYWx8fGUuYWshPT1lLmFtKSl7YS5yLmQoYixlKTthLnIuZihiLGUpO2Euci5nKGIsZSk7YS5yLmkoYixlKTthLnIuaChiLGUpO2Euci5iKGUpO2Euci5jKGUpO2Euci5lKGUpOzA9PT1lLmFyLmxlbmd0aCYmKGUuYWk9eShlKSk7aWYoMTAwPmUuYXIubGVuZ3RofHwxMDA+ZS5hcy5sZW5ndGh8fDEwMD5lLmF0Lmxlbmd0aCllLmFyLnB1c2goZS5haiksZS5hcy5wdXNoKGUuYWspLGUuYXQucHVzaChhLmEuYmIoZSkpO2UuYWw9ZS5hajtlLmFtPWUuYWt9ZS5haSE9PXkoZSkmJjE8ZS5hci5sZW5ndGgmJnEoZSwib25Nb3VzZU1vdmUiKX19ZnVuY3Rpb24gZyhiLGMsZSl7YS5rLmEuemF4cygibW91c2VFdmVudE9uQWQiLGUpO2I9Ynx8d2luZG93LmV2ZW50O2M9Yi50YXJnZXR8fGIuc3JjRWxlbWVudDsxPT1lLmFvLnNraW4mJmEueC5hKGMsZS5hZENvbnRlbnQsYil8fChjPXtlOjJ9LGMucT1lLmFxWzJdKyssYy54PWUuYWosYy55PWUuYWssYS55LmEoZSxjKSxhLmEuZWEoWyJmZWF0aGVyIiwiZGlzcGxheSIsInZpZGVvIl0sZS5hbykmJmEudC5tKGIudHlwZSxlLnpyKSl9ZnVuY3Rpb24gYyhiLGMsZSl7YS5rLmEuemF4cygibW91c2VFdmVudCIsZSk7YS5rLmEuemF4cygibW91c2VFdmVudE9uQWQiLGUpO2I9Ynx8d2luZG93LmV2ZW50O2M9Yi50YXJnZXR8fGIuc3JjRWxlbWVudDtpZigxIT1lLmFvLnNraW58fCFhLnguYShjLGUuYWRDb250ZW50LGIpKXtiPXtlOjIzfTtiLnE9ZS5hcVsyM10rKztiLng9ZS5hajtiLnk9ZS5haztjPShuZXcgQSkuZ2V0VGltZSgpO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGUuY3QpZS5jdD1jO2Vsc2V7dmFyIGQ9Yy1lLmN0O2UuY3Q9YztlLmN1PXcubWluKGUuY3UsZCl8fGR9Yi5iej12b2lkIDA7YS55LmEoZSxiKX19ZnVuY3Rpb24gYihiLGMsZCl7dmFyIGc7aWYoMj09Yi5hbnx8Yi5oYXNJZnJhbWVMaXN0ZW5lcilnPSEwO2lmKGcpe2c9Yy5lO3ZhciBmPWIuY2s7Zj09YS5yLmEuZi5hJiY2PT09Zz8oZShiLDApLGIuY2w9YS5hLmJiKGIpLGIuY2s9YS5yLmEuZi5iKTpmPT1hLnIuYS5mLmI/MjI9PT1nPyhoKGIsYyksZShiLGQpLGIuY2w9YS5hLmJiKGIpKTo3PT09ZyYmKDFlMzxhLmEuYmIoYiktYi5jbD8oY2xlYXJUaW1lb3V0KGIuY20pLGMuZT0yMixoKGIsYyksYi5jbj0wLGIuY2s9YS5yLmEuZi5hKTpiLmNrPWEuci5hLmYuYyk6Zj09YS5yLmEuZi5jJiYoNj09Zz8oMWUzPGEuYS5iYihiKS1iLmNsJiYoY2xlYXJUaW1lb3V0KGIuY20pLGIuY249MCxiLmNsPWEuYS5iYihiKSxlKGIsMCkpLGIuY2s9YS5yLmEuZi5iKToyMj09ZyYmKGgoYixjKSxiLmNrPWEuci5hLmYuYSxiLmNuPTApKX19ZnVuY3Rpb24gZShjLGUpe2lmKGEuZm9jdXMuY2hlY2tGb2N1cygpKXt2YXIgZD01PmMuY24/MWUzOjIqZSxoPXtlOjIyfTtjLmNtPWEubC5mKGZ1bmN0aW9uKCl7YihjLGgsZCl9LGQpfWVsc2UgYihjLHtlOjd9LDApfWZ1bmN0aW9uIGgoYixjKXtjLnE9Yi5hcVtjLmVdKys7Yy5tPWEuYS5iYihiKTtiLmNsPWMubTthLnkuYShiLGMpO2IuY24rK31mdW5jdGlvbiBsKGMsZSxkKXthLmsuYS56YXhzKCJtb3VzZUV2ZW50IixkKTthLmsuYS56YXhzKCJtb3VzZUV2ZW50T25BZCIsZCk7Yz1jfHx3aW5kb3cuZXZlbnQ7ZT1jLnRhcmdldHx8Yy5zcmNFbGVtZW50OzE9PWQuYW8uc2tpbiYmYS54LmEoZSxkLmFkQ29udGVudCxjKXx8KGEuci5kKGMsZCksYS5yLmYoYyxkKSxhLnIuZyhjLGQpLGEuci5pKGMsZCksYS5yLmgoYyxkKSxiKGQse2U6Nn0sMCksYS5hLmVhKFsiZmVhdGhlciIsImRpc3BsYXkiLCJ2aWRlbyJdLGQuYW8pJiZhLnQubShjLnR5cGUsZC56cikpfWZ1bmN0aW9uIHAoYyxlLGQpe2Euay5hLnpheHMoIm1vdXNlRXZlbnRPbkFkIixkKTtjPWN8fHdpbmRvdy5ldmVudDtlPWMudGFyZ2V0fHxjLnNyY0VsZW1lbnQ7MT09ZC5hby5za2luJiZhLnguYShlLGQuYWRDb250ZW50LGMpfHwoYS5yLmQoYyxkKSxhLnIuZihjLGQpLGEuci5nKGMsZCksYS5yLmkoYyxkKSxhLnIuaChjLGQpLGIoZCx7ZTo3fSwwKSl9ZnVuY3Rpb24gdChiLGMsZSl7YS5rLmEuemF4cygibW91c2VFdmVudCIsZSk7YS5rLmEuemF4cygibW91c2VFdmVudE9uQWQiLGUpO2I9Ynx8d2luZG93LmV2ZW50O2M9Yi50YXJnZXR8fGIuc3JjRWxlbWVudDsxPT1lLmFvLnNraW4mJmEueC5hKGMsZS5hZENvbnRlbnQsYil8fChiPXtlOjN9LGIucT1lLmFxWzNdKyssYi54PWUuYWosYi55PWUuYWssYS55LmEoZSxiKSl9ZnVuY3Rpb24gcShiLGMpe2IuYWk9eShiKTt2YXIgZT17ZToxfTtlLnE9Yi5hcVsxXSsrO2UueD1iLmFyLmpvaW4oImEiKTtlLnk9Yi5hcy5qb2luKCJhIik7Zm9yKHZhciBkPWEuYS5iYihiKSxoPWIuYXQsZz1bXSxmPTA7ZjxoLmxlbmd0aDtmKyspaXNOYU4oaFtmXSl8fGcucHVzaCh3LmFicyhoW2ZdLWQpKTtlLmM9Zy5qb2luKCJhIik7ZS5tPWQ7YS55LmEoYixlKTtiLmFyPVtdO2IuYXM9W107Yi5hdD1bXX1mdW5jdGlvbiB5KGIpe3JldHVybiB3LmZsb29yKGEuYS5iYihiKS8xZTMpfWEuaj17fTthLmouZD1mdW5jdGlvbihiKXtpZihhLmMuZHgpe2Euay5hLmF6c3goImFkS2lsbGVkIixhLmouZSx7b25jZTohMCxjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGIuenI9PWEuenJ9fSk7Yi5tb3VzZUV2ZW50RWxlbWVudHN8fChiLm1vdXNlRXZlbnRFbGVtZW50cz1bXSk7dmFyIGM9Yi5hYTthLmouYihiLGMpO2IubW91c2VFdmVudEVsZW1lbnRzLnB1c2goYyl9fTthLmouYj1mdW5jdGlvbihhLGIpe2lmKGEpe3ZhciBjPWJ8fGEuYWE7YyYmZChjLGEuenIpfX07YS5qLmE9ZnVuY3Rpb24oYSxiKXtpZihhKXt2YXIgYz1ifHxhLmFhO2MmJmQoYyxhLnpyLCJyZW1vdmUiKX19O2Euai5mPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYyBpbiBCKUIuaGFzT3duUHJvcGVydHkoYykmJihiPUJbY10pJiYoYS5yLmcoe3R5cGU6InNjb29wZXIifSxiKSxhLnIuaSh7dHlwZToic2Nvb3BlciJ9LGIpLGEuci5oKHt0eXBlOiJzY29vcGVyIn0sYiksMTxiLmFyLmxlbmd0aCYmYi5haSE9PXkoYikmJnEoYiwic2Nvb3BlciIpKX07YS5qLmM9ZnVuY3Rpb24oYixjKXtpZighY3x8IWJ8fCJudW1iZXIiPT09dHlwZW9mIGNbTV0pcmV0dXJuITE7IWIuaGFzSWZyYW1lTGlzdGVuZXImJmMudGFnTmFtZSYmImlmcmFtZSI9PT1jLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmKGIuaGFzSWZyYW1lTGlzdGVuZXI9ITApOyFiLmhhc05vbklmcmFtZUxpc3RlbmVyJiZjLnRhZ05hbWUmJiJpZnJhbWUiIT09Yy50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJihiLmhhc05vbklmcmFtZUxpc3RlbmVyPSEwLGIuYW49YS5kLmQoYykpO2NbTV09Yi56cjthLmouYihiLGMpO2IubW91c2VFdmVudEVsZW1lbnRzfHwoYi5tb3VzZUV2ZW50RWxlbWVudHM9W10pO2IubW91c2VFdmVudEVsZW1lbnRzLnB1c2goYyk7cmV0dXJuIGIucHJveHlUcmFja2luZ0VuYWJsZWQ9ITB9O2Euai5lPWZ1bmN0aW9uKGIpe2EuYS5mb3JFYWNoKGIubW91c2VFdmVudEVsZW1lbnRzLGZ1bmN0aW9uKGMpe3RyeXthLmouYShiLGMpLGNbTV09bnVsbH1jYXRjaChlKXt9fSl9fSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYixjLGUpe3JldHVybiBlP25ldyBhLnouaihiLnBhcmVudE5vZGUsYyk6bmV3IGEuei5qKGIsYyl9ZnVuY3Rpb24gZChhLGIpe2lmKCFhKXJldHVybiExO3ZhciBjPSJudW1iZXIiPT10eXBlb2YgYS56cixlLGQ7Yz8oZT1hLmFhLGQ9YS5fY2FsY1ZpZGVvQmFzZWRPbkNvbnRhaW5lcik6ZT1hO2U9ayhlLGIsZCk7ZD1lLmhlaWdodDt2YXIgaD1lLndpZHRoO2MmJihhLkFEX1JFQ1Q9ZSk7Yz1lLmNhbGNBcmVhKCk7aWYoMD09PWMpcmV0dXJue2FyZWE6Yyx2aXNpYmxlQXJlYTowLHBlcmN2OjB9O3ZhciBmPWcoZSksbD1mLnZpc2libGVSZWN0LmNhbGNBcmVhKCkscD1sL2MsdDthOnt2YXIgcT1mLmN1bXVsUmVjdCx2PWYuY3VtdWxSZWN0LmdldFZpZXdwb3J0UmVjdCgpO2lmKDA+cS50b3AmJjA8cS5ib3R0b20pdD0tcS50b3A7ZWxzZSBpZigwPD1xLnRvcCYmcS50b3A8PXYuaGVpZ2h0KXQ9MDtlbHNle3Q9e3lNaW46LTEseU1heDotMX07YnJlYWsgYX1pZigwPD1xLmJvdHRvbSYmcS5ib3R0b208PXYuaGVpZ2h0KXE9cS5oZWlnaHQ7ZWxzZSBpZihxLmJvdHRvbT52LmhlaWdodCYmcS50b3A8di5oZWlnaHQpcT1xLmhlaWdodC0ocS5ib3R0b20tdi5oZWlnaHQpO2Vsc2V7dD17eU1pbjotMSx5TWF4Oi0xfTticmVhayBhfXQ9e3lNaW46dCx5TWF4OnF9fXJldHVybnthcmVhOmMsdmlzaWJsZUFyZWE6bCx2aXNpYmxlUmVjdDpmLnZpc2libGVSZWN0LGN1bXVsUmVjdDpmLmN1bXVsUmVjdCxwZXJjdjpwLHlNaW5NYXg6dCxlbEdlbzp7ZWxIZWlnaHQ6ZCxlbFdpZHRoOmgsZm9sZFRvcDpmLmN1bXVsUmVjdC50b3AsdG90YWxBcmVhOmYucGFyZW50QXJlYX0scmVjdDplLnJlY3R9fWZ1bmN0aW9uIGYoYSxiKXtmb3IodmFyIGM9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKWMucHVzaChhKGJbZV0pKTtyZXR1cm4gY31mdW5jdGlvbiBnKGIpe3ZhciBjLGU9W10sZD1hLmEuZGcoYi5lbCxiLndpbixiJiZiLmVsJiZiLmVsLl9tb2F0UGFyZW50Q291bnQpO2QmJihlPWYoZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhLnouaihiKX0sZCkpO2UudW5zaGlmdChiKTtkPWUubGVuZ3RoO2I9bmV3IGEuei5qKGIuZWwsYS5jLmUpO2Zvcih2YXIgaD0wO2g8ZDtoKyspe3ZhciBnPWVbaF07MD09PWg/Yz1nOihjLmNoYW5nZVJlZmVyZW5jZUZyYW1lKGcpLGIuY2hhbmdlUmVmZXJlbmNlRnJhbWUoZykpO2c9Zy5nZXRWaWV3cG9ydFJlY3QoaDxkLTE/ZVtoKzFdOiExKTtjPWEuei5tKGMsZyl9cmV0dXJue3Zpc2libGVSZWN0OmMsY3VtdWxSZWN0OmIscGFyZW50QXJlYTplW2UubGVuZ3RoLTFdLmNhbGNBcmVhKCl9fWZ1bmN0aW9uIGMoYSxiLGMsZSl7YT13Lm1heChhLGMpO2I9dy5taW4oYixlKTtyZXR1cm4gYj5hP1thLGJdOlswLDBdfWZ1bmN0aW9uIGIoYil7ZnVuY3Rpb24gYyhhLGIpe3JldHVybnt0b3A6dy5tYXgoYS50b3AsYi50b3ApLHJpZ2h0OncubWF4KGEucmlnaHQsYi5yaWdodCksYm90dG9tOncubWluKGEuYm90dG9tLGIuYm90dG9tKSxsZWZ0OncubWluKGEubGVmdCxiLmxlZnQpfX12YXIgZSxkLGg7ZT1bXTtkPVtdO2lmKCFhLmEuZihiKXx8MD09PWIubGVuZ3RoKXJldHVybiExO2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYSl7YS5jdW11bFJlY3QmJmEudmlzaWJsZVJlY3QmJihkLnB1c2goYS5jdW11bFJlY3QpLGUucHVzaChhLnZpc2libGVSZWN0KSl9KTtiPWEuYS5yZWR1Y2UoZCxjKTtoPWEuYS5yZWR1Y2UoZSxjKTtyZXR1cm57ZWxSZWN0OmIsdmlzaWJsZVJlY3Q6aH19ZnVuY3Rpb24gZShiKXtyZXR1cm4gYiYmYi5ub2RlTmFtZSYmIm1hcCI9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/ITA6KGI9YS5hLmNiKGIpKSYmKDE+PWIud2lkdGh8fDE+PWIuaGVpZ2h0KT8hMDohMX1mdW5jdGlvbiBoKGIpe3JldHVybiBiPzA9PT1hLmEuZGUoe2FhOmJ9LCEwLCEwKT8hMDowPT09YS5hLmRkKGIsITApOiExfWZ1bmN0aW9uIGwoYixjLGcsZixsKXtmdW5jdGlvbiBwKGEpe3JldHVybihhPWEuY3VtdWxSZWN0KT8xMDA8PWEud2lkdGgmJjUwPD1hLmhlaWdodDohMX12YXIgaz17SUZSQU1FOiEwLFZJREVPOiEwLE9CSkVDVDohMCxFTUJFRDohMCxJTUc6ITB9LHQ9ZChiKTtpZihoKGIpfHwhcCh0KSlyZXR1cm4hMTt2YXIgcT1bXSxFPUJbbF07Zy5lbGVtZW50c0Zyb21Qb2ludCYmIUUuZWxlbWVudHNGcm9tUG9pbnRDYWNoZT8oYz1nLmVsZW1lbnRzRnJvbVBvaW50KGMubVswXSxjLm1bMV0pfHxbXSxFLmVsZW1lbnRzRnJvbVBvaW50Q2FjaGU9YyxxPXEuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMpKSk6KGM9YS5hLmN4KGMubVswXSxjLm1bMV0sZyksRS5lbGVtZW50c0Zyb21Qb2ludENhY2hlJiYocT1xLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChFLmVsZW1lbnRzRnJvbVBvaW50Q2FjaGUpKSksYyYmKHE9W2NdLmNvbmNhdChxKSkpO0U9cS5pbmRleE9mKGIpO2lmKC0xPT1FKXJldHVybiExO3E9cS5zbGljZSgwLEUpO2ZvcihFPTA7RTxxLmxlbmd0aDtFKyspaWYoKGc9KGM9cVtFXSkmJmMhPT1mJiZjW01dIT09bCYma1tjLm5vZGVOYW1lXSYmIWEuYS5jcihjLGIpJiYhYS5hLmNyKGIsYykmJiFlKGMpJiYhaChjKSkmJihjPWQoYykpJiZwKGMpJiZ0JiZjJiYuNTw9YS56LnEodC5jdW11bFJlY3QsYy5jdW11bFJlY3QpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHAoYSl7dmFyIGI9LjAxKmEud2lkdGgsYz0uMDEqYS5oZWlnaHQ7cmV0dXJue3RsOlthLmxlZnQrYixhLnRvcCtjXSxtOlthLmxlZnQrKGEucmlnaHQtYS5sZWZ0KS8yLGEudG9wKyhhLmJvdHRvbS1hLnRvcCkvMl0sYnI6W2EucmlnaHQtYixhLmJvdHRvbS1jXX19ZnVuY3Rpb24gdChiLGMpe3ZhciBlPVtdLGQ9YS5nLmgoYik7ZCYmKGU9ZihmdW5jdGlvbihjKXt2YXIgZT1nKG5ldyBhLnouaihiKSkudmlzaWJsZVJlY3Q7bmV3IGEuei5qKGMpO3JldHVybntyZWN0OmUsZnJhbWU6Yyxkb2M6Yy5vd25lckRvY3VtZW50fX0sZCkpO2UudW5zaGlmdCh7cmVjdDpnKG5ldyBhLnouaihiKSkudmlzaWJsZVJlY3QsZnJhbWU6Yixkb2M6Yi5vd25lckRvY3VtZW50fSk7Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyl7dmFyIGg9cChlW2RdLnJlY3QpLGs9ITE7aWYoMCE9aC50bFswXXx8MCE9aC50bFsxXXx8MCE9aC5iclswXXx8MCE9aC5iclsxXSlrPSEwO2lmKGsmJmwoYixoLGVbZF0uZG9jLGVbZF0uZnJhbWUsYykpcmV0dXJuITB9cmV0dXJuITF9YS56PXt9O3ZhciBxPWEuYy5jLHk9e307YS56LmE9LjU7YS56LmI9LjM7YS56LmM9Ljk4O2Euei5kPXZvaWQgMDthLnouZT1mdW5jdGlvbihiLGMpe2M9Y3x8ITE7cmV0dXJuIGZ1bmN0aW9uKGUsaCl7dmFyIGc9ZS5hby5za2luP2Euei5mKGUsaCk6ZChlLGgpO2cuaXNWaXNpYmxlPWM/Zy5wZXJjdj5iOmcucGVyY3Y+PWI7Zy5lbEdlbyYmKGcuZWxHZW8udGhyZXNob2xkPWIpO3JldHVybiBnfX07YS56LmY9ZnVuY3Rpb24oYyxlKXtmdW5jdGlvbiBoKCl7aWYoYy5pc011bHRpcGFydEFkJiZjLm11bHRpcGFydENvbXBvbmVudHMmJjA8Yy5tdWx0aXBhcnRDb21wb25lbnRzLmxlbmd0aCl7Zm9yKHZhciBhLGI9MCxnPTA7ZzxjLm11bHRpcGFydENvbXBvbmVudHMubGVuZ3RoO2crKyl7dmFyIGY9ZChjLm11bHRpcGFydENvbXBvbmVudHNbZ10sZSk7Zi52aXNpYmxlQXJlYT49YiYmKGI9Zi52aXNpYmxlQXJlYSxhPWMubXVsdGlwYXJ0Q29tcG9uZW50c1tnXSl9cmV0dXJuIGQoYSxlKX19ZnVuY3Rpb24gZygpe2lmKGMuaXNDb21wb3NpdGVBZCYmYy5jb21wb25lbnRzJiYxPGMuY29tcG9uZW50cy5sZW5ndGgpe2Zvcih2YXIgaD17YXJlYTowLHZpc2libGVBcmVhOjAscGVyY3Y6MCx2aXNpYmxlUmVjdDohMSxjdW11bFJlY3Q6ITEseU1pbk1heDohMSxlbEdlbzohMSxyZWN0OiExLGNvbXBvbmVudFJlc3VsdHM6W119LGYsbD0wO2w8Yy5jb21wb25lbnRzLmxlbmd0aDtsKyspZj1kKGMuY29tcG9uZW50c1tsXSxlKSxoLmFyZWErPWYuYXJlYSxoLnZpc2libGVBcmVhKz1mLnZpc2libGVBcmVhLGguY29tcG9uZW50UmVzdWx0cy5wdXNoKGYpO2gucGVyY3Y9aC52aXNpYmxlQXJlYS9oLmFyZWE7Yy5jb21wb3NpdGVBZEFyZWFQeD1oLmFyZWE7KGY9YihoLmNvbXBvbmVudFJlc3VsdHMpKSYmInN0cmljdCI9PT1hLncuYihjLnpyKSYmYS5rLmEuemF4cygicmVjdHNBdmFpbGFibGUiLGMuenIsZi5lbFJlY3QsZi52aXNpYmxlUmVjdCl9ZWxzZSBoPWQoYyxlKTtyZXR1cm4gaH1jLnZpZXdhYmlsaXR5TWV0aG9kLnN0cmljdHx8KGMudmlld2FiaWxpdHlNZXRob2Quc3RyaWN0PTEpO2lmKDE9PWMuYW8uc2tpbil7dmFyIGY9e30sbD1hLmMuZS5zY3JvbGxZfHxhLmMuZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO2lmKCJ3aWR0aCI9PWEueC5iJiZhLnguYzw9Yy5hZENvbnRlbnQmJjQ1PGx8fCFhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKSlyZXR1cm4gZi5pc1Zpc2libGU9ITEsZi5pc0Z1bGx5VmlzaWJsZT0hMSxmLnBlcmN2PTAsZjtmLmlzVmlzaWJsZT0hMDtmLmlzRnVsbHlWaXNpYmxlPSEwO2YuaXNEZW50c3VWaXNpYmxlPSEwO2YucGVyY3Y9MTthLmsuYS56YXhzKCJhZEVkZ2VzVmlld1N0YXR1cyIsYy56cix7dG9wTGVmdDohMCx0b3BSaWdodDohMCxib3R0b21MZWZ0OiEwLGJvdHRvbVJpZ2h0OiEwfSk7cmV0dXJuIGZ9Zj1jLmlzTXVsdGlwYXJ0QWQ/aChjLGUpOmMuaXNDb21wb3NpdGVBZD9nKGMsZSk6ZChjLGUpOyJzdHJpY3QiPT09YS53LmIoYy56cikmJmEuYy5jJiYhYS5jLmNlKCkmJmEuay5hLnpheHMoInJlY3RzQXZhaWxhYmxlIixjLnpyLGYuY3VtdWxSZWN0LGYudmlzaWJsZVJlY3QpO3ZhciBsPWEuei5nKGYsYykscD1hLnouYztmLmlzVmlzaWJsZT1mLnBlcmN2Pj1sO2YuaXNGdWxseVZpc2libGU9Zi5wZXJjdj49cDtmLmVsR2VvJiYoZi5lbEdlby50aHJlc2hvbGQ9bCk7Yy52aWRlb0lzRnVsbHNjcmVlbiYmMDxmLnBlcmN2JiYoZi5pc1Zpc2libGU9ITApOy44PD1mLnBlcmN2JiYoZi5pc0RlbnRzdVZpc2libGU9ITApO2Euei5kP2YucGVyY3Y+YS56LmQmJihhLnouZD1mLnBlcmN2KTphLnouZD1mLnBlcmN2O2MuQURfUkVDVD1mJiZmLnJlY3Q7cmV0dXJuIGZ9O2Euei5nPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuYWEuYShiLmFyZWEpPyhjLnZpZXdzdGF0c3x8KGMudmlld3N0YXRzPXt9KSxjLnZpZXdzdGF0cy5pc0JpZ0FkPSEwLGEuei5iKTphLnouYX07YS56Lmg9ZnVuY3Rpb24oKXtyZXR1cm4gcX07YS56Lmk9ZDthLnouaz1rO2Euei5sPWEuYy5yO2Euei5qPWZ1bmN0aW9uKGIsYyxlLGQpe3RyeXt0aGlzLnJlY3Q9ZXx8Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl8fHt9fWNhdGNoKGgpe3RoaXMucmVjdD1lfHxiJiZ7dG9wOmIub2Zmc2V0VG9wLGxlZnQ6Yi5vZmZzZXRMZWZ0LHdpZHRoOmIub2Zmc2V0V2lkdGgsaGVpZ2h0OmIub2Zmc2V0SGVpZ2h0LGJvdHRvbTpiLm9mZnNldFRvcCtiLm9mZnNldEhlaWdodCxyaWdodDpiLm9mZnNldExlZnQrYi5vZmZzZXRXaWR0aH18fHt9fWU9ImxlZnQgcmlnaHQgdG9wIGJvdHRvbSB3aWR0aCBoZWlnaHQiLnNwbGl0KCIgIik7Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyl7dmFyIGc9ZVtkXTt0aGlzW2ddPXRoaXMucmVjdFtnXX1iJiZiLkNMSVBDSEVDS0lOR1RBUkdFVCYmYi5DTElQQ0hFQ0tJTkdUQVJHRVQuc3R5bGUmJiJhYnNvbHV0ZSI9PT1iLkNMSVBDSEVDS0lOR1RBUkdFVC5zdHlsZS5wb3NpdGlvbiYmKGU9YS5hLmN0KGIuQ0xJUENIRUNLSU5HVEFSR0VULnN0eWxlLmNsaXApKSYmKHRoaXMucmlnaHQ9dGhpcy5sZWZ0K2UucmlnaHQsdGhpcy5sZWZ0Kz1lLmxlZnQsdGhpcy5ib3R0b209dGhpcy50b3ArZS5ib3R0b20sdGhpcy50b3ArPWUudG9wKTt0aGlzLndpZHRoPXRoaXMucmlnaHQtdGhpcy5sZWZ0O3RoaXMuaGVpZ2h0PXRoaXMuYm90dG9tLXRoaXMudG9wO3RoaXMuZWw9Yjt0aGlzLndpbj1jfHxiJiZhLmEuYmUoYik7dGhpcy5jaGFuZ2VSZWZlcmVuY2VGcmFtZT1mdW5jdGlvbihhKXt0aGlzLmxlZnQrPWEubGVmdDt0aGlzLnJpZ2h0Kz1hLmxlZnQ7dGhpcy50b3ArPWEudG9wO3RoaXMuYm90dG9tKz1hLnRvcH07dGhpcy5jYWxjQXJlYT1mdW5jdGlvbigpe3JldHVybih0aGlzLnJpZ2h0LXRoaXMubGVmdCkqKHRoaXMuYm90dG9tLXRoaXMudG9wKX07dGhpcy5nZXRWaWV3cG9ydFJlY3Q9ZnVuY3Rpb24oYil7dmFyIGM9YS5jLnIodGhpcy53aW4pO2ImJihiLndpZHRoPGMud2lkdGgmJihjLndpZHRoPWIud2lkdGgsYy5yaWdodD1jLmxlZnQrYy53aWR0aCksYi5oZWlnaHQ8Yy5oZWlnaHQmJihjLmhlaWdodD1iLmhlaWdodCxjLmJvdHRvbT1jLnRvcCtjLmhlaWdodCkpO3JldHVybiBjfX07YS56Lm49ZnVuY3Rpb24oYSxiLGMpe3JldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGE/ITE6e2xlZnQ6TnVtYmVyKGIpK051bWJlcihhLmxlZnQpLHJpZ2h0Ok51bWJlcihiKStOdW1iZXIoYS5yaWdodCksdG9wOk51bWJlcihjKStOdW1iZXIoYS50b3ApLGJvdHRvbTpOdW1iZXIoYykrTnVtYmVyKGEuYm90dG9tKX19O2Euei5tPWZ1bmN0aW9uKGIsZSl7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYnx8InVuZGVmaW5lZCI9PT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgZD1jKGIubGVmdCxiLnJpZ2h0LGUubGVmdCxlLnJpZ2h0KSxoPWMoYi50b3AsYi5ib3R0b20sZS50b3AsZS5ib3R0b20pO3JldHVybiBuZXcgYS56Lmoodm9pZCAwLHZvaWQgMCx7bGVmdDpkWzBdLHJpZ2h0OmRbMV0sdG9wOmhbMF0sYm90dG9tOmhbMV19KX07YS56Lm89ZnVuY3Rpb24oYixjLGUsZCl7aWYoIWJ8fCFjfHwhZSlyZXR1cm4hMTtiPWEuei5pKGIpO2lmKCFiKXJldHVybiExO2U9ZHx8YS56Lm0oYyxlKTtpZighZSlyZXR1cm4hMTtkPWEuei5uKGIudmlzaWJsZVJlY3QsYy5sZWZ0LGMudG9wKTtyZXR1cm4gZD8oZT1hLnoubShkLGUpKT97ZWxlbWVudFJlY3Q6YS56Lm4oYi5jdW11bFJlY3QsYy5sZWZ0LGMudG9wKSx2aXNpYmxlUmVjdDplLGFyZWE6Yi5hcmVhLGNhbGNWaXNpYmxlUGVyY3Y6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy52aXNpYmxlUmVjdC5yaWdodC10aGlzLnZpc2libGVSZWN0LmxlZnQpKih0aGlzLnZpc2libGVSZWN0LmJvdHRvbS10aGlzLnZpc2libGVSZWN0LnRvcCkvdGhpcy5hcmVhfX06ITE6ITF9O2Euei5wPWZ1bmN0aW9uKGEsYil7Ynx8KGI9d2luZG93KTt0cnl7dmFyIGM9Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT1iLmRvY3VtZW50LmJvZHk7cmV0dXJuImxlZnQiPT09YT9iLnBhZ2VYT2Zmc2V0fHxjJiZjLnNjcm9sbExlZnR8fGUmJmUuc2Nyb2xsTGVmdDpiLnBhZ2VZT2Zmc2V0fHxjJiZjLnNjcm9sbFRvcHx8ZSYmZS5zY3JvbGxUb3B9Y2F0Y2goZCl7cmV0dXJuITF9fTthLnouaT1kO2Euei5yPWZ1bmN0aW9uKGIpe3ZhciBjPWIuYWE7Yj1iLnpyO2lmKGMpe2lmKGEuYy5xKWM9dChjLGIpO2Vsc2UgdmFyIGU9ZyhuZXcgYS56LmooYykpLnZpc2libGVSZWN0LGU9cChlKSxjPWwoYyxlLGEuYy5lLmRvY3VtZW50LG51bGwsYik7cmV0dXJuIGN9fTthLnoucz1mdW5jdGlvbihhKXtyZXR1cm4gYT8oYS5yaWdodC1hLmxlZnQpKihhLmJvdHRvbS1hLnRvcCk6ITF9O2Euei50PWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuYS5kYihiKXx8InN0cmluZyI9PT10eXBlb2YgYn1yZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBiJiZjKGIubGVmdCkmJmMoYi5yaWdodCkmJmMoYi50b3ApJiZjKGIuYm90dG9tKT8hMDohMX07YS56LnE9ZnVuY3Rpb24oYixjKXtpZighYS56LnQoYil8fCFhLnoudChjKSlyZXR1cm4hMTt2YXIgZT1hLnoubShiLGMpO2lmKCFlKXJldHVybiExO3ZhciBkPWEuei5zKGIpO3JldHVybiBlLmNhbGNBcmVhKCkvZH07YS5rLmEuYXpzeCgiYWRLaWxsZWQiLGZ1bmN0aW9uKGEpe2EmJiFhLmVwJiZkZWxldGUgeVthLnpyXX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYSl7dmFyIGM9MCxkO3JldHVybiBmdW5jdGlvbigpe3ZhciBnPShuZXcgQSkuZ2V0VGltZSgpOzE1MDxnLWMmJihkPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLGM9Zyk7cmV0dXJuIGR9fWZ1bmN0aW9uIGQoYil7ZnVuY3Rpb24gYyhhKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLm92ZXJyaWRlVmlld01ldGhvZCYmKGEudmlld2FiaWxpdHlNZXRob2RbeV09Yi5vdmVycmlkZVZpZXdNZXRob2QpO3JldHVybiBtKGEpfXZhciBkPWIuaXNWaXNpYmxlRm4sZz1iLmlzTWVhc3VyYWJsZUZuLHA9Yi5wYXVzZUNoZWNraW5nRm4saz1iLmNhcmVGb2MscT1iLnFzS2V5cyx5PWIuY291bnRlckxhYmVsLHg9eTthLmMuYW0oKTt2YXIgbj1bXSxtPWQsST0wLEc9MCxKPTAsQz0wLHo9MCxLPTAsRT0wLFA9MDsobmV3IEEpLmdldFRpbWUoKTt2YXIgdj0hMSxIPSExLHI9ITEsdT0hMSxHYSxRLEIsVCxsYT0wLEQ9MCxGPSExLE09ITEsTD0wLE89MCx5YT0wLFI9ITEsSGE9ITEsZWE9ITEsVT1hLmMuYyxtYSx1YTtpZigwPT09cSl2YXIgWT0iYXMiLFo9ImFnIixOPSJhbiIsYWE9ImNrIixmYT0ia3ciLFY9ImFoIixnYT0iYWoiLFc9InBnIixYPSJwZiIsaGE9ImdpIixiYT0iZ2YiLGNhPSJpeCIsaWE9ImdnIixkYT0iZXoiLEY9ITA7ZWxzZSAxPT09cT8oWT0iY2MiLFo9ImJ3IixOPSJieCIsYWE9ImNpIixmYT0ianoiLFY9ImJ1IixnYT0iZGoiKToyPT09cT8oWT0iY2ciLFo9ImNlIixOPSJjZiIsYWE9ImNqIixmYT0idHMiLFY9ImFoIixnYT0iZGsiLGhhPSJnaiIsYmE9ImdiIixjYT0iaWciLGlhPSJnZSIsZGE9ImV6Iik6Mz09PXE/KFk9ImNnIixaPSJjZSIsTj0iY2YiLGFhPSJjaiIsZmE9InRzIixWPSJhaCIsZ2E9ImRrIixoYT0iZ2kiLGJhPSJnZiIsY2E9Iml4IixpYT0iZ2ciLGRhPSJleiIpOjU9PT1xPyhZPSJhYSIsWj0iYWQiLE49ImNuIixhYT0iY28iLGZhPSJjcCIsVj0iYWgiLGdhPSJjcSIsaGE9ImduIixiYT0iZ2siLGNhPSJpayIsaWE9ImdsIixkYT0iZXoiKTo2PT09KCJudW1iZXIiPT09dHlwZW9mIHE/cTpxLnR5cGUpJiYoWT1xLm90c0tleSxaPXEuaXZ0S2V5LE49cS5sYXN0aXZ0S2V5LGFhPXEuaXZ0QXRPdHNLZXksZmE9cS50aW1lVG9WaWV3U2VuZEtleSxWPXEudGltZVRvVmlld0Fza0tleSxnYT1xLnZpc09uTG9hZEtleSxoYT1xLmZ1bGx5SXZ0T3RzS2V5LGJhPXEuZnVsbHlJdnRLZXksY2E9cS5tYXhmdWxseUl2dEtleSxpYT1xLmxhc3RGdWxseUl2dEtleSxkYT1xLndhc1BhcnRpYWxseUludmlld0tleSk7dGhpcy5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB4fTt0aGlzLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGIpe3ZhciBjPSExO2EuYS5mb3JFYWNoKG4sZnVuY3Rpb24oYSl7aWYoYT09PWIpcmV0dXJuIGM9ITAsITF9KTtjfHxuLnB1c2goYil9O3RoaXMucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGM9bi5sZW5ndGg7YjxjO2IrKyl7dmFyIGU9ITEsZD0hMSxoO2ZvcihoIGluIG5bYl0paWYoZHx8KGQ9ITApLG5bYl1baF0hPT1hW2hdKXtlPSEwO2JyZWFrfWQmJiFlJiZuLnNwbGljZShiLDEpfX07dGhpcy5oYWRPVFM9ZnVuY3Rpb24oKXtyZXR1cm4gcn07dGhpcy5oYWRGdWxsT1RTPWZ1bmN0aW9uKCl7cmV0dXJuIHV9O3RoaXMuaGFkRklUPWZ1bmN0aW9uKCl7cmV0dXJuIDA8R307dGhpcy5oYWRWaWRlbzJTZWNPVFM9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIF9oYWRWaWRlbzJTZWNPdHMmJl9oYWRWaWRlbzJTZWNPdHN9O3RoaXMuaGFkRGVudHN1VmlkZW9PVFM9ZnVuY3Rpb24oKXtyZXR1cm4hMX07dGhpcy5oYWREZW50c3VEaXNwbGF5T1RTPWZ1bmN0aW9uKCl7cmV0dXJuIFJ9O3RoaXMuZ2V0SW5WaWV3VGltZT1mdW5jdGlvbigpe3JldHVybiBJfTt0aGlzLmdldEZ1bGx5SW5WaWV3VGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuLjk4fTt0aGlzLmdldExhc3RJbnZpZXdQZXJjZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEx9O3RoaXMuZ2V0TGFzdEludmlld1BlcmNlbnRXaXRoVGhyZXNob2xkQ2FwPWZ1bmN0aW9uKCl7cmV0dXJuLjk4PD1MPzE6TH07dGhpcy5nZXRDYXJlQWJvdXRGb2N1cz1mdW5jdGlvbigpe3JldHVybiBrfTt0aGlzLmdldFBhdXNlQ2hlY2tpbmdGbj1mdW5jdGlvbigpe3JldHVybiBwfTt0aGlzLnZpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdn07dGhpcy5mdWxseVZpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gSH07dGhpcy53YXNQYXJ0aWFsbHlJbnZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4gTX07dGhpcy5nZXRGdWxsSW52aWV3VGltZVRvdGFsPWZ1bmN0aW9uKCl7cmV0dXJuIEd9O3RoaXMuZ2V0TWF4aW11bUNvbnRpbnVvdXNJblZpZXdUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHcubWF4KHosSyl9O3RoaXMuZ2V0TWF4aW11bUNvbnRpbnVvdXNGdWxseUluVmlld1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdy5tYXgoUCxFKX07dGhpcy5nZXREZW50c3VJblZpZXdUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIE99O3RoaXMuZ2V0RGVudHN1QXVkaWJsZUFuZFZpc2libGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O3RoaXMuaXNBZE1lYXN1cmFibGU9ZnVuY3Rpb24oYSl7dmFyIGI9ImZ1bmN0aW9uIj09PXR5cGVvZiBnJiZnKGEpO2EmJmEuaXNNZWFzdXJhYmlsaXR5RGlzYWJsZWQoKSYmKGI9ITEpO3JldHVybiBifTt0aGlzLmFkU3RhcnRlZE9uU2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIFR9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKGIsZCxoKXtpZih1YT09PWgpcmV0dXJuITE7dWE9aDtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZyYmZyhiKTtiJiZiLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkmJihoPSExKTtpZighaClyZXR1cm4hMTt2YXIgbT1JfHwwLEo9R3x8MDtoPSExO3ZhciBDPWMoYik7Qy5yZWN0JiYoYi5lbGVtZW50UmVjdD1DLnJlY3QsYi5jdXJyZW50V2lkdGg9Yi5lbGVtZW50UmVjdC5yaWdodC1iLmVsZW1lbnRSZWN0LmxlZnQsYi5jdXJyZW50SGVpZ2h0PWIuZWxlbWVudFJlY3QuYm90dG9tLWIuZWxlbWVudFJlY3QudG9wKTtiLnZpZXdhYmlsaXR5UGVyY2VudFt4XT1hLmEuZGIoQy5wZXJjdik/dy5yb3VuZCgxMDAqQy5wZXJjdik6Ii0iOyJudW1iZXIiPT09dHlwZW9mIEMuYXJlYSYmKGIuQURBUkVBPUMuYXJlYSk7dmFyIHk9Qy5pc1Zpc2libGUsQT1DLmlzRnVsbHlWaXNpYmxlLEQ9Qy5pc0RlbnRzdVZpc2libGUsTj1DLnBlcmN2JiYwPEMucGVyY3Y7TD1DLnBlcmN2OyFtJiZDLnBlcmN2JiZhLmsuYS56YXhzKCJhZEVudGVyc1ZpZXciLGIpO3ZhciBTPXAoYiksUz0oIWt8fGEuYWMuZShiKSkmJiFTO2Euay5hLnpheHMoImFkQ2hlY2tpbmdTdGF0ZSIsYix4LFMpO3k9eSYmUztBPUEmJlM7Tj1OJiZTO0EmJmEuay5hLnpheHMoImFkRnVsbHlWaXNpYmxlIixiLHgpO2VhPUQmJlM7IU0mJk4mJihNPSEwKTtpZih5JiZ2KUkrPWQseis9ZDtlbHNlIGlmKHl8fHYpRD13LnJvdW5kKGQvMiksSSs9RCx6Kz1EO2lmKEEmJkgpRys9ZCxFKz1kO2Vsc2UgaWYoQXx8SClEPXcucm91bmQoZC8yKSxHKz1ELEUrPUQ7aWYoZWEmJkhhKU8rPWQseWErPWQ7ZWxzZSBpZihlYXx8SGEpRD13LnJvdW5kKGQvMiksTys9RCx5YSs9RDshciYmMWUzPD16JiYoaD1yPSEwLHRoaXMudGltZVRvVmlldz1HYT1iLmNvdW50ZXJzLnF1ZXJ5KClbVl0sUT1JKTshdSYmMWUzPD1FJiYodT0hMCxhLmsuYS56YXhzKCJmdWxsT3RzUmVhY2hlZCIsYix4KSk7InVuZGVmaW5lZCI9PT10eXBlb2YgQiYmKEQ9Yi5jb3VudGVycy5xdWVyeSgpLmJ1LDFlMz49RD95JiYoQj0hMCk6Qj0hMSk7InVuZGVmaW5lZCI9PT10eXBlb2YgVCYmKEQ9Yi5jb3VudGVycy5xdWVyeSgpLmJ1LDFlMz49RD9OJiYoVD0hMCk6VD0hMSk7KGIuZWw9VSkmJiJ1bmRlZmluZWQiPT09dHlwZW9mIG1hJiYyIT09cSYmMyE9PXEmJkMuZWxHZW8mJihEPWYoKS55K0MuZWxHZW8uZm9sZFRvcCxTPUMuZWxHZW8udGhyZXNob2xkKkMuZWxHZW8uZWxIZWlnaHQsRD1EPmEudy5jKCktUywwPEMuZWxHZW8udG90YWxBcmVhJiYobWE9RCxiLmRuPW1hKSk7RiYmTiYmKGxhPXcubWluKHcubWF4KEwsbGEpLDEpKTtLPHomJihLPXopO1A8RSYmKFA9RSk7eXx8KHo9MCk7QXx8KEU9MCk7dj15O0g9QTsxZTM8PXlhJiYoUj0hMCk7ZWF8fCh5YT0wKTtIYT1lYTthLmEuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe3ZhciBiPUMmJkMucGVyY3YsYj0ibnVtYmVyIj09PXR5cGVvZiBiJiYxMDAqYjtpZihhLm9uSW5WaWV3VGltZUNvdW50KWEub25JblZpZXdUaW1lQ291bnQoZCxJLW0sYix4KTtpZihhLm9uRnVsbHlJblZpZXdUaW1lQ291bnQpe3ZhciBjPXcubWF4KEctSiwwKTthLm9uRnVsbHlJblZpZXdUaW1lQ291bnQoZCxjLGIseCl9fSk7cmV0dXJuIGh9O3RoaXMuZ2V0UVM9ZnVuY3Rpb24oYSxiLGMpe0o+SSYmKEo9SSk7Qz5HJiYoQz1HKTthW1ldPU51bWJlcihyKTthW1pdPUk7YVtOXT1KO2lmKDA9PT1xfHwyPT09cXx8Mz09PXF8fDU9PT1xfHwoIm51bWJlciI9PT10eXBlb2YgcT9xOnEudHlwZSkpdSYmaGEmJihhW2hhXT0xKSxiPTA9PT1xJiZjJiYic2ZyYW1lIj09PWMsYmEmJiFiJiYoYVtiYV09RyxhW2lhXT1DLGI9dGhpcy5nZXRNYXhpbXVtQ29udGludW91c0Z1bGx5SW5WaWV3VGltZSgpLGFbY2FdPWIseD09PWMmJihhLmljPWIpKSxNJiZkYSYmKGFbZGFdPTEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIFEmJihhW2FhXT1RKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBHYSYmKGFbZmFdPUdhKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBCJiYoYVtnYV09TnVtYmVyKEIpKTshMD09PUYmJihjPXcucm91bmQoMTAwKmxhKSxiPXcucm91bmQoMTAwKkQpLGFbV109YyxhW1hdPWIsRD1sYSk7InVuZGVmaW5lZCIhPT10eXBlb2YgbWEmJihhLmliPU51bWJlcihtYSkpO0o9STtDPUd9fWZ1bmN0aW9uIGYoKXt2YXIgYj1hLmMuZSxjPWIuZG9jdW1lbnQ7cmV0dXJue3k6dm9pZCAwIT09Yi5wYWdlWU9mZnNldD9iLnBhZ2VZT2Zmc2V0OihjLmRvY3VtZW50RWxlbWVudHx8Yy5ib2R5LnBhcmVudE5vZGV8fGMuYm9keSkuc2Nyb2xsVG9wfX1hLnc9e307dmFyIGc9e30sYz17fTthLncuYz1mdW5jdGlvbigpe3JldHVybiBVP2EuYy5yKGEuYy5lKS5oZWlnaHQ6NzUwfTthLncuZD1mdW5jdGlvbihiKXt2YXIgZT1iLnpyO2Euay5hLmF6c3goImFkS2lsbGVkIixhLncuYSx7b25jZTohMCxjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGEuenI9PWIuenJ9fSk7Z1tlXT1nW2VdfHx7fTtiLnZpZXdzdGF0cz17aXNCaWdBZDohMX07aWYoYiYmYi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKXJldHVybiExO2lmKGEuYy5kbCgpfHxhLmMuYW0oKS5pc0luQXBwJiZhLmMuYyl7dmFyIGg9ayhhLnouZiksZjthLmMuY2UoKXx8YS5hYiYmYS5hYi5hKCk/YS5jLmN5KCl8fGEuYy5jeCgpJiZhLmMuYW0oKTpmPW5ldyBkKHtpc1Zpc2libGVGbjpoLGlzTWVhc3VyYWJsZUZuOmEuYy5kbCxwYXVzZUNoZWNraW5nRm46YS5hYy5hLGNhcmVGb2M6ITAscXNLZXlzOjAsY291bnRlckxhYmVsOiJzdHJpY3QifSk7ZiYmKGdbZV0uc3RyaWN0PWYpO2g9bmV3IGQoe2lzVmlzaWJsZUZuOmgsaXNNZWFzdXJhYmxlRm46YS5jLmRsLHBhdXNlQ2hlY2tpbmdGbjphLmFjLmEsY2FyZUZvYzohMSxxc0tleXM6MSxjb3VudGVyTGFiZWw6ImxheCJ9KTtnW2VdLmxheD1ofWVsc2UhMCE9PWIuaXNTa2luJiZhLm0mJmEubS5hKCkmJihoPW5ldyBkKHtpc1Zpc2libGVGbjphLm0uYixpc01lYXN1cmFibGVGbjphLmMuZHEscGF1c2VDaGVja2luZ0ZuOmEuYWMuYSxjYXJlRm9jOiEwLHFzS2V5czozLGNvdW50ZXJMYWJlbDoicHNjb3BlIn0pLGdbZV0ucHNjb3BlPWgpO2EubyYmYS5vLmIoKSYmIWdbZV0ucHNjb3BlJiYoaD1uZXcgZCh7aXNWaXNpYmxlRm46YS5vLmMsaXNNZWFzdXJhYmxlRm46YS5jLmRyLHBhdXNlQ2hlY2tpbmdGbjphLmFjLmEsY2FyZUZvYzohMCxxc0tleXM6Mixjb3VudGVyTGFiZWw6InBzY29wZSJ9KSxnW2VdLnBzY29wZT1oKTtlPWEuay5hLmF6c3goInZpZXc6dGljayIsYS5hLmRmKFtiXSxhLncuZSkse3ByaW9yaXR5OjV9KTtjW2IuenJdPWU7YS5rLmEuemF4cygidmlld0NvdW50ZXJTdGFydGVkIixiKX07YS53LmY9ZnVuY3Rpb24oYixjLGQpe3JldHVybiBiJiZjJiZkPyhiPWEudy5nKGIuenIsYykpJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXSYmYltkXSgpOiExfTthLncuaD1mdW5jdGlvbihiLGMpe2lmKGImJmMpe3ZhciBoPWEuYy5laSgpLGY7IWMuc2ZyYW1lJiZoJiYoZj1oLm1lYXN1cmFibGVGbixoPWgubmFtZSxnW2IuenJdLnNmcmFtZT1uZXcgZCh7aXNWaXNpYmxlRm46YS5hZC5hLGlzTWVhc3VyYWJsZUZuOmYscGF1c2VDaGVja2luZ0ZuOmEuYWMuYSx2aWV3YWJpbGl0eUFwaU5hbWU6aCxjYXJlRm9jOiEwLHFzS2V5czo1LGNvdW50ZXJMYWJlbDoic2ZyYW1lIn0pLGEuay5hLnpheHMoInZpZXdDb3VudGVyU3RhcnRlZCIsYikpfX07YS53LmU9ZnVuY3Rpb24oYixjLGQpe2lmKGEuYS5jcShiKSl7dmFyIGY9Z1tiLnpyXSxwO2Eudy5oKGIsZik7Zm9yKHZhciBrIGluIGYpZi5oYXNPd25Qcm9wZXJ0eShrKSYmZltrXS51cGRhdGUoYixjLGQpJiYocD0hMCk7Yi5maXJlRnVsbFZpZXdFdmVudD0hMTthLmEuZm9yRWFjaChiLnNlY29uZGFyeUNvdW50ZXJzLGZ1bmN0aW9uKGEpe2EudXBkYXRlKGIsYyxkKX0pO2IuZmlyZUZ1bGxWaWV3RXZlbnQmJihhLmFjLmIoYiksYi5maXJlRnVsbFZpZXdFdmVudD0hMSk7cCYmYS5hYy5jKGIpO2EuYWEuYihiKTtiLmFvJiYxPT1iLmFvLnNraW4mJiJ3aWR0aCI9PWEueC5iJiZhLnguZCgpO2EuZC5lKGIpJiZhLmFjLmQoYil9fTthLncuaT1mdW5jdGlvbihiLGMpe3JldHVybiBhLncuaihiKT49Y307YS53Lmo9ZnVuY3Rpb24oYil7dmFyIGM9MDsoYj1iJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnpyJiZhLncmJmEudy5rKGIuenIpKSYmKGM9Yi5nZXRJblZpZXdUaW1lKCkpO3JldHVybiBjfTthLncubD1mdW5jdGlvbigpe3JldHVybiJoYWRPVFMifTthLncubT1mdW5jdGlvbihiLGMpe3ZhciBkPWEudy5sKCk7cmV0dXJuIGImJmImJiJ1bmRlZmluZWQiIT10eXBlb2YgYi56cj9jP2Eudy5mKGIsYyxkKTphLncuZihiLGEudy5iKGIuenIpLGQpOm51bGx9O2Eudy5uPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS53Lm8oYi56cik7cmV0dXJuIGEubyYmYS5vLmEmJmQmJmQucHNjb3BlJiZkLnBzY29wZVtjPyJoYWRWaWRlbzJTZWNPVFMiOiJoYWRPVFMiXSgpfTthLncucD1mdW5jdGlvbihiLGMpe3ZhciBkPWEudy5vKGIuenIpO3JldHVybiBhLm8mJmEuby5hJiZkJiZkLnBzY29wZSYmZC5wc2NvcGVbYz8iaGFkRGVudHN1VmlkZW9PVFMiOiJoYWREZW50c3VEaXNwbGF5T1RTIl0oKX07YS53LnE9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLncmJmEudy5vKGIuenIpO3JldHVybiBhLm8mJmEuby5hJiZkJiZkLnBzY29wZSYmZC5wc2NvcGUuZ2V0RnVsbEludmlld1RpbWVUb3RhbCgpPj1jfTthLncucj1mdW5jdGlvbihiKXt2YXIgYz0wOyhiPWImJiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuenImJmEudyYmYS53LmsoYi56cikpJiYoYz1iLmdldEZ1bGxJbnZpZXdUaW1lVG90YWwoKSk7cmV0dXJuIGN9O2Eudy5zPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEudy5yKGIpPj1jfTthLncuYT1mdW5jdGlvbihiKXtkZWxldGUgZ1tiLnpyXTtjLmhhc093blByb3BlcnR5KGIuenIpJiZhLmsuYS5zeGF6KCJ2aWV3OnRpY2siLHtpZDpjW2IuenJdfSl9O2Eudy5vPWZ1bmN0aW9uKGEpe3ZhciBjO2dbYV0/Yz1nW2FdOmdbYV09Yz17fTtyZXR1cm4gY307YS53Lmc9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLncubyhiKTtyZXR1cm4gZCYmZFtjXX07YS53LnQ9ZnVuY3Rpb24oYil7dmFyIGMsZCxnO2lmKCFifHwhYi5zdHJpY3QpcmV0dXJuITE7Yj1hLmMuYW0oKS5pc0luQXBwO2M9YS5jLmNxKCk7ZD1hLmMuY3coKTtnPWEuYy5jdSgpO2M9YyYmYS5jLmN8fGQ7cmV0dXJuIGImJmN8fCEoYnx8Zyl9O2Eudy5iPWZ1bmN0aW9uKCl7dmFyIGI7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGY9bnVsbCxwPWdbY107YS53LnQocCk/Zj0ic3RyaWN0IjpwJiZwLnNmcmFtZT9mPSJzZnJhbWUiOnAmJnAucHNjb3BlJiYoZj0icHNjb3BlIik7KHA9InVuZGVmaW5lZCIhPT10eXBlb2YgQiYmQltjXSkmJnAuaXNNZWFzdXJhYmlsaXR5RGlzYWJsZWQoKSYmKGY9bnVsbCk7YS5kLmMoKSYmIWQmJihmPW51bGwpO2IhPWYmJihiPWYsYS5rLmEuZXNnZigicHJlZmVycmVkVmlld0NvdW50ZXJVcGRhdGUiLEJbY10pKTtyZXR1cm4gZn19KCk7YS53Lms9ZnVuY3Rpb24oYixjKXt2YXIgZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBCJiZCW2JdO2lmKCFkfHwhZC5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKXt2YXIgZD1hLncuYihiLGMpLGY9Z1tiXTtpZighYS5kLmMoKXx8YylyZXR1cm4gZiYmZCYmZltkXX19O2Eudy51PWZ1bmN0aW9uKGIsYyl7dmFyIGQ9e30sZj1nW2JdLHA9YS53LmIoYiksaztmb3IoayBpbiBmKWYuaGFzT3duUHJvcGVydHkoaykmJmZba10uZ2V0UVMoZCxjLHApO2EuYWEuYyhiLGQpO2EuYWUuYShiLGQpO2Eudy5rKGIpJiZhLncuayhiKS5oYWREZW50c3VEaXNwbGF5T1RTKCkmJihkLm5iPTEpOyhmPUJbYl0pJiZmLnZpZXdzdGF0cyYmZi52aWV3c3RhdHMuaXNCaWdBZCYmKGQuZWw9MSk7cmV0dXJuIGR9fSkodSk7KGZ1bmN0aW9uKGEpe2EuYWY9e307YS5hZi5hPWZ1bmN0aW9uKGEsZCl7dmFyIGY7ZC5vdXRlckhUTUw/Zj1kLm91dGVySFRNTDooZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxmLmFwcGVuZENoaWxkKGQuY2xvbmVOb2RlKCEwKSksZj1mLmlubmVySFRNTCk7Zj1bL2ZsYXNodmFyc1xzKj1ccyooIi4qPyJ8Jy4qPycpL2kuZXhlYyhmKSwvbmFtZVxzKj1ccypbIiddZmxhc2h2YXJzWyInXVxzKnZhbHVlXHMqPVxzKigiLio/InwnLio/JykvaS5leGVjKGYpLC92YWx1ZVxzKj1ccyooIi4qPyJ8Jy4qPycpXHMqbmFtZVxzKj1ccypbIiddZmxhc2h2YXJzWyInXS9pLmV4ZWMoZiksYV07Zm9yKHZhciBnLGMsYj17fSxlPTA7ZTxmLmxlbmd0aDtlKyspe2lmKChnPWZbZV0pJiYib2JqZWN0Ij09PXR5cGVvZiBnJiZnWzFdKWc9Z1sxXS5yZXBsYWNlKC8mYW1wOy9nLCImIikucmVwbGFjZSgvJnF1b3Q7L2csJyInKS5yZXBsYWNlKC9eIi9nLCIiKS5yZXBsYWNlKC8iJC9nLCIiKS5yZXBsYWNlKC9eJy9nLCIiKS5yZXBsYWNlKC8nJC9nLCIiKTtlbHNlIGlmKCJzdHJpbmciPT09dHlwZW9mIGcpZz1nLnNwbGl0KCI/IilbMV07ZWxzZSBjb250aW51ZTtpZihnKXtnPWcuc3BsaXQoIiYiKTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyljPWdbaF0uc3BsaXQoIj0iKSwyPmMubGVuZ3RofHwiZnVuY3Rpb24iPT1jWzBdLnNsaWNlKDAsOCl8fChiW2NbMF1dPVtjWzFdXSl9fXJldHVybiBifX0pKHUpOyhmdW5jdGlvbihhKXthLng9e307YS54LmU9e307YS54LmI9ImRpdnMiO2EueC5lLmF8fChhLnguYj0id2lkdGgiLGEueC5lLmE9ZnVuY3Rpb24oYSl7cmV0dXJuIDFlM30pO2EueC5kPWZ1bmN0aW9uKCl7dmFyIGs9YS5jLmUsZD1hLmMucSYmay5kb2N1bWVudHx8ZG9jdW1lbnQsZj1kLmRvY3VtZW50RWxlbWVudCxkPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTt0cnl7YS54LmM9ayYmay5pbm5lcldpZHRofHxmJiZmLmNsaWVudFdpZHRofHxkJiZkLmNsaWVudFdpZHRofWNhdGNoKGcpe319O2EueC5hPWZ1bmN0aW9uKGssZCxmKXtpZigiZGl2cyI9PWEueC5iKXtpZihrLl9NdF93SUMpcmV0dXJuITA7aWYoay5fTXRfd09DKXJldHVybiExO3ZhciBnPWYuY3VycmVudFRhcmdldCxjPWs7Zm9yKGY9MDsxZTM+ZiYmIWEuYS5heChkLGMpO2YrKyl7aWYoYz09Z3x8bnVsbD09YylyZXR1cm4gay5fTXRfd09DPSEwLCExO2M9Yy5wYXJlbnRFbGVtZW50fXJldHVybiBrLl9NdF93SUM9ITB9aWYoIndpZHRoIj09YS54LmIpe2s9ZC8yO2c9YS54LmMvMjtjPWYuY2xpZW50WDtmPWYuY2xpZW50WTt2YXIgYj1hLmMuZS5zY3JvbGxZfHxhLmMuZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3JldHVybiBhLnguYz5kJiYoYz5nK2t8fGM8Zy1rKXx8OTA+ZitiPyExOiEwfWlmKCJhZC1lbHMiPT09YS54LmIpe2lmKGsuX010X3dJQylyZXR1cm4hMDtpZihrLl9NdF93T0MpcmV0dXJuITE7Zz1mLmN1cnJlbnRUYXJnZXQ7Yz1rO2ZvcihmPTA7MWUzPmY7ZisrKXtpZihhLmEuYXgoZCxjKSlyZXR1cm4gay5fTXRfd09DPSEwLCExO2lmKGM9PWd8fG51bGw9PWMpYnJlYWs7Yz1jLnBhcmVudEVsZW1lbnR9cmV0dXJuIGsuX010X3dJQz0hMH19fSkodSk7KGZ1bmN0aW9uKGEpe2EuYWc9e307dmFyIGs9W107YS5hZy5hPWZ1bmN0aW9uKGEsZil7ay5wdXNoKHtxdWVyeTphLGNhbGxiYWNrOmZ9KTtyZXR1cm4hMX19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaygpe2Z1bmN0aW9uIGIoYyl7Zm9yKHZhciBlPSIiOzA8YzspZSs9YS5mLmEoW2MlNjJdKSxjPXcuZmxvb3IoYy82Mik7cmV0dXJuIGV9ZnVuY3Rpb24gYyhhKXtyZXR1cm57cHJvcGVydHlNZXRob2RzOltmdW5jdGlvbihiLGMpe3RyeXt2YXIgZT1jLnNwbGl0KCIuIiksZD1hLGg9ZVswXTsxPGUubGVuZ3RoJiYoZD1lWzBdLGg9ZVsxXSk7cmV0dXJuIGFbZF0uaGFzT3duUHJvcGVydHkoaCkudG9TdHJpbmcoKX1jYXRjaChnKXtyZXR1cm4oITEpLnRvU3RyaW5nKCl9fSxmdW5jdGlvbihiLGMpe3RyeXt2YXIgZT1jLnNwbGl0KCIuIiksZD1hLGg9ZVswXTsxPGUubGVuZ3RoJiYoZD1lWzBdLGg9ZVsxXSk7cmV0dXJuIGEuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYVtkXSlbaF0uZ2V0LnRvU3RyaW5nKCl9Y2F0Y2goZyl7cmV0dXJuIiJ9fSxmdW5jdGlvbihiLGMpe3RyeXt2YXIgZT1jLnNwbGl0KCIuIiksZD1hLGg9ZVswXTsxPGUubGVuZ3RoJiYoZD1lWzBdLGg9ZVsxXSk7cmV0dXJuIGEuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYVtkXSlbaF0uZ2V0LnRvU3RyaW5nLnRvU3RyaW5nKCl9Y2F0Y2goZyl7cmV0dXJuIiJ9fV0sZnVuY3Rpb25NZXRob2RzOltmdW5jdGlvbihhLGIpe3JldHVybiBhLm5hbWV9LGZ1bmN0aW9uKGEsYil7dHJ5e3JldHVybiBuZXcgYS50b1N0cmluZ31jYXRjaChjKXtyZXR1cm4gYy50b1N0cmluZygpfX0sZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKX0sZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiLnRvU3RyaW5nKX0sZnVuY3Rpb24oYSxiKXt0cnl7cmV0dXJuKCJwcm90b3R5cGUiaW4gYSkudG9TdHJpbmcoKX1jYXRjaChjKXtyZXR1cm4oITEpLnRvU3RyaW5nKCl9fV19fXZhciBlPVthLmYuYShbMjksNDAsMjgsNDYsMzgsMzAsMzksNDUsNzIsNDcsMzQsNDQsMzQsMjcsMzQsMzcsMzQsNDUsNTAsMTgsNDUsMjYsNDUsMzBdKSxhLmYuYShbMjksNDAsMjgsNDYsMzgsMzAsMzksNDUsNzIsMzMsMzQsMjksMjksMzAsMzldKSxhLmYuYShbMjksNDAsMjgsNDYsMzgsMzAsMzksNDUsNzIsMzgsNDAsNTEsNywzNCwyOSwyOSwzMCwzOV0pLGEuZi5hKFsyOSw0MCwyOCw0NiwzOCwzMCwzOSw0NSw3MiwzOCw0NCw3LDM0LDI5LDI5LDMwLDM5XSksYS5mLmEoWzI5LDQwLDI4LDQ2LDM4LDMwLDM5LDQ1LDcyLDQ4LDMwLDI3LDM2LDM0LDQ1LDcsMzQsMjksMjksMzAsMzldKSxhLmYuYShbMzksMjYsNDcsMzQsMzIsMjYsNDUsNDAsNDMsNzIsNDgsMzAsMjcsMjksNDMsMzQsNDcsMzAsNDNdKSxhLmYuYShbMzksMjYsNDcsMzQsMzIsMjYsNDUsNDAsNDMsNzIsNDYsNDQsMzAsNDMsMCwzMiwzMCwzOSw0NV0pLGEuZi5hKFszOSwyNiw0NywzNCwzMiwyNiw0NSw0MCw0Myw3MiwyNiw0MSw0MSwxMywyNiwzOCwzMF0pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSwyM10pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSwyNF0pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSwxOSw0MCw0MV0pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSwxMSwzMCwzMSw0NV0pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSw3MiwyNiw0NywyNiwzNCwzNywyMiwzNCwyOSw0NSwzM10pLGEuZi5hKFs0NCwyOCw0MywzMCwzMCwzOSw3MiwyNiw0NywyNiwzNCwzNyw3LDMwLDM0LDMyLDMzLDQ1XSldLGg9W2EuZi5hKFszLDI2LDQ1LDMwXSksYS5mLmEoWzI5LDQwLDI4LDQ2LDM4LDMwLDM5LDQ1LDcyLDMzLDI2LDQ0LDUsNDAsMjgsNDYsNDRdKSxhLmYuYShbMjksNDAsMjgsNDYsMzgsMzAsMzksNDUsNzIsMzAsMzcsMzAsMzgsMzAsMzksNDUsNSw0Myw0MCwzOCwxNSw0MCwzNCwzOSw0NV0pLGEuZi5hKFs1LDQ2LDM5LDI4LDQ1LDM0LDQwLDM5LDcyLDQxLDQzLDQwLDQ1LDQwLDQ1LDUwLDQxLDMwLDcyLDQ1LDQwLDE4LDQ1LDQzLDM0LDM5LDMyXSksYS5mLmEoWzQzLDMwLDQyLDQ2LDMwLDQ0LDQ1LDAsMzksMzQsMzgsMjYsNDUsMzQsNDAsMzksNSw0MywyNiwzOCwzMF0pLGEuZi5hKFs0NCwzMCw0NSw4LDM5LDQ1LDMwLDQzLDQ3LDI2LDM3XSksYS5mLmEoWzQ0LDMwLDQ1LDE5LDM0LDM4LDMwLDQwLDQ2LDQ1XSksYS5mLmEoWzEzLDQwLDQ1LDM0LDMxLDM0LDI4LDI2LDQ1LDM0LDQwLDM5XSksYS5mLmEoWzIyLDMwLDI3LDYsMTEsMTcsMzAsMzksMjksMzAsNDMsMzQsMzksMzIsMiw0MCwzOSw0NSwzMCw0OSw0NSw3Miw0MSw0Myw0MCw0NSw0MCw0NSw1MCw0MSwzMCw3MiwzMiwzMCw0NSwxOCw0Niw0MSw0MSw0MCw0Myw0NSwzMCwyOSw0LDQ5LDQ1LDMwLDM5LDQ0LDM0LDQwLDM5LDQ0XSldLGc9W2EuZi5hKFsyOSw0MCwyOCw0NiwzOCwzMCwzOSw0NSw3MiwzMywyNiw0NCw1LDQwLDI4LDQ2LDQ0XSksYS5mLmEoWzM5LDI2LDQ3LDM0LDMyLDI2LDQ1LDQwLDQzLDcyLDQ4LDMwLDI3LDI5LDQzLDM0LDQ3LDMwLDQzXSldO3JldHVybiIxXyIrZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9ZS5jb25jYXQoaCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZz1jW2RdO2lmKGEuaGFzT3duUHJvcGVydHkoZykpZm9yKHZhciBnPWFbZ10sZj0wO2Y8Zy5sZW5ndGg7ZisrKWIrPWdbZl0rIi0ifXJldHVybiBifShmdW5jdGlvbigpe2Zvcih2YXIgYT17fSxoPWMod2luZG93KSxmPXt9LGw9MDtsPGUubGVuZ3RoO2wrKylmW2VbbF1dPSEwO2ZvcihsPTA7bDxnLmxlbmd0aDtsKyspe3ZhciBrPWdbbF07YVtrXT1bXTt2YXIgQz1oLmZ1bmN0aW9uTWV0aG9kcztmLmhhc093blByb3BlcnR5KGspJiYoQz1oLnByb3BlcnR5TWV0aG9kcyk7dHJ5e2Zvcih2YXIgeix5PXdpbmRvdyxFPWsuc3BsaXQoIi4iKSxQPTA7UDxFLmxlbmd0aDtQKyspeT15W0VbUF1dO3o9eTtmb3IoeT0wO3k8Qy5sZW5ndGg7eSsrKXt2YXIgdj1DW3ldO3RyeXthW2tdLnB1c2goYihkKHYoeixrKS5yZXBsYWNlKC9cLS9nLCIlMkQiKS5yZXBsYWNlKC9ccyovZywiIikpKSl9Y2F0Y2gocil7YVtrXS5wdXNoKCIiKX19fWNhdGNoKHIpe2Fba10ucHVzaCgiRSIpfX1yZXR1cm4gYX0oKSl9ZnVuY3Rpb24gZChhKXt2YXIgYj0wLGM9YS5sZW5ndGgsZSxkO2lmKDA9PWMpcmV0dXJuIGI7Zm9yKGU9MDtlPGM7ZSsrKWQ9YS5jaGFyQ29kZUF0KGUpLGI9KGI8PDUpLWIrZCxiJj1iO3JldHVybiBiPj4+MH1mdW5jdGlvbiBmKCl7dmFyIGI9W107aWYoIWEuZy5kKHdpbmRvdy50b3ApKXt2YXIgYz1bXSxlPWEuZi5hKFsyOCwzMyw0Myw0MCwzOCwzMF0pLGQ9YS5mLmEoWzMwLDQ5LDQ1LDMwLDM5LDQ0LDM0LDQwLDM5XSksaD0iJyIrZSsiLSIrZCsiOi8vJ10iO3dpbmRvdy50b3AuZG9jdW1lbnQmJiJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LnRvcC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsJiYoYz13aW5kb3cudG9wLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltzcmNePSIraCsiLFtkYXRhXj0iK2grIixbaHJlZl49IitoKSk7MCE9PWMubGVuZ3RoJiZ3aW5kb3cuU3RyaW5nJiYiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5TdHJpbmcucHJvdG90eXBlLm1hdGNoJiZhLmEuZm9yRWFjaChjLGZ1bmN0aW9uKGEpeyhhPWEub3V0ZXJIVE1MLm1hdGNoKCdbYS16XSs9IicrZSsiLSIrZCsiOi8vKFthLXpdKykiKSkmJjE8YS5sZW5ndGgmJi0xPT09Yi5pbmRleE9mKGFbMV0pJiZiLnB1c2goYVsxXSl9KX1jPWIuam9pbigiLCIpO3dpbmRvdy5TdHJpbmcmJndpbmRvdy5TdHJpbmcucHJvdG90eXBlLnNsaWNlJiYoYz1jLnNsaWNlKDAsMTUwKSk7cmV0dXJuIGEuZi5pKGMpfWZ1bmN0aW9uIGcoYSxjKXtjb25zdCAkX19fb2xkX2M3MjY5NjBkNzNkZWEyMWM9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywiWE1MSHR0cFJlcXVlc3QiKTt0cnl7aWYoJF9fX29sZF9jNzI2OTYwZDczZGVhMjFjKSh7fSkuY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsJF9fX21vY2tfNzIzNWVhNzExZTQ0MzdkYS5YTUxIdHRwUmVxdWVzdCk7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3ZhciBnPWEuc3BsaXQoaCksZj1jfHx3aW5kb3csbCxuO2ZvcihuPTA7bjxnLmxlbmd0aDtuKyspe2w9Z1tuXTtpZihudWxsPT09Znx8dHlwZW9mIGY9PT1iKXJldHVybiAxO2Y9ZltsXX1yZXR1cm4gdHlwZW9mIGY9PT1iPzI6bnVsbD09PWY/Mzo0K2QoYStlK2YudG9TdHJpbmcoKSklNTh9Y2F0Y2goayl7cmV0dXJuIDB9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtpZigkX19fb2xkX2M3MjY5NjBkNzNkZWEyMWMpKHt9KS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IiwkX19fb2xkX2M3MjY5NjBkNzNkZWEyMWMpfX1mdW5jdGlvbiBjKCl7dmFyIGEsYj1bZnVuY3Rpb24oKXtyZXR1cm4iYyQkYiIhPT0iY2FiIi5yZXBsYWNlKCJhIixmdW5jdGlvbigpe3JldHVybiIkJCJ9KX0sZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCgnY2xhc3MgQSB7IGNvbnN0cnVjdG9yKHBwKSB7IHRoaXMucHAgPSBwcDsgfVxuIGNhbGwoKSB7IHJldHVybiB0aGlzLnBwOyB9XG4gfVxuIGNsYXNzIEIgZXh0ZW5kcyBBIHsgdFMoYSkgeyByZXR1cm4gc3VwZXIuY2FsbCgpOyB9XG4gdFQoYSl7IHJldHVybiB0aGlzLmNhbGwoKTsgfSB9XG4gIGNvbnN0IG9iaiA9IG5ldyBCKCJjYWIiKTsgIChvYmoudFMoKSAhPT0gb2JqLnRUKCkpOyAnKX0sZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCgiJ1xcXG5cciciKX0sZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCgnKChuZXcgRGF0ZSgiMTMwMC0wMi0yOFQyMToxMToxMS4wMDBaIikpLnRvSVNPU3RyaW5nKCkgIT09ICIxMzAwLTAyLTI4VDIxOjExOjExLjAwMFoiKScpfSxmdW5jdGlvbigpe3JldHVybiBldmFsKCcobmV3IERhdGUoIjI4MzUiKSkudG9JU09TdHJpbmcoKSAhPT0gIjI4MzUtMDEtMDFUMDA6MDA6MDAuMDAwWiInKX0sZnVuY3Rpb24oKXtyZXR1cm4tMSE9PSIyMiIubG9jYWxlQ29tcGFyZSgiMTIyIiwiZGUiLHtudW1lcmljOiEwfSl9LGZ1bmN0aW9uKCl7cmV0dXJuInAiPT09d2luZG93LmF0b2IoImNhYj09Iil9LGZ1bmN0aW9uKCl7cmV0dXJuImNhYiIhPT0iY2FiIi5zcGxpdCgvXGIvKS5wb3AoKX0sZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09QXJyYXkucHJvdG90eXBlLmZpbmR9LGZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlci5pc05hTigiTUFYX1NBRkVfSU5URUdFUiIpfSxmdW5jdGlvbigpe3JldHVybi8oRykrfChYKStYLy50ZXN0KCJYICIpfSxmdW5jdGlvbigpe3JldHVybiJiZWMiIT0iY2FiZWNhYiIubWF0Y2goIi4/ZS4/Iil9LGZ1bmN0aW9uKCl7dmFyIGE9e307WyJjYWIiLCJjYWIiXS5zb3J0KGEsYSk7cmV0dXJuITB9LGZ1bmN0aW9uKCl7dmFyIGE9bmV3IFByb3h5KFszLDQ0NF0se30pO3JldHVyblsxMiw0NDRdLmNvbmNhdChhKVszXX0sZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCgibGV0IHggPSAoZSkgPT4geyBsZXQgZSA9IHRydWU7fTsiKX0sZnVuY3Rpb24oKXtyZXR1cm4gMD09PW5ldyBBcnJheUJ1ZmZlcig1KS5zbGljZSgzLDQzOTQ4NzgzOTgpLmJ5dGVMZW5ndGh9XTthPSIxLSI7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBlO3RyeXtlPSgwLGJbY10pKCk/IjEiOiIwIn1jYXRjaChkKXtlPSIyIn1hKz1lfXJldHVybiBhfWEuYWg9e307dmFyIGI9YS5mLmEoWzQ2LDM5LDI5LDMwLDMxLDM0LDM5LDMwLDI5XSksZT1hLmYuYShbNzddKSxoPWEuZi5hKFs3Ml0pLGw7YS5haC5hPWZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PWwpcmV0dXJuIGEuYS5pKGwpO2w9e307dmFyIGU9YS5jLmU7dHJ5e3ZhciBoPWUuZG9jdW1lbnQseT1oLmJvZHkseD1lLmlubmVyV2lkdGh8fGguZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofHx5LmNsaWVudFdpZHRoLG49ZS5pbm5lckhlaWdodHx8aC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHx5LmNsaWVudEhlaWdodCxtPWUub3V0ZXJXaWR0aHx8eS5vZmZzZXRXaWR0aCxJPWUub3V0ZXJIZWlnaHR8fHkub2Zmc2V0SGVpZ2h0fWNhdGNoKHIpe310cnl7dmFyIEc9ZS5zY3JlZW5YfHxlLnNjcmVlbkxlZnR8fGUuc2NyZWVuWCxKPWUuc2NyZWVuWXx8ZS5zY3JlZW5Ub3B8fGUuc2NyZWVuWX1jYXRjaChyKXt9dmFyIEM9KG5ldyBBKS5nZXRUaW1lem9uZU9mZnNldCgpLHo7aWYoZG9jdW1lbnQmJmRvY3VtZW50LmJvZHkpe3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS5mLmEoWzM0LDMxLDQzLDI2LDM4LDMwXSkpO0sud2lkdGg9YS5mLmEoWzUzLDQxLDQ5XSk7Sy5oZWlnaHQ9YS5mLmEoWzUzLDQxLDQ5XSk7Sy5zdHlsZS5sZWZ0PSItIithLmYuYShbNjEsNjEsNjEsNjEsNDEsNDldKTtLLnN0eWxlLnRvcD0iLSIrYS5mLmEoWzYxLDYxLDYxLDYxLDQxLDQ5XSk7Sy5zdHlsZS5wb3NpdGlvbj1hLmYuYShbMjYsMjcsNDQsNDAsMzcsNDYsNDUsMzBdKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEspO3o9S31lbHNlIHo9dm9pZCAwO3ZhciBFPWEuZi5hKFs4NCw0MSwzMywyNiwzOSw0NSw0MCwzOF0pLFA9YS5mLmEoWzI4LDI2LDM3LDM3LDE1LDMzLDI2LDM5LDQ1LDQwLDM4XSksdj0hMD09PSgidW5kZWZpbmVkIiE9dHlwZW9mIGVbRV18fCJ1bmRlZmluZWQiIT10eXBlb2YgZVtQXSk/MTowLEgsdT16LHc9Lyg/Ok1hYyBPUyBYICkoXGR7Mn1fXGR7Mn0pKD86LipWZXJzaW9uXC8pKFxkezJ9KS8sQj1hLmYuYShbNjQsMjgsMjksMjgsODQsMjYsNDQsMjksMzUsMzEsMzcsMjYsNDQsNDYsNDUsNDAsNDEsMzEsMzMsNDcsMjgsMjUsMTEsMzgsMjgsMzEsMzcsODRdKSxRPWEuZi5hKFsyOCwzMyw0Myw0MCwzOCwzMF0pLEQ9YS5mLmEoWzQzLDQ2LDM5LDQ1LDM0LDM4LDMwXSksVD1hLmYuYShbNDEsMzcsNDYsMzIsMzQsMzksNDRdKSxsYT1hLmYuYShbMTUsMzcsNDYsMzIsMzQsMzksMCw0Myw0MywyNiw1MF0pLEY9YS5mLmEoWzM4LDM0LDM4LDMwLDE5LDUwLDQxLDMwLDQ0XSksTT1hLmYuYShbMzgsMjYsNDksMTksNDAsNDYsMjgsMzMsMTUsNDAsMzQsMzksNDUsNDRdKSxMLE8sUixVLFcsWD0yLGVhPTIsamE9MixtYT1lLmRvY3VtZW50JiZlLmRvY3VtZW50W0JdPzE6MCx1YSxZLFosTixhYT1hLmYuYShbMzQsNDUsMzAsMzhdKSxmYT1hLmYuYShbNDUsMzAsNDQsNDVdKTtpZih3aW5kb3cuU3RyaW5nJiZ3aW5kb3cuU3RyaW5nLnByb3RvdHlwZS5tYXRjaCl7dmFyIFY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCh3KTtMPW51bGwhPVYmJiIxMF8xMiI9PVZbMV0mJiIxMCI9PVZbMl19ZWxzZSBMPSExO2lmKCFMKXt2YXIgZ2E9YS5mLmEoWzQ3LDM0LDI5LDMwLDQwLDczLDM4LDQxLDU2LDc1XSkrIiAiK2EuZi5hKFsyOCw0MCwyOSwzMCwyOCw0NCw3Nyw5MCwyNiw0NywyOCw1Myw3Miw1OCw1Niw1Miw1Miw1Myw0LDcxXSkrIiAiK2EuZi5hKFszOCw0MSw1NiwyNiw3Miw1Niw1Miw3Miw1NCw5MF0pLHFhPWEuZi5hKFsyNiw0NiwyOSwzNCw0MCw3MywzOCw0MSw1Niw3NV0pKyIgIithLmYuYShbMjgsNDAsMjksMzAsMjgsNDQsNzcsOTAsMzgsNDEsNTYsMjYsNzIsNTYsNTIsNzIsNTQsOTBdKSxyYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF1ZGlvIik7dHJ5e089cmEuY2FuUGxheVR5cGUoZ2EpfWNhdGNoKHIpe089IkUifXRyeXtSPWhhLmNhblBsYXlUeXBlKHFhKX1jYXRjaChyKXtSPSJFIn19dmFyIGJhPVtdLGNhLGlhO2lmKHdpbmRvdy5uYXZpZ2F0b3Ipe1k9KHVhPXdpbmRvdy5uYXZpZ2F0b3JbTV0pJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyYmdm9pZCAwIT09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobmF2aWdhdG9yKVtNXTtpZih3aW5kb3cubmF2aWdhdG9yW1RdKXtpYT13aW5kb3dbbGFdJiZ3aW5kb3dbbGFdLnByb3RvdHlwZT09PW5hdmlnYXRvcltUXS5fX3Byb3RvX187dmFyIGRhPXdpbmRvdy5uYXZpZ2F0b3JbVF07Y2E9ZGEubGVuZ3RoO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh3aW5kb3cubmF2aWdhdG9yKVtUXSYmKFU9ITApO2Zvcih2YXIgeGE9MDt4YTxjYSYmMTA+eGE7eGErKyliYS5wdXNoKGRhW3hhXS5uYW1lKTtaPWQoYmEuam9pbigiKiIpKTtpZih3aW5kb3cubmF2aWdhdG9yW1RdW2FhXSl0cnl7Tj13aW5kb3cubmF2aWdhdG9yW1RdW2FhXShmYSk/MDoxfWNhdGNoKHIpe049M31lbHNlIE49Mn1XPXdpbmRvdy5uYXZpZ2F0b3JbRl0mJndpbmRvdy5uYXZpZ2F0b3JbRl0ubGVuZ3RofWEuZy5kKHdpbmRvdy50b3ApfHwoamE9d2luZG93W1FdJiYib2JqZWN0Ij09PXR5cGVvZiB3aW5kb3dbUV1bRF0/MTowKTtpZih1KXZhciBuYT11LmNvbnRlbnRXaW5kb3csWD0oZWE9Im9iamVjdCI9PT10eXBlb2YgbmFbUV0/MTowKSYmIm9iamVjdCI9PT10eXBlb2YgbmFbUV1bRF0/MTowO0g9W2phLGVhLFgsY2EsWixpYT8xOjAsVyxVPzE6MCxSLE8sbWEsdWEsWT8xOjAsTl07Zm9yKHZhciBvYT1bXSxrYT0wOzEwPmthO2thKyspb2EucHVzaChIW2thXSk7dmFyIHZhPWwsc2EsdGE9d2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uYW5jZXN0b3JPcmlnaW5zJiZBcnJheS5mcm9tJiZBcnJheS5mcm9tKHdpbmRvdy5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMpO3NhPWQodGE/dGEuam9pbigiLCIpOiIiKTt2YS5vbD1zYTt2YXIgd2E9bCxJYTt0cnl7Zm9yKHZhciBKYT1bYS5mLmEoWzMzLDI2LDQzLDI5LDQ4LDI2LDQzLDMwLDIsNDAsMzksMjgsNDYsNDMsNDMsMzAsMzksMjgsNTBdKSxhLmYuYShbNDcsMzAsMzksMjksNDAsNDNdKSxhLmYuYShbNDEsMzcsMjYsNDUsMzEsNDAsNDMsMzhdKSxhLmYuYShbNDYsNDQsMzAsNDMsMCwzMiwzMCwzOSw0NV0pLGEuZi5hKFs0OCwzMCwyNywyOSw0MywzNCw0NywzMCw0M10pXSxTPXt9LHphPTA7emE8SmEubGVuZ3RoO3phKyspU1tKYVt6YV1dPXdpbmRvdy5uYXZpZ2F0b3JbSmFbemFdXTtJYT1hLmYuaChhLmYubChTKSl9Y2F0Y2gocil7SWE9IiJ9d2EucW49SWE7bC50Zj1rKCk7dmFyIEVhPWwsT2EsUGE9InRvb2xiYXIgc2Nyb2xsYmFycyBsb2NhdGlvbmJhciBtZW51YmFyIHBlcnNvbmFsYmFyIHN0YXR1c2JhciIuc3BsaXQoIiAiKSxwYT1bXSxBYSxCYTtmb3IoQmE9MDtCYTxQYS5sZW5ndGg7QmErKyl0cnl7QWE9UGFbQmFdLCEwPT09d2luZG93W0FhXS52aXNpYmxlP3BhLnB1c2goMSk6ITE9PT13aW5kb3dbQWFdLnZpc2libGU/cGEucHVzaCgwKTp2b2lkIDA9PT13aW5kb3dbQWFdLnZpc2libGU/cGEucHVzaCgyKTpwYS5wdXNoKDMpfWNhdGNoKHIpe3BhLnB1c2goNCl9T2E9cGEuam9pbigiIik7RWEudmk9T2E7bC5yYz1vYS5qb2luKCIsIik7bC5yYj0iMS0iK2EuZi5pKEguam9pbigiLCIpKTt2YXIgRmE9bCxRYTtRYT0iaXNTZWN1cmVDb250ZXh0ImluIHdpbmRvdz93aW5kb3cuaXNTZWN1cmVDb250ZXh0PzE6MDoyO0ZhLnNjPVFhO2wub3M9IjEtIitmKCk7bC5xcD1hLmYubi5qb2luKCIiKTt2YXIgYWI9bCxLYTt2YXIgUmE9ejtpZihSYSl7dmFyIFNhPWEuZi5rKCcmXXhvdWwjKWtdbWRyY2ZheGd1bTpobV9tZlJfanJ1KlVjaFlxbkxeOnZ3amRtcWgxTSRiZ2VzNXtUfHIwaG1rbWhzXCcuYyBUfGRxLFlLSFlcXEdUTmBRVUJbXkdPPlxcSUNZQVlLWzJbOkZdR0BIPVdIMXtxZXJidm8wZXZmekcjaGxoejJcbnBvYU1saGxtaXRoNWBwYG4rJmZ7YHVheyl5cHxkO2NmbGtsayZNY25jaGZ4YnctcF11YjI1e2t2YnFSIGBwbEdZZmJxI046Uzc7NHlvbmVrXnpdemlNWnFZciVWTEc5RkJROTE3e2F8XFxscjBhXG5gblV5Ym9cJ3xSelxcLT94Z3Bjb2gzaXthIFg3bWNpbSlHaHpoc1xcIFxuI1hsYzJkaGhzaW0iSGYiZTdTR1RcXFxcVENPQDY6IWVcdCVtY3Jfd2I4NnpacGE9X25taXBwKUdpb2R5XCd8UnpcXC0/eWxyXXtidWJsZnQ4e3Fxbk1za2JcdClMTlAzWUBPRWNISztfOjE4bFh+ZW5LcV1sQnxZeW84Z29eciNDY2pndV9hY3FlaFZUaW5tdipLRUdCUkA2O3pmcmtwbXhgVV95ZHlbTjNjR01kdV96ZnZoem04Z29eciNDanldd2l7aW1IbF9+Z25GQ1BcXFBrZiBgfFwnelZ7XnVmMDtHO2A2WFtqZnhidy1uYXZkelxcNz5dTDxcXFVxL2ppZmpudCFISVogIFhwaHVwbW9WZnprb2shajtjZmxrbGsmT0hYOXZnfWducVVwIGlrRlxuZ29cJ1k2Zj1TP1E9VlleSlE7MzViRkxud2p8YnhHXHR0dl5gZnlcXC9RWUhTSV5JWFVZR1s4NUJVT05sdGhRXFxtXmBmeVxcL0xFRUhNXFw2SDtmRGQ/TitFT1tEeGNcbmtzZ3VDIWNmLEpHUU5rO0Y5TFFhSFVELj9bUE9he2p8bWBmeVxcL0lJUUlMTUJKSWZEZD9OK0VPW0hrbXFta2ZzZF9sbWMyPlJIYFRLN0o3bkVeS0coS1BZP3B0IGhcblVjWG1zaSZvX3pcXHleMzViRlZgdmRVXn4ieVxcd146NGBKT3NxXXVjbzZ3aGhrPV9ubWlwcClJR15La2BzQyFjZixXTFxcRlFUV0tTNzs2XFxSUm5xam9odHFvT29dIVxcL0FXS2I/WUgxOVpFYmcha2dPcGJraDlnb2d1ZXUjRGZlamRdXG5adzpoZnAhTU5FUVVCVEhqS1lMV0VWRk9dVEpIPVE5TkROXHRSX3JkcHBaYmloOWlrZnN+UGNqbmZnZGxwI3NXdFc7NnVocl53XnhYUHFvZyFcbk5LYFJFSko/YCFIYnBicWJqcWZBfmJ0aDk+S0liRl9AT0VjSEs7XzoxOXNbXHRVeGB0YE1za2JcdClOO1o0WUBESTA7b2N8V3RXeVZYZ25sMGhta21oc1wnTWgiXyBIdmN5YXFhX2l3V3tXdmw3bWNpbSlJZnBfb2chWm5jL2ppZmpudCFIaGxWdGF9aGNoNmtnYXBcJ01uIGV8ZEZ0aWZ3KFc6XkZZN2JGNUNRSVpiaWhXZH1tPF1yZWhybCRHSVlIamp7U3FfblNxZ21rUl1+bzhnb15yI0VfeFlXbG1jeFxcbGRYZ25sMGppamsgT1xcflpiY25ldGRpakxucWJRX3pmPWFqbGcoTGJoaXIpfV4hP3xlVnFpakZpcFpKbmpXXHRncm5wbzRBdVdcbmhvZyFcblFGRFNRPVFOa0leRkxRXUJNRC5Ad2B7YXBpfj9cblJ0ZGZseCZTTFs4SklaO106aEhQT1xcT1s3X0RZR20/XFw7RipIZ2ZveVpzak1kcFp2ZHBwNlFLTF9aWEhSNjk7cGF5ZWhoXG5JfmZsIFJCVkxHSlxcXFxUQ09ANj56VnpcXG9yMjtHO2A2ZElMNWM8WE1hSldBSyBQZ29mc18gQG9yaWpxW3hoM2RoX3Rcbk5tdmF6TW9XXHRwfF5XX11gZHJ5amg/IVpzajU1UENdVFRFVkRlRFM8XT46NntrZnBUYWZuIGdqP3VCeFZ9dHRhTXNrYlx0KVhIXFw2OTxzcHNqSHBxY3kkSEZuR0pRSUFcXClLamxnT2tcbmBcdCVtY3Jfd2I4OntbdWZiYn5xZWE2QFJDXkBOJVRaeVxcRnB2Z3UoXUpUSkhRVEtMREdATUFlOV1NNj93XXJKenF4XXBAdWFqO3VmIGw3bWNpbSlMY31oTlohUlJtZmx4JkY7XFxJWkhQQFZSWUdDT00pTGN9aE5aIVJSbWZseCZxW3laMT1oX3RjamNHcm1reiJOPFpNY0NWRUhdVEBETVEhTFd0V1x0VG1HY2x8Zmk1bm9cdFohYFx0JW1jcl93Yjg8amVzYXJUfWhxalhseV1cdGR5Z1NjXHRmcyxyWXBfOD1ZQ1Mze19Mbm5obWB6XXppOGdvXnIjSVJRRFBbfmZ6W2w3e1h2ZHBwNmlrYnJvciVWRVpDUWdnbHhscTpxW3RXfWc3a2dqb3FuIFNPV0VhXXxrRmppZWhoXG4jcVt1WSJbNUdWSVRReFVuZk9lc15yZXUsUEdEPlE5MT9LNFJoe3JxbjZrZ2FwXCdTPVA8cnBTX3JfaCh4ZHxbeTR+aHdjMGhta21oc1wnUz1QR3JpdGdzZkZibWNsW0xodGF9LU9LXVBLQVpRTyVXSVBWMy45VzMtRCk1LTglRSk6LzkwQS86Ik5cXHhLIl87ZWJraSRMXnhaSVtoVntcXHdkMGhta21oc1wnU2ZvWHIlb19xXS9DemlxJFVnfFVucUhrempnaDluXHRpfmBcdGtmYlBnZlt4WnhFbSB7WHdmdmQ0RnRodylcXF56UiBgd2NYYXBfUmR3Y2hmPV9ubWlwcClPYlx0ZzhvRjNcdFxcYmlNbGhsbWl0aDVlI2N5bnRwbWFSY25cXHZeIEBzJW1jcl93YjhAam9MaHRhfS1GS1VcXFxcP2pOT0lPQ05LUFAwQ2hzUWtqZHsgU0JWXlhHZ1RPQmpKT0ZtMmFLTypPXXxcXHtWd1pMaHRhfS1GS1VcXFxcP2o+U0tRRlo9TUNcXCROXyRXdFd5VlRpbm12KkxMU1NhRmk+OjxycGNtZWpnPyFac2o1Nl5AaFVNW04uNyBWYCJbfVJcdFtGdGlmdyhQRFJVXT1uOTo0LkdtdmhjbG1uPiNWe2svQlNFYlBXVFNLVEJQN0IrTWEgX3VVfV9Pb3NfICVFTVFXWUVrSTFDUDZYNGxiZ297K3RVeGA2Rlc1VkZ2cnRtd0dtZTNkaF90XG5WSEZFWGx4aDlnb2d1ZXUjTlFRWXFjfGpxV3tbfmFOdWdqfCtTR2pIS0dXQWJDQlJNR1FZX0lGSkxRX0VOUkdITUBaIFhOV15yWm5CZndJanVpfiNSSWY/VDdSQGFHTVZLRl1aTkhbMlZFLUtlbGsodWJ6YjVgcGBuK09hbGZnOHBxc1xcczp7XXAscllwXzhCalpwU1pYIUxnb3tebVlQcW9nIVxuUDhRUllKTEhTVFU+SEVUXG5WZGZlaUhrbX4pdl58WCBfLUtpXFxsW1laeVdrUyJUN2tnam9xbiBYYG5ibz5ya2JiZWxkKHpWclszP3RXcmBVYXxxb2JyblxcWnxYciVvX3FdL0dxWW5XWmEjZWxkMGppamsgWGBuYm9EIGlmX3E9eV96aTNibGB2Z3ErUGtsYjQ3TzxeOm1EUjpVR1NGYkhbOUoiVWFzWDdDUT9dSktCX1paSGE6YUBQTGM+UkZYRFxcP1U5O0F4Y2cqWE9VN1BOXUJcXDhsQE9RWEpYPWA+VERmQF43TitQa3xmbF1uXFx+Yn1fO2Via2kkUlxcdlpoajVZdGdZcXFwd3FcdGRwSnBcJ3xSelxcLU1qXnZdflpqZEpTfWlqcjBobWttaHNcJ1lfdGRwaWZjcjtkaCFWeCR1U3xYNU54YXpgdWJ+b3xad19yW0Zwdmd1KHhac117WjtDanhvYXZxT2J+b3xue1Z7a3QscllwXzhFZm90V31nW2RzcW1wekl7X2ttczYiXFxvcjI6WDxOQU5ETlFfO0pSRyhYXlx0YXBpfktzYiFcXHRyWWhnW1xuWkpsbGAiIVdOUEE0TWtmcWp8Zm9fcFxcRmppZWhoXG5JbmNwYHYhd2BvYTRNa2Zxanxmb19wXFxTY3dneGxvWllfdFt9WjdrZ2pvcW4gW2pzZyFWXHQ8d2NybDFRUTdQP1tRVUJbQkdbSVFlOlpNTT5tPlxcTFRDYzxSUVohVWV6WyJcXHhtMGppamsgW21vbHNfIFh1Z3NmMWZxY2xqb1x0X2VucmdqfF56XXppTWh8X3JadWdzZkRwbV5xV2ledDhcdGRwcDZLVUJQXCdaa3NkcmV1X3hhcmhPZHNkbFUiXFx4bUVod3BrOSBgeG08P1xcRUYqVGpobXFjeVd7W35hTG5wam1gel16aVZiIGU7ZWJraSRTbHtlamh7a11ibWROZXtxNGJsaG8lXmZvY2phT118PX5aaVt1ZnhUdS1rb11wa2ZhYHxidGp2ZWhOcFl3YHtncjd8ZndYd3NrX2lxdWZMcWtielJvY2YscF1xYVxuXTFGfGV3Rn5hdV96ZnZodGp4XCd8UnpcXC1OeWtrTSBXeFl5W1x0Z3JucEt4cW9jeW44ZXNfdGtpKlZMRj5gQktKdmB0NnFgcGNtQnxZeW84PF0/YUlQSmNFRE1XIVdKSjZwZ2pCal12a2tgUHFvZyFcbltGT0MwSlc9UGlxaVtkcGF8b3FufCt0VXhgNktiNFZaZlJ2WXFtfGR3ajVgcGBuK1RQS01rWX0+eWd8VnBram1yJm9felxceV4zRGM2W3NyP3dremZ0XVx0bXdfdEpwc3ZbaCh6VnJbM0RjNltzck9ta2pZfSl2XnxYIF8tUGlZZ1tuYWpJe2R0VHYtcF11YjJGcFxcblpwXXJKdXBpWXA+cVtma3NmYVhqY2duNmtnYXBcJ1xcXnRdclp1LGhdb19cblpVaHZidGV9eDBqaWprIF1gcGVzVCAlZmx5ZWhsbWlqJHNXfVp9Zy5ObWNyWW5vOGIgNiRrZmx3YWVmcSNzV3RXO0VuZW5ha3E0Z3BvOGVzX3RraSpWXXBpXG5aVWJoa3FUbGowaG1rbWhzXCdcXF5+YFx0a2psa0dlbXFne1t5IH1UdmQuTm1wdmN5bm9cJ3pWe151ZjBLWUFNY25jaGZ0V11xY2p7Y3VmeEdzbCFcbnlcXG9leGAvTWI8SztJXnRhbURuYXVidGg5TmBAbTdSOU1DUjxiR1s5SlVLO1U5TlFHSktCMkdhQlA+VGZ7WkhDcF1wX3ppM2JsYHZncStVUk9DdWJcdEFrXFxzRlx0YEZqaWVoaFxuI3FbdVkiWzVSWENVXnlfUGdvZnNfICVUVEtXWEhVSWRKYEJUUl5SR05bTUc3UEpYTmE2OUpXRVRZd2JfWmwkVzNjO1xcRElbVUxcXDlfSmlLUz05SldFVFl3Yl9abDd5VVBVfC1SPVxcRVk5UlpXSGQ2YUZgUElEL01iPFVXe1piWHBAdF9aYnIiWzxeQWE2VFZWTE9GUlFaIVhMTkJwZ3FSZ2NLaXVncEtrbXZcbl04VUZXPUpZTUdIVUg0YlxuXFxVSUxpcW5HcGJNblxuZ3JrcE95WWdsbWluWUhUISF3YG9hNFBcXDtbXFx+YWFWdENqbGlsckxxYTNGSEZXRk5GYUhRS0tIWlpcXD5afmBNSE5lbGtNcVxcUV91VyJiX2R0cHFgZ2BMXX1cJ3xSelxcLVFaP1NbXG5dWFtuPnhhbnNxUm1vel1uXFx2S3NdO0dCUkxLSEFrOFFFWjdfNF1HLk9eRFZVXHRjXV51PXZqdSxwXXFhXG5dMUlsZCRcXGxkWWt6aGtmOWdvZ3VldSNUZmVqaF5NZ3dXXG40I1lvZHQqcXBcXF1wcjhlc190a2kqV2BkbHFZRmh5U1wnNX5laGF6K3JZeWJ+YTpEdVhzY2g5dWxtbkdrbVh0ZTdtY2ltKVlcXGxtb11lYFx0YmZwMmRoaHNpbSJaZn5lamZnSWlrZ1twbThlc190a2kqV2x1Y3pcXDNjaGZyWzdtY2ltKVlofWR4YDxkfWNqcjJmZGdxIVhqeVt9WjdzdGV1K3JZeWJ+YTpEIHBtY1dgaF9cbkFuaXsge1h3ZnZkNFFrbFx0T3xacVxcUGxmSm1rdyh4WnNde1o7R3JsZ05pa21Zfil4WntWOUtwc2dgMWZxY2xqb1x0Y2VqYm1BfmJ0aDk+S0liRl9AT0VjSEs7XzoxSnlnIWduY1Z1eGJ5InRuXVxcXG5afWtWUFAmcVt5WjFKeWchZ25jV05UK3JZeWJ+YTpGPz0vTVhASExrOldIVkQ7SFJEeGF2cTRBUE9LWFsyYEItU1ZBSGx+ZHckc1d9Wn1nLlFaRktmfWp8XCcgZW5abFJ2WWZfWF5yX3tcdGRGS0h1a2tleGN5alx0bFdfYWlibHdeaGxeWnhrc2Y9YWpsZyhdcGtmTF5+YiNSIGBwbDJmZGdxIVtKW0R0WnJucCp0YnRbXHRjNk93VXJmVXBlW25GdWh5JHNXfVp9Zy5TTT9NQGpeeWZ+Y3JqdGNoV3dfI2l6aGxRISZ9YjA/V0pWRlBOXT5SUF8+Qz9jSzZOT1RJTlslbjhhUy5TbV9HZ35gd1t6ajs6cGt0YW9fUWd3ZXkgIWdqYm1Qel5pWVdkd2IhfmRcXGM/d2toZ25hfiRZZ31ncmxnQXpvdWY5Z29ndWV1I1hjZjl2bXFiZ2JcbiAkVHVoZl18YjRibGhvJWVWbz5NMEdncGogaWpIbGBzWHtocGNLbHRocHN+XCdPRVxcREpBYztST1pJSkhmNGQ5T0RUW1FLSjljXCdhXnA4WSlEbXFoeG5xR2pka1cgXFx3ZkVrdnFrbFx0KU1IXkpsSUY/SFdFT1I7SkhmNFhBTUhQQzRUa1ZSRzw8fV59bHVjVl1xXnFnbmRuNX5hfWR6cDZCUjlYQFhNbTJfSUJXYzpYQFI6V1VJO103Uk1JKF9iaDtXLU1oe2Eha2ZQaWZnX35ec11KYX1nbnd2Kk5PR0FQPV8/VDZfI1hjZj9PLE9kcmZ8ZnRFbm1mYXpmdFtOanhtc2kgJU4/XFxXVkJNOUpIZkVjQltASUFnP1JDTkZpTFdLUiNYY2Y/TyxPZHJmfGZ0RW5tZmF6ZnRbTmp4bXNpICVOP1xcV1dMTUNYPFZEXFxST0RHQEo+ST9qRFhNU0NZPEJUSTxiPVtCVUVVN11HXFwrWWFqRFImXWB4XXNjdmVoQXNmd18jaTM7UzdcXDhXU2E9Wk9HTWo9Xz9UNl8jWGNmP08sXlpzWmxkeGFwQnFqfGJ+aDlBXFw6WzZPTEdESUpiO2BJRjlPP1RBXV5JTk1CVFNeRGQ+OkhyWUhKNkpoaHBad191WVJid3NndHwrUzVjWl0+YEdSSWBVRUFXWWA+UjtWR2NcbmBkZENUL1hZeV9va3dfdDpwbHhde246SU5DTEFkR2hEWkxRT0s4N1JvW1U9P0lmbGhddWN6XFxIZXVmdGt9LVdKUUNVRlhaTEVdNFhWQkFYQVk/a0pTP01BYUBoSFBAUUBLRzdSb1tVPT9JZmxoXXVjelxcSGV1ZnRrfS1XSlFDVUZYWkxOVDdSSWBATUZHQ1o8MU1sVFY/O1FnamxieF15Yk1ofGVyb3UsWUZWQ1NDSjpmO11HNVZnXk9JOEZwaW5eXG5ae15EbXJsaHJcbiNxW3VZIls1VmdeT0lYWXlfb2t3X3Q6cGx4XXtuOjdURVNRZThMMS5TbV9NQF1geF1zY3ZlaEFzZndfI2kzQlBAVDRbK1lhakRSRnBpbl5cblp7XkRtcmxoclxuI1RETFFcXDxXVFVbS0xUR188WE1tNFxcQ1BQME9oXFxTQVdbdVZ0ZXJtaT93a3pZIm84SV09Zj5QTGNHSUBfOllVXFxAWEdcXCtZYWpEUkZwaW5eXG5ae15EbXJsaHJcbiNXPUkzQ1xuYGRkQ1RPa2JvYHxifFhQZm9yaXB3KF82UkZTN242WFVHTklESyBiYGxEd2VOZWprZWxsaXo6e1t1Zj0+TlhXTDRUa1ZWZH46fFp6WHVnc2ZIcHFjeSR1U3xYNVZnXlNmejdeTlVeJldcdFhuY3dKeGZxI3NXdFc7Sm5hTWV8QFlHWFxcfmt3aTtdc21xPm9pbWk4KEhkIFQhLW5hdmR6XFw3Um9bWVogS3NfcmtsbnVkczt9V31nN0BWW1xcPlg7UE82UHNTWGB1UnZZcW11aW5ldTckWHdzMElXUlk5T01LQDpIcllMZ3hMdVt6aG5qcGF9OFx0ZHBwNmlrYnJvciVlVm9KcGFvXXcoT0FUSVBAVlxuYGRkT3dgcVlcdCl4WntWOU5zZ3hZZWZxSHlobFN8N25lY3F0cV1mdG9vazxfbmRmKlxcRU9CXG5pdUhsYyNYfHMwSFc+Sj1ZQjZRYT1hR3NtZ112bXtnM2RoX3RcbmpvcmhxYGdodGp4PG9UdVxcL0dIREgmbWV1YnBVcGdybnA/aWBuWTlQWj1PRVJJRj9IUS9bfGVxX2pTIlxceG1FXWtlayJ4aiM6clU7ZWJraSRkanxhblloZnhid0JjX3BiNGchXFx6PG9UdVxcL2ppZmpudCFmZndeeFZqc2trdkBnV3NgOG5+VW5rZixyWXBfOFd3ZX5ldGVSbXZhemNnV3ApTmIgUm9jZkJ2WWpPfGF0V2sge1h3ZnZkNGBnV3NgfVwnclZ5XFx1YzJkaGhzaW0ialNyW25yMGRpcDRibGhvJXFScF9mcTJlZG5vXTNibGB2Z3ErZV1rZWtnOWp6XnxcbnlcXG9leGAvXXRndGNsIHJmci1uYXZkelxcN15ya31eciVkcW0mcVt5WjFZb2R+YG4taWx9P2tibmN3WlxuXFx2ZWgsZ2pkbXQ8dWtXZH5WbnJ1KnRidFtcdGM2XFx2Y3xkZixwZ2ReYF5yW3oge1h3ZnZkNGBuZnpob1wnfGV9KTQyOSZqX1xuRHdfblt9VHVGd2VsYlZVcmA4ZXNfdGtpKmdgdWl5WjNtbFQhZ3hxZypxa3lobGd2XCd6VntedWYwW2tse2JqJH5XcWZ9bnRhNmx0OHpyeGV9UnFHc21ramhtXHQjZlprRCNfbnIwaG1rbWhzXCdtYVxuYHpcXC91aVp2bntnaiR2YFNiXG5tbmtpYVZmemJ8XiBkO1tqcXRZd110I3FbdVkiWzViam53amsiIWBsbCFgXHRcXC9tcjxycXphdFdrQiBicHFnb3sral1+a2ttcVk7ZWJraSRmYn5kcls1aXRVfHNxbm0rdWJPaiBnemBuW1Fwc191X1x0aDNdbGZhaHVkdSp0YnRbXHRjNlxcdmN8ZGYse11lbVxuZHdbNWF9N3h2cGh3XmpEfWpxa3NkXG4laV93RGxtXG5ac1t5IHtYd2Z2ZDRgbmZ6aG9cJyRWb2p1bXZdMWl6OXRtdV5+VG1PdGtvb2tnfil8XntgIlxcTWd3bGhocWczYmxgdmdxK2VocW1oY2xtbj1vZW4lZXBzaEhgclpoajNVfmF8bm5hNmFrVlxuYjhlc190a2kqZ2dxbXthaiRsZCBiey1uYXZkelxcN155ZyBgeVxcL2V2Z3hqOmNmY2xcdHJid3JxaG0rbWZ6cHo8fV15WHFxaVxcMWZxY2xqb1x0cmJ3cnFobStyY3Ipdl58WCBfLWFzZnZpeFozY2hkekdybGdocWtrIndgeGAhWTlacGx3Z29fOmhoaGxXfWZxbnYqdGJ0W1x0YzZcXH1fXG5mbWMybGxncSNxW3VZIls1YnFqe2xyWTlvc2ZzRCBYbm4yZGhoc2ltImpkXCdjfW4wb31femBwKW5ecWMlZ3UscllwXzhYd293Zn4hfHRkcHRiNFl5XnxyfmU7Y2Zsa2xrJm9nfmZ7YT1mfmF2aG0rbVl5YHxaIVZYXFx6LHJZcF84WW0tblNGX3Foamg2dHhdXHRgdmc8X25kZipoYXZqbWloXkxodGF9LXBddWIyWSJvb2t8UnklQmJoS2hbflhtRnlhJFxcbWR0KnRidFtcdGM2XiVlcmlvX3AmTG1fWmZoalpfZXh1a2Btb09ifm9rZXpWcSV1cGdMa2x7aXlibCAiZWxBa2psK3NZXHRjeV13a3IjZ2N4W2soelZyWzNYI191UmVubWJ0IHMwdl5zX0JrNGg5JnpsdWlqJHVTfFg1Z2tvfGx4bTlheWskUlx0Wy9qaWZqbnQhbV96Zn5lIS10YXhpZ1dwTn5aIVY7Y2Zsa2xrJnVjaVtcdFdzN0sra2psYn5Zbz9MXCdyUiBYY193XXYoeFpzXXtaO1xcfFJnX31vazd6aX5eJWU5YnEvNm45c21lOV81aSBcXH1kbmo2aWticm9yJXpbbi5rZGhuZl06bHdfe1d7YTdrZ2pvcW4geFxcITx9X3tcXGRybWdxbVxcWndJbGQkWHsrb2F2cmhVfSlcbmIgWm9jZipxZ31MYDhYW3pleGJ3Q2dva29vZFx0ZHlnPF9uZGYqcll5Y3NWeWV5IHBjeU1jaW0pdFUgZHFaIWBcdCVkbXNjbF9RY2ZYc1dzXG53YHhlb156Y30pbWtzVXJldWdlZHYoflp2a3BkdEh8ZHRJbWFvVVx0ZHlnPF1yZWhybCRxWyFebFd7YSAhcnJSbndxdVd6Z1JafFV5XFxzUGlfbG1cblp3W2sgfVR2ZC5qaXNvW2xveWs8XlxuRGJ2WGd4XXRFdF91ZiFcbndgeGVvXnpjfSl6XlxuXnZqdGdzZnYofWpqaFxuIH1UdmQuamlzb1tsb3lrPGF8YG9yaWpIaG1XcVtrXHR9VFx0aGldfGx4In1ge25zZCBEZmJtWU5fJEh+aXtXfDRsYmdveyt0VXhgNmdvZ3ZeYnJzajFtcWd7X2pXZmJ7amduNmB1Ylx0bXllelZcdCVwbGlqdWl+IXNXfVt2VH1udCp7YnhqdF5vUH1jeFxccyxnZ3FufmRxYmxkPWJ3cnZdfGJpXFxsaXFeOl9ubWplZWxybDpoamh9W3JYYG50Z21vNGdcdFxcfG1bVlxuamJlaWsxZnFjbGpvXHR+Y25tMGhta21oc1wneWlzX1FYdV9mWXZfOmNmY2xcdH5la2h2cXU/eGMhbm9rPGdyaXRnc2YvaX5eamR7UyJcXHhtLmxtb2xjfWhrZ3FWO1ptY2VqUF9taHpobGU9YWpsZyh4Ynhaem13WnxUciVvX3phaltcbl50ZDVmfj1cXE5QKnRidFtcdGM2aXNjc2Zza2VmZl86Y2ZscFlwZ3JucCp8dnZZN2t8YnxlO2Via2kkc2x7YnVqNWBwYG4rdV11cHticjx8XCdxUntKaW17JnFbeVoxaWpkfl91QXsqdGJ0W1x0YzZscWN8Y21ScyZvX3pcXHleM2V0Z11ob2F3cnoid2B4YCFZOWpmclhhcF97ankkdVN8WDVycmFtYG5HI2l+YXNkdmovYWVmZl94I3FbdVkiWzVycmFtYG5HI2l+YXNkdmovZWlsWWl1WGppNV50YXBzaih7bWtZbmNdcnxldVxcdGd3JnNfelluZG5cdCRcXHx0Y2heZmtre2p8bTxZcmBoZngkeWNcdGpmYl1bdGp5bnRwNm1nW3BHb18hfiJgdHNlZFljcWx1ZXlmPWpyY3ZkNHRrVkxrelwnc2IhWG1xMmZkZ3EhfFtpXXhnTGBwX21pR2J0aGttd2B7PXNfcV0xaG1iaiJ+V3FecnNUYXlya2dcdEFzZXNEJWp1Y3Emb196XFx5XjNpdFV0aHZObXB1YCBgVmhxUnk9amppS3xtXG5acktZPj1fbm1pcHApfVltZnNtYWFyXFxkZktqZGd5Vnckc1d9Wn1nLnNtX3FdXHROel5zVHVJZmFzX3FjXG5edGRMZCBiey1wXXViMmtwXXViIUR9XFxmYWxKaF17XFxzX3tbfmFOdWdqfCtJNVtPX0tXP1RWUUZFS0gmJFZzWmxqPWN+YW5la0NrVVx0cHxePFVyXWJzcGxFbHtseFt5QiBidm92RXs+cmB6cm9dPF9uZGYqfVlxXnFtM2Z8VHtcXGxFZ118cnhZOWJvbVdebl5mUW1yaCh4WnNde1o7bGptZmFcbit2aW1nc1xcVFZua3ZwaSZsbVBaa1d8XiI1e255b21vNGBwaXFtdn4lWG9iaXAxaiBXcV9qOHRUfXR0YTZmeUdcdFxcfmIgZXZadENyWWVmcVkzZGhfdCcpLnNwbGl0KGEuZi5hKFs3MV0pKSxiYj1TYS5sZW5ndGgsQ2EsVGE9W107Zm9yKENhPTA7Q2E8YmI7Q2ErKylUYS5wdXNoKGcoU2FbQ2FdLFJhLmNvbnRlbnRXaW5kb3cpKTtLYT1hLmYuYShUYSl9ZWxzZSBLYT0iIjthYi5pcz1LYTtsLml2PTg7bC5xdD12O2wuZ3o9YS5jLmFwKCk/MTowO2wuaGg9YS5jLmFxKCk/MTowO2wuaG49YS5jLmFyKCk/MTowO3ZhciBjYj1sLExhO3RyeXtMYT0hYS5nLmQod2luZG93LnRvcCkmJndpbmRvdy50b3AubmFtZT9hLmYuaCh3aW5kb3cudG9wLm5hbWUuc3Vic3RyaW5nKDAsNTA+d2luZG93LnRvcC5uYW1lLmxlbmd0aD93aW5kb3cudG9wLm5hbWUubGVuZ3RoOjUwKSk6IiJ9Y2F0Y2gocil7TGE9IiJ9Y2IudHc9TGE7dm9pZCAwIT09RyYmKGwucWM9Ryk7dm9pZCAwIT09SiYmKGwucWQ9Sik7bC5xZj14O2wucWU9bjtsLnFoPW07bC5xZz1JO2wucW09QztsLnFhPWEuYy53O2wucWI9YS5jLng7bC5xaT1hLmMudTtsLnFqPWEuYy52O3ZhciBkYj1sLFVhLERhPVtdO3RyeXt2YXIgZWI9YS5mLmEoWzQ3LDQwLDM0LDI4LDMwLDQ0LDg0LDM0LDM5LDM0LDQ1LDMwLDI5LDg0XSksZmI9YS5mLmEoWzE3LDQ2LDM5LDE5LDI2LDQ0LDM2XSksZ2I9YS5mLmEoWzIsMjYsMzksMjgsMzAsMzcsMTksMjYsNDQsMzZdKSxoYj0idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3dbZmJdLGliPSJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvd1tnYl07RGEucHVzaCgidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3dbZWJdPzE6MCk7RGEucHVzaChoYj8xOjApO0RhLnB1c2goaWI/MTowKX1jYXRjaChyKXt9VWE9RGEuam9pbigiIik7ZGIudG89VWE7bC5wbz1jKCk7dmFyIGpiPWwsVmEsa2I9YS5mLmEoWzI4LDI2LDM5LDQ3LDI2LDQ0XSksV2E9YS5mLmEoWzQ4LDMwLDI3LDMyLDM3XSksbGI9YS5mLmEoWzMwLDQ5LDQxLDMwLDQzLDM0LDM4LDMwLDM5LDQ1LDI2LDM3XSksbWI9YS5mLmEoWzIyLDQsMSw2LDExLDg0LDI5LDMwLDI3LDQ2LDMyLDg0LDQzLDMwLDM5LDI5LDMwLDQzLDMwLDQzLDg0LDM0LDM5LDMxLDQwXSksbmI9YS5mLmEoWzIwLDEzLDEyLDAsMTgsMTAsNCwzLDg0LDIxLDQsMTMsMywxNCwxNyw4NCwyMiw0LDEsNiwxMV0pLG9iPWEuZi5hKFsyMCwxMywxMiwwLDE4LDEwLDQsMyw4NCwxNyw0LDEzLDMsNCwxNyw0LDE3LDg0LDIyLDQsMSw2LDExXSkscGI9YS5mLmEoWzQ3LDMwLDM5LDI5LDQwLDQzXSkscWI9YS5mLmEoWzQzLDMwLDM5LDI5LDMwLDQzLDMwLDQzXSkscmI9YS5mLmEoWzI4LDQzLDMwLDI2LDQ1LDMwLDQsMzcsMzAsMzgsMzAsMzksNDVdKSxYYT1hLmYuYShbMzIsMzAsNDUsMiw0MCwzOSw0NSwzMCw0OSw0NV0pLHNiPWEuZi5hKFszMiwzMCw0NSw0LDQ5LDQ1LDMwLDM5LDQ0LDM0LDQwLDM5XSksWWE9YS5mLmEoWzMyLDMwLDQ1LDE1LDI2LDQzLDI2LDM4LDMwLDQ1LDMwLDQzXSksTWE9e307dHJ5e3ZhciBaYT1kb2N1bWVudFtyYl0oa2IpLE5hPVphW1hhXShXYSl8fFphW1hhXShsYisiLSIrV2EpLCRhPU5hW3NiXShtYik7TWFbcGJdPU5hW1lhXSgkYVtuYl0pO01hW3FiXT1OYVtZYV0oJGFbb2JdKX1jYXRjaChyKXt9VmE9YS5mLmgoYS5mLmwoTWEpKTtqYi52eT1WYTtiJiYobC5tc3Q9Yik7aWYoeil0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh6KX1jYXRjaChyKXt9cmV0dXJuIGEuYS5pKGwpfX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGIpe3ZhciBjPWEuZi5yKCEwKTtiPSJodHRwczovL2dlby5tb2F0YWRzLmNvbS9uLmpzPyIrYS55LmIoMzUsYixjLCExLCEwKS5yZXMucXVlcnlzdHJpbmc7YS5hay5hKCJkYXRhIiwiTW9hdERhdGFKc29ucFJlcXVlc3QiLGIpfWEuZi5vPSExO2EuZi5wPVtdO2EuZi5xPXt9O2EuZi5xLmE9ImFwcGVuZFNwZWNpZmljcyI7YS5mLnEuYj0iYXBwZW5kTWFudWFsIjthLmYucS5jPSJvbmx5SG9vbWFuIjthLmYucS5kPSJvbmx5Qm90IjthLmYucS5lPSJvbmx5Tm9uSGlkZGVuQWQiO3ZhciBkPXt9OyhmdW5jdGlvbigpe2EuYy5laCgpJiZhLmwuZShmdW5jdGlvbigpe3RyeXthLmMuZS5uYXZpZ2F0b3IuZ2V0QmF0dGVyeSgpLnRoZW4oZnVuY3Rpb24oYSl7ZC5jaGFyZ2luZz1hLmNoYXJnaW5nO2QubGV2ZWw9YS5sZXZlbH0pWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe30pfWNhdGNoKGIpe319LDFlMyl9KSgpO2EuZi5yPWZ1bmN0aW9uKGIpe3ZhciBjO3RyeXtyLl9jJiYhYS5hLnUoci5fYywxKT9jPXIuX2M6KGM9YS5haC5hKCksci5fYz1jKX1jYXRjaChlKXtjPWEuYWguYSgpfWlmKHZvaWQgMD09PWJ8fCExPT09YiljLnFsPWEuZi5zLGMucW89YS5mLnQ7Yy5xcj1hLmYudSgpO2QmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGQuY2hhcmdpbmcmJmEuYS5kYihkLmxldmVsKSYmKGMudmY9ZC5jaGFyZ2luZz8xOjAsYy52Zz0xMDAqZC5sZXZlbCk7cmV0dXJuIGN9O3ZhciBmPWEuZi5hKFs0OCwzMCwyNywyOSw0MywzNCw0NywzMCw0M10pLGc9YS5mLmEoWzMwLDQ3LDI2LDM3LDQ2LDI2LDQ1LDMwXSksYz1hLmYuYShbNDMsMzAsNDQsNDEsNDAsMzksNDQsMzBdKSxiPVtmLGddLmpvaW4oIi0iKSxlPVtiLGNdLmpvaW4oIi0iKTt0cnl7YS5mLnM9YS5mLmgoYS5mLmwoYS5jLmUubmF2aWdhdG9yLnBsdWdpbnMsIm5hbWUiKSl9Y2F0Y2gocCl7fWEuZi51PWZ1bmN0aW9uKCl7cmV0dXJuIDB9O2EuZi50PTA7YS5mLnY9ZnVuY3Rpb24oKXt9O3ZhciBoPSJudSBpYiBkYyBvYiBvaCBsdCBhYiBuIG5tIHNwIHB0Ii5zcGxpdCgiICIpO2EuZi53PWZ1bmN0aW9uKGIsYyxlKXtpZigoYS5mLnEuYSBpbiBjfHxhLmYucS5iIGluIGMpJiZ2b2lkIDA9PT1hLmYueClyZXR1cm4hMTt2YXIgZD1hLmEuaShhLmYueCk7dm9pZCAwPT09ZC5uJiZhLmFpLmEoZSkmJihkLm49MSk7YS5mLnEuYSBpbiBjP2EuYS5mb3JFYWNoKGgsZnVuY3Rpb24oYSxjKXtiPWEgaW4gZD9iKygiJiIrYSsiPTEiKTpiKygiJiIrYSsiPTAiKX0pOmEuZi5xLmIgaW4gYyYmYS5hLmZvckVhY2goaCxmdW5jdGlvbihjLGUpe2EuYS5heChhLmYucS5iLGMpJiYoYj1jIGluIGQ/YisoIiYiK2MrIj0xIik6YisoIiYiK2MrIj0wIikpfSk7cmV0dXJuIGEuZi5xLmMgaW4gYyYmYS5mLnEuZSBpbiBjP2EuZi55KGUpP2EuZi56KGIpOiExOmEuZi5xLmMgaW4gYz8wPT09YS5mLmFhP2EuZi56KGIpOiExOmEuZi5xLmQgaW4gYz8xPT09YS5mLmFhP2EuZi56KGIpOiExOmEuZi56KGIpfTthLmYuej1mdW5jdGlvbihiKXsobmV3IGEuYy5lLkltYWdlKS5zcmM9YjtyZXR1cm4hMH07YS5mLmFiPWZ1bmN0aW9uKGIsYyl7YihhLmYuYWEpfTthLmYuYWM9ZnVuY3Rpb24oYSxiLGMpe2wuYWRkKGEsYixjKX07YS5mLmFkPWZ1bmN0aW9uKGIsYyl7aWYodm9pZCAwPT09YS5mLmFhKXJldHVybiBhLmYucC5wdXNoKHtjYWxsYmFjazpiLG9wdHM6Y30pO2EuZi5hYihiLGMpfTthLmYuYWU9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGEuZi5wLmxlbmd0aDtiKyspaWYoYS5mLnAuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWEuZi5wW2JdO2EuZi5hYihjLmNhbGxiYWNrLGMub3B0cyl9fTthLmYuYWY9ZnVuY3Rpb24oYixjKXt2YXIgZT1hLmYucigpO2EuYWomJmEuYWouYSYmYS5hai5hLmltYVNESz9iLm1vYXRDbGllbnRMZXZlbDMmJmEueS5iKDM0LGIsZSwhMSwhMCk6YS55LmIoMzQsYixlLCExLCEwKX07YS5mLmFnPWZ1bmN0aW9uKGMpe3ZhciBkPWEuYS5keihjKTtpZighMCE9PWEuZi5haCl7YS5mLmFoPSEwO2EuZi5hZihjKTthLmEuZHUoe2FsbDohMH0sZCkmJmsoYyk7dmFyIGg9ZnVuY3Rpb24oKXt2YXIgYj17fTtiLnFyPWEuZi51KCk7Yi5xbz1hLmYudDthLnkuYigzNixjLGIpfSxnPWEuYy5lLmRvY3VtZW50O2EubC5jKGcsYixmdW5jdGlvbihjKXthLmwuZChnLGIsbnVsbCwibXN3ZSIpO2EuZi51PWZ1bmN0aW9uKCl7cmV0dXJuIDF9O2goKX0sIm1zd2UiKTthLmwuYyhnLGUsZnVuY3Rpb24oYil7YS5sLmQoZyxlLG51bGwsIm1zd2VyIik7YS5mLnU9ZnVuY3Rpb24oKXtyZXR1cm4gMX07aCgpfSwibXN3ZXIiKX19O2EuZi5haT1mdW5jdGlvbigpe3ZhciBjPWEuYy5lLmRvY3VtZW50O2EubC5kKGMsYixudWxsLCJtc3dlIik7YS5sLmQoYyxlLG51bGwsIm1zd2VyIil9O2EuZi55PWZ1bmN0aW9uKGIpe3JldHVybiAwPT1hLmYuYWEmJiExPT09YS5haS5hKGIpfTthLmYuYWo9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJvYmplY3QiPT09dHlwZW9mIGEmJiJuImluIGF9O2EuZi5haz1mdW5jdGlvbigpe3ZhciBhO2E9dyYmdy5zaW5oPzFlMTAqKHcuc2luaCh3LnNpbmgody5zaW5oKHcuc2luaCgxKSkpKS0zLjgxMjc4MDAzKTotMjthPWEudG9TdHJpbmcoKTtyZXR1cm4gMD09PWEuaW5kZXhPZigiNy42MDAiKT9hLnN1YnN0cmluZyg1KTotMX07dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGEsYyxlKXt0aGlzLnBpeGVsPWE7dGhpcy5vcHRzPWM7dGhpcy5hZE51bT1lfWZ1bmN0aW9uIGMoKXthLmEuZm9yRWFjaChlLGZ1bmN0aW9uKGIsYyl7YS5mLncoYi5waXhlbCxiLm9wdHMsYi5hZE51bSkmJmRlbGV0ZSBlW2NdfSl9dmFyIGU9e307YS5rLmEuYXpzeCgiaGlkZGVuQWRzOnVwZGF0ZWQiLGMpO3JldHVybnthZGQ6ZnVuY3Rpb24oZCxoLGcpe2Q9bmV3IGIoZCxoLGcpO2g9YS5hLmRpKCk7ZVtoXT1kO2MoKX0sY2hlY2tQaXhlbHM6Y319KCl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhiKXt2YXIgYz17d2luZG93OjAsdHJhbnNwYXJlbnQ6MSxvcGFxdWU6MixkaXJlY3Q6MyxncHU6NH07aWYoIkVNQkVEIj09PWIudGFnTmFtZSl2YXIgZD1hLmEuZ2V0QXR0cmlidXRlKGIsIndtb2RlIik7ZWxzZSBpZigiT0JKRUNUIj09PWIudGFnTmFtZSl7Yj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJhbSIpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXt2YXIgZj1iW2ddLGs9YS5hLmdldEF0dHJpYnV0ZShmLCJuYW1lIiksZj1hLmEuZ2V0QXR0cmlidXRlKGYsInZhbHVlIik7aWYoIndtb2RlIj09PWspe2Q9ZjticmVha319fXJldHVybiBkJiZjW2QudG9Mb3dlckNhc2UoKV18fDV9ZnVuY3Rpb24gZChiKXt0cnl7aWYoIWIpcmV0dXJuITE7dmFyIGM9YixkO2lmKCJESVYiPT09Yy50YWdOYW1lfHwiQSI9PT1jLnRhZ05hbWUpKGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRU1CRUQiKVswXSl8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk9CSkVDVCIpWzBdKSxjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKVswXSksY3x8KGM9Yik7MT09PWMubm9kZVR5cGUmJiJJTUciIT09Yy5ub2RlTmFtZSYmIkVNQkVEIiE9PWMubm9kZU5hbWUmJiJPQkpFQ1QiIT09Yy5ub2RlTmFtZSYmKGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRU1CRUQiKVswXXx8Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiT0JKRUNUIilbMF18fGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIklNRyIpWzBdfHxiKTtpZigiT0JKRUNUIj09PWMudGFnTmFtZSl7Zm9yKGI9MDtiPGMuY2hpbGRyZW4ubGVuZ3RoO2IrKylpZigibW92aWUiPT09Yy5jaGlsZHJlbltiXS5uYW1lfHwiTW92aWUiPT09Yy5jaGlsZHJlbltiXS5uYW1lKWQ9Yy5jaGlsZHJlbltiXS52YWx1ZTtjLm9iamVjdCYmYy5vYmplY3QuTW92aWU/ZD1jLm9iamVjdC5Nb3ZpZTpjLmRhdGEmJi0xIT09Yy5kYXRhLmluZGV4T2YoInN3ZiIpJiYoZD1jLmRhdGEpfSJFTUJFRCIhPT1jLnRhZ05hbWUmJiJJTUciIT09Yy50YWdOYW1lfHwhYy5zcmN8fChkPWMuc3JjKTtkfHwoZD1hLmEuYmYoYykpO3ZhciBnPWEuYWYuYShkLGMpO3JldHVybnthZFVSTDpkLGZsYXNoVmFyczpnfX1jYXRjaChmKXtyZXR1cm4hMX19ZnVuY3Rpb24gZihiKXt2YXIgYz1iLmVsLGg9Yi51cmwsZz1iLmZsYXNoVmFycyxmPWIuYWRJZHMsdD1hLmEuZHooZik7dGhpcy5nZXRGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdH07MT09PWIuYWRJZHMuc2tpbiYmKHRoaXMuYWRDb250ZW50PWIuYWRDb250ZW50KTsobmV3IEEpLmdldFRpbWUoKTt0aGlzLmFvPWY7dGhpcy5GSU5EX0FEX1RSSUVTPWYubnVtVHJpZXN8fDA7dmFyIHE9ZChjKTtpZihxJiZxLmFkVVJMJiZnKWZvcih2YXIgeSBpbiBxLmZsYXNoVmFycylxLmZsYXNoVmFycy5oYXNPd25Qcm9wZXJ0eSh5KSYmKGdbeV09cS5mbGFzaFZhcnNbeV0pO3EmJnEuZmxhc2hWYXJzJiYoZz1xLmZsYXNoVmFycyk7aWYoInN0cmluZyIhPT10eXBlb2YgaHx8ImRpdiI9PT1oLnRvTG93ZXJDYXNlKCl8fCJhIj09PWgudG9Mb3dlckNhc2UoKSloPXEmJnEuYWRVUkx8fCItIjtoJiYwIT09aC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6IikmJjAhPT1oLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6IikmJigiLy8iPT09aC5zdWJzdHJpbmcoMCwyKT9oPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCtoOiIvIj09PWhbMF0/aD13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wrIi8vIit3aW5kb3cubG9jYXRpb24uaG9zdCtoOihxPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKSxoPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCsiLy8iK3dpbmRvdy5sb2NhdGlvbi5ob3N0KyIvIitxKyhxPyIvIjoiIikraCkpOyJJRlJBTUUiIT09Yy50YWdOYW1lJiYiSU1HIiE9PWMudGFnTmFtZSYmLTE9PT1oLmluZGV4T2YoImdvb2dsZXN5bmRpY2F0aW9uIikmJihoPWguc3BsaXQoIj8iKVswXSk7dGhpcy56cj1mLmFkTnVtO3RoaXMuTU1BS19JRD1mLm1tYWtBZEtleT9mLm1tYWtBZEtleToibSIrdGhpcy56cjt0aGlzLnlnPWEuYS5kaSgpO3RoaXMuVEFHSUQ9YS5jLmF6O2EucC5oKHRoaXMueWcsYS5jLmF4LmEpO0JbdGhpcy56cl09dGhpczthLmQuaCh0aGlzLnpyLFtjXSk7dGhpcy5hZT1oO3RoaXMuYWE9YzthLmsuYS56YXhzKCJhZEVsZW1lbnRVcGRhdGUiKTt0aGlzLmlzSW5JZnJhbWU9KHRoaXMuV0lORE9XPWg9YS5hLmJlKHRoaXMuYWEpKSYmaCE9aC5wYXJlbnQ7dGhpcy5wcm94eVRyYWNraW5nRW5hYmxlZD10aGlzLmlzU1JFTWVhc3VyYWJsZT0hMTt0aGlzLmRlYnVnRGF0YT17dmVyc2lvbjoiMyIsdHJ1ZVZpc2libGVQZXJjZW50Om51bGwsdXBkYXRlOmZ1bmN0aW9uKGEpe3RoaXMudHJ1ZVZpc2libGVQZXJjZW50PWF9LGdldFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE7YT0ibnVtYmVyIj09PXR5cGVvZiB0aGlzLnRydWVWaXNpYmxlUGVyY2VudD93LnJvdW5kKDEwMCp0aGlzLnRydWVWaXNpYmxlUGVyY2VudCk6Ii0iO3JldHVybiB0aGlzLnZlcnNpb24rIjoiK2F9fTt0aGlzLnNldERpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgYjtiPW5ldyBhLnouaihjKTt0aGlzLklOSVRJQUxfV0lEVEg9cGFyc2VJbnQoYi53aWR0aCk7dGhpcy5JTklUSUFMX0hFSUdIVD1wYXJzZUludChiLmhlaWdodCl9O3RoaXMuc2V0RGltZW5zaW9ucygpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGcmJihnPXt9KTthLnAubChxYSk7dGhpcy5lZz1bXTt0aGlzLmVlPXt9O2EuYWEuZC5hKHRoaXMpO2EuYWEuZS5hKHRoaXMpO2EuYWUuYih0aGlzKTt0aGlzLkRmcFNsb3Q9KGYudHJhY2tlZEZyb21EZnBIZWFkZXJUYWd8fGYudHJhY2tlZEZyb21TbG90VGFnKSYmZi5zbG90TWFwcGluZ0lkP2EuYW4uYSgpW2Yuc2xvdE1hcHBpbmdJZF06YS5hbi5iKCk7YS5hLmR1KHthbGw6MzB9LHQpJiZhLmFvLmEodGhpcyk7dGhpcy5nZXRfd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZi5pbml0V2lkdGg/Zi5pbml0V2lkdGg6dGhpcy5JTklUSUFMX1dJRFRIP3RoaXMuSU5JVElBTF9XSURUSDohMX07dGhpcy5nZXRfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGYuaW5pdEhlaWdodD9mLmluaXRIZWlnaHQ6dGhpcy5JTklUSUFMX0hFSUdIVD90aGlzLklOSVRJQUxfSEVJR0hUOiExfTt0aGlzLmdldFNjcmVlblJlYWxFc3RhdGU9ZnVuY3Rpb24oKXt2YXIgYixjLGU9YS5jLncsZD1hLmMueDtiPXRoaXMuSU5JVElBTF9XSURUSDtjPXRoaXMuSU5JVElBTF9IRUlHSFQ7cmV0dXJuIGUmJmQmJmImJmM/dy5tYXgoMCx3Lm1pbigxLGIqYy8oZSpkKSkpOjB9O2EuYWMuZih0aGlzKTt0aGlzLmFnPWc7dGhpcy5haT0wO3RoaXMuYW49dGhpcy5hbT10aGlzLmFsPXRoaXMuYWs9dGhpcy5haj12b2lkIDA7dGhpcy5hcj1bXTt0aGlzLmFzPVtdO3RoaXMuYXQ9W107dGhpcy5hdj10aGlzLmF1PWEuci5hLmEuYTt0aGlzLmF4PWEuci5hLmIuYTt0aGlzLmF5PWEuci5hLmMuYTt0aGlzLmJhPXRoaXMuYXo9YS5yLmEuZC5hO3RoaXMuYmI9YS5yLmEuZS5hO3RoaXMuYnk9dGhpcy5ieD10aGlzLmJ3PXRoaXMuYnY9dGhpcy5idT10aGlzLmJ0PXRoaXMuYnM9dGhpcy5icj10aGlzLmJxPXRoaXMuYnA9dGhpcy5ibz10aGlzLmJtPXRoaXMuYmw9dGhpcy5iaz10aGlzLmJpPXRoaXMuYmg9dGhpcy5iZz10aGlzLmJmPXRoaXMuYmU9dGhpcy5iZD10aGlzLmJjPXZvaWQgMDt0aGlzLmNhPXRoaXMuYno9ITE7dGhpcy5jYj10aGlzLmN1PXRoaXMuY3Q9dm9pZCAwO3RoaXMuY2M9K25ldyBBKzEyZTQ7dGhpcy5jaT0rbmV3IEE7dGhpcy5jbD10aGlzLmNtPXZvaWQgMDt0aGlzLmNuPTA7dGhpcy5jaz1hLnIuYS5mLmE7dGhpcy5jZD0hMTt0aGlzLmN5PXZvaWQgMDt0aGlzLmR0PSExO3RoaXMuZGI9dm9pZCAwO3RoaXMuY2Y9dGhpcy5jZT0hMTt0aGlzLmFmPU51bWJlcih0aGlzLmVmKTt0aGlzLmVxPSExO3RoaXMuZHM9dGhpcy5jaD10aGlzLmRyPXRoaXMuY2c9MDt0aGlzLmRxPXRoaXMuYm49dm9pZCAwO3RoaXMuSVI1PXtNSU46e3g6dm9pZCAwLHk6dm9pZCAwfSxNQVg6e3g6dm9pZCAwLHk6dm9pZCAwfSxBUkVBOjB9O3RoaXMuZG09MDt0aGlzLmVwPXRoaXMuZGQ9ITE7dGhpcy5hcT17fTt0aGlzLmFxLmc9MDt0aGlzLmFxWzFdPTA7dGhpcy5hcVsyXT0wO3RoaXMuYXFbM109MDt0aGlzLmFxWzEzXT0wO3RoaXMuYXFbMF09MDt0aGlzLmFxWzRdPTA7dGhpcy5hcVs1XT0wO3RoaXMuYXFbNl09MDt0aGlzLmFxWzddPTA7dGhpcy5hcVs5XT0wO3RoaXMuYXFbOF09MDt0aGlzLmFxWzE1XT0wO3RoaXMuYXFbMTZdPTA7dGhpcy5hcVsyMV09MDt0aGlzLmFxWzIyXT0wO3RoaXMuYXFbMjNdPTA7dGhpcy5hcVszN109MDt0aGlzLmFxLnRjPTA7dGhpcy5hcVs0Nl09MDt0aGlzLmVzPVs1LDEwLDE1LDMwLDYwXTt0aGlzLmRvYT1bNSwxMCwxNSwzMCw2MF07dGhpcy53YXNFdmVySW5WaWV3PXRoaXMuaXNDdXJyZW50bHlUcmFuc3BhcmVudD10aGlzLmlzQ3VycmVudGx5U3RhY2tlZD12b2lkIDA7dGhpcy5hbj1iLmFkVHlwZXx8Yi5vcHRfcHJvcHMmJmIub3B0X3Byb3BzLmFkVHlwZXx8YS5kLmQoYyk7MD09PXRoaXMuYW4mJih0aGlzLldNT0RFPWsoYykpO2EuYS5idyh0aGlzLmFhKTtiLm9wdF9wcm9wcyYmYi5vcHRfcHJvcHMuY29tcG9uZW50cyYmKHRoaXMuY29tcG9uZW50cz1iLm9wdF9wcm9wcy5jb21wb25lbnRzLHRoaXMuaXNDb21wb3NpdGVBZD0hMCk7dmFyIHg9ITA7dGhpcy5kaXNhYmxlTWVhc3VyYWJpbGl0eT1mdW5jdGlvbigpe3g9ITF9O3RoaXMuZW5hYmxlTWVhc3VyYWJpbGl0eT1mdW5jdGlvbigpe3g9ITB9O3RoaXMuaXNNZWFzdXJhYmlsaXR5RGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXh9O3RoaXMudmlld2FiaWxpdHlNZXRob2Q9e307dGhpcy52aWV3YWJpbGl0eVBlcmNlbnQ9e3N0cmljdDoiLSIsc2ZyYW1lOiItIixwc2NvcGU6Ii0ifTt0aGlzLmlzVmFsaWRBZFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hLmJ1KHRoaXMuYWEpfTthLmsuYS56YXhzKCJhZEluaXRpYWxpemVkIix0aGlzKTthLmQuZyh0aGlzKX1mdW5jdGlvbiBnKGIsYyl7Zm9yKHZhciBkPTAsZz1jLmxlbmd0aDtkPGc7ZCsrKWEuai5jKGIsY1tkXSl9dmFyIGM9ITA7YS5kPXt9O2EuZC5mPWZ1bmN0aW9uKGIsYyxkLGcscCx0LHEpe3R8fGEuZi5hZyhwKTt2YXIgeTt5PTE9PWFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOntlbDpiLHVybDpjLGZsYXNoVmFyczpnLGFkSWRzOnAsb3B0X3Byb3BzOnF9O2lmKGEueC5lLmEmJjE9PXAuc2tpbil7dmFyIHg7eD1hLnguZS5hKGIscCk7eS5hZENvbnRlbnQ9eH1pZih0KXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIHQpcmV0dXJuIHQoYixjLGcscCk7bmV3IEE7dC5lbT0hMDtCW3QuenJdPXQ7YltNXT10LnpyO2JbRF09ITA7dC5hYT1iO2Euay5hLnpheHMoImFkRWxlbWVudFVwZGF0ZSIpO3QuSU5JVElBTF9XSURUSD1iLm9mZnNldFdpZHRoO3QuSU5JVElBTF9IRUlHSFQ9Yi5vZmZzZXRIZWlnaHQ7dC5hZT1jO3QuYW49YS5kLmQoYik7MD09PXQuYW4mJih0LldNT0RFPWsoYikpO3QuYWc9Z3x8e307YS5qLmQodCk7eT17ZTowfTt5LnE9dC5hcVswXSsrO2EueS5hKHQseSk7YS5rLmEuemF4cygiYWRMb2FkZWQiLHQpO3JldHVybiB0fXJldHVybiBCW3AuYWROdW1dP0JbcC5hZE51bV06bmV3IGYoeSl9O2EuZC5nPWZ1bmN0aW9uKGIpe2IuZGU9aXNOYU4oYi5hby5zdGFydFRpbWUpPytuZXcgQTpiLmFvLnN0YXJ0VGltZTtiLlJBTkQ9Yi5hby5yYW5kOyhuZXcgQSkuZ2V0VGltZSgpO2Eudy5kKGIpO2EuYy5jfHxhLmFsLmEuYSgpO2Euai5kKGIpO2EuYS5lYShbImZlYXRoZXIiLCJkaXNwbGF5IiwidmlkZW8iXSxiLmFvKSYmYS50Lm0oIm5ld2FkIixiLnpyKTtiLmFhLnBhcmVudE5vZGUmJiJzd2lmZnljb250YWluZXIiPT09Yi5hYS5wYXJlbnROb2RlLmlkJiZhLnUuYihbIi4uLi4vLi4vaWZyYW1lIH4gI2NsaWNrdGFnIl0sYixiLmFhLnBhcmVudE5vZGUpO2Euay5hLnpheHMoInN0YXJ0QWRUcmFja2luZyIsYik7Yi5kZD0hMDt2YXIgYz17ZTowfTtjLnE9Yi5hcVswXSsrO2EueS5hKGIsYyk7YS5hbS5hKGIpO2Euay5hLnpheHMoImFkTG9hZGVkIixiKX07YS5kLmI9ZnVuY3Rpb24oKXt2YXIgYixjO2ZvcihjIGluIEIpQi5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9QltjXSkmJiFiLmVwJiZhLmFjLmcoYil9O2EuZC5lPWZ1bmN0aW9uKGIpe3ZhciBjPStuZXcgQSxkPWMtYi5jaTtpZigwPGIuZG9hLmxlbmd0aCl7dmFyIGc9MWUzKmIuZG9hWzBdO2lmKGIuY291bnRlcnMubGF4RHdlbGwudEN1cj49Zyl7Yi5kb2Euc2hpZnQoKTt2YXIgZj1iLmVzLmxlbmd0aD9iLmVzWzBdOjYwO2lmKGc8ZilyZXR1cm4hMTtpZig1ZTM8ZClyZXR1cm4hMH19cmV0dXJuIDA8Yi5lcy5sZW5ndGgmJihmPTFlMypiLmVzWzBdLGEudy5pKGIsZikpPyhiLmVzLnNoaWZ0KCksITApOjA9PT1iLmRvYS5sZW5ndGgmJmM+Yi5jYz8oYi5jYyo9MiwhMCk6ITF9O2EuZC5oPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBnPWNbZF07Z1tNXT1hO2dbRF09ITB9fTthLmQuZD1mdW5jdGlvbihhKXtyZXR1cm4iSUZSQU1FIj09PWEudGFnTmFtZT8yOiJJTUciPT09YS50YWdOYW1lPzE6IkVNQkVEIj09PWEudGFnTmFtZXx8Ik9CSkVDVCI9PT1hLnRhZ05hbWU/MDozfTthLmQuaT1mdW5jdGlvbihiLGMpe2EuYS5hKGMuY2MpO2EuZC5qKGMpfTthLmQuaz1mdW5jdGlvbihhLGMpe307YS5kLmE9ZnVuY3Rpb24oYixjKXt2YXIgZD0wLGc7Zm9yKGcgaW4gQilCLmhhc093blByb3BlcnR5JiZCLmhhc093blByb3BlcnR5KGcpJiZkKys7cmV0dXJuIGQ8PShjfHwwKT8oYS5rLmEuZXNnZigiYWxsTG9jYWxBZHNLaWxsZWQiKSwhMCk6ITF9O2EuZC5sPWZ1bmN0aW9uKGEpe2EuZXA9ITA7ZGVsZXRlIEJbYS56cl07dHJ5e2EuYWEmJihhLmFhW0RdPW51bGwsYS5hYVtNXT1udWxsLGEuYWE9bnVsbCxhLkRmcFNsb3Q9bnVsbCl9Y2F0Y2goYyl7fWEuZ3JvdXBtVjI9bnVsbDthLmdyb3VwbVYzPW51bGw7YS5wZXJpc2NvcGVNYW5hZ2VyPW51bGw7YS5zZWNvbmRhcnlDb3VudGVycz1udWxsO2EubW91c2VFdmVudEVsZW1lbnRzPW51bGw7YS5wdWJsaWNpcz1udWxsfTthLmQuaj1mdW5jdGlvbihiKXtpZihiJiZiLnZpZGVvJiYhYi52aWRlby5zdGFydGVkKXJldHVybiExO3ZhciBjPXtlOjIxfTtjLnE9Yi5hcVsyMV0rKzthLnkuYShiLGMpO2IudW5sb2FkUGl4ZWxTZW50PSEwfTthLmQubT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS52aWRlb307YS5rLmEuYXpzeCgiYWRLaWxsZWQiLGEuZC5pLHtpbmNsdWRlSWQ6ITB9KTthLmsuYS5henN4KCJhZE5vdEZvdW5kIixhLmQuayx7aW5jbHVkZUlkOiEwfSk7YS5kLm49ZzthLmQubz1mdW5jdGlvbihiLGMsZCxmLHAsayxxLHkpe3ZhciB4PXthcmVhOjB9O2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYil7dmFyIGM9bmV3IGEuei5qKGIpO2MuYXJlYT1jLmhlaWdodCpjLndpZHRoO2MmJmMuYXJlYT49eC5hcmVhJiYoeD1iLHguYXJlYT1jLmFyZWEpfSk7cC5hZEZpbmRpbmdNZXRob2Q9Ik1VTFRJUEFSVF9BRFMiO2lmKGM9YS5kLmYoeCxjLGQsZixwLGsscSkpcmV0dXJuIGMuaXNNdWx0aXBhcnRBZD0hMCxjLm11bHRpcGFydENvbXBvbmVudHM9YixhLmEuaCh5KSYmeS5sZW5ndGg9PT1iLmxlbmd0aD9nKGMseSk6ZyhjLGIpLGN9O2EuZC5wPWZ1bmN0aW9uKGIsYyxkLGYscCxrLHEseSl7cT1xfHx7fTtxLmNvbXBvbmVudHM9YjtwLmFkRmluZGluZ01ldGhvZD0iQ09NUE9TSVRFX0FEUyI7aWYoYz1hLmQuZihiWzBdLGMsZCxmLHAsayxxKSlyZXR1cm4gYy5pc0NvbXBvc2l0ZUFkPSEwLGMuY29tcG9uZW50cz1iLGEuYS5oKHkpJiZ5Lmxlbmd0aD09PWIubGVuZ3RoP2coYyx5KTpnKGMsYiksY307YS5kLnE9ZnVuY3Rpb24oKXtjPSExfTthLmQucj1mdW5jdGlvbigpe2M9ITB9O2EuZC5jPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT1jfX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGEpe3ZhciBkPVtdO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuITE7Zm9yKHZhciBnLGY9ITEsaz0vKC4qP1teXFxdKSg/OlxcXFwpKlwvLzthOyl7aWYoYyhhLCIuLi4vIikpZz0iLi4uLyI7ZWxzZSBpZihjKGEsIi4uLi4uLyIpKWc9Ii4uLi4uLyI7ZWxzZSBpZihjKGEsIi4uLyIpfHxjKGEsIi4uLi4vIikpe2c9YyhhLCIuLi8iKT8iLi4vIjoiLi4uLi8iO2Zvcih2YXIgcT1nLmxlbmd0aDtjKGEuc3Vic3RyaW5nKHEpLGcpOylxKz1nLmxlbmd0aDtnPWEuc3Vic3RyaW5nKDAscSl9ZWxzZSBjKGEsIj0+LyIpP2c9Ij0+LyI6YyhhLCItLyIpP2c9Ii0vIjpjKGEsIisvIik/Zz0iKy8iOmMoYSwiJFsiKT8oZz1hLmxlbmd0aCxxPWIoYSwiXS8iKSsyLGc9YS5zdWJzdHJpbmcoMCx3Lm1pbihnLHEpKSk6YyhhLCJeLyIpP2c9Il4vIjpjKGEsIklOX0lGUkFNRS8iKT9nPSJJTl9JRlJBTUUvIjpjKGEsIklOX1hfRlJBTUUvIik/Zz0iSU5fWF9GUkFNRS8iOihjKGEsIiR7Iik/KGc9YS5sZW5ndGgscT1iKGEsIn0vIikrMixnPWEuc3Vic3RyaW5nKDAsdy5taW4oZyxxKSkpOmc9KGY9ay5leGVjKGEpKSYmZlswXT9mWzBdOmEsZj0hMCk7KGE9YS5zdWJzdHJpbmcoZy5sZW5ndGgpKSYmZiYmKGc9Zy5zdWJzdHJpbmcoMCxnLmxlbmd0aC0xKSxmPSExKTtkLnB1c2goZyl9cmV0dXJuIGR9ZnVuY3Rpb24gZChiKXtpZighYilyZXR1cm4hMTtpZighYS5jLmp8fDEwPGEuYS5zKCl8fGIucXVlcnlTZWxlY3RvckFsbCYmYi5xdWVyeVNlbGVjdG9yJiYoIWIuTW9hdFFTU2hpbVNldHx8YltnXSkpcmV0dXJuITA7Yi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe2E9dGhpcy5xdWVyeVNlbGVjdG9yQWxsKGEpO3JldHVybiBhLmxlbmd0aD9hWzBdOm51bGx9O2IucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbihhKXt2YXIgYj1bXSxjPXRoaXMub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQsZD1jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7KGM9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdKSYmYy5pbnNlcnRCZWZvcmUoZCxjLmNoaWxkTm9kZXNbdy5tYXgoYy5jaGlsZE5vZGVzLmxlbmd0aC0xLDApXXx8bnVsbCk7ZCYmZC5zdHlsZVNoZWV0JiYoZC5zdHlsZVNoZWV0LmNzc1RleHQ9YSsie3NoaW10ZXN0OmJhcn0iKTthPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IodmFyIGM9YS5sZW5ndGgsZT0wO2U8YztlKyspYVtlXS5jdXJyZW50U3R5bGUmJiJiYXIiPT09YVtlXS5jdXJyZW50U3R5bGUuc2hpbXRlc3QmJihiW2IubGVuZ3RoXT1hW2VdKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIGJ9O2IuTW9hdFFTU2hpbVNldD0hMDtyZXR1cm4gYltnXT0hMH1mdW5jdGlvbiBmKGIsaCxnKXtmdW5jdGlvbiBmKGEpe2lmKHgmJjA8eC5sZW5ndGgpZm9yKHZhciBiPXgubGVuZ3RoLGM9MDtjPGI7YysrKWE9YS5yZXBsYWNlKCIkIitjLHhbY10pO3JldHVybiBhfXZhciB0PWZ1bmN0aW9uKGIsYyl7aWYoIWJ8fCFjKXJldHVybiExO2lmKGIubWF0Y2hlcylyZXR1cm4gYi5tYXRjaGVzKGMpO2lmKCFkKGIucGFyZW50Tm9kZSkpcmV0dXJuITE7dmFyIGU9Yi5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYyk7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm4hMTt2YXIgaD0hMTthLmEuZm9yRWFjaChlLGZ1bmN0aW9uKGEpe2E9PT1iJiYoaD0hMCk7cmV0dXJuIWh9KTtyZXR1cm4gaH07Yj1rKGIpO2lmKCFiKXJldHVybiExO2Zvcih2YXIgcT1oLHk9MCx4PVtdLG49ZnVuY3Rpb24oYil7cmV0dXJuIGImJmEuZy5iKGIpfSxtPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnBhcmVudEVsZW1lbnR9LEk9ZnVuY3Rpb24oYil7cmV0dXJuIGI/KGI9YS5nLmUoYikpJiZiLmJvZHk6ITF9LEc9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhPyhhPWEuZ2V0QXR0cmlidXRlKGIpKSYmKGM9bmV3IFJlZ0V4cChjKS5leGVjKGEpKSYmYy5sZW5ndGgmJjA8Yy5sZW5ndGg/Y1tjLmxlbmd0aC0xXTohMTohMX0sSj0wO0o8Yi5sZW5ndGgmJjEwMD55O0orKyl7dmFyIEM9YltKXTtjKEMsIiR7IikmJihDPUMuc3Vic3RyaW5nKDIsQy5sZW5ndGgtMSkpO2lmKGMoQywiLi4vIil8fGMoQywiLi4uLi8iKSl7dmFyIHosSztjKEMsIi4uLyIpPyh6PSIuLi8iLEs9bSk6KHo9Ii4uLi4vIixLPW4pO2lmKDAhPT1DLmxlbmd0aCV6Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIEU9MDtFPEMubGVuZ3RoL3oubGVuZ3RoO0UrKyl7aWYoIXF8fCJIVE1MIj09PXEubm9kZU5hbWUpcmV0dXJuITE7cT1LKHEpO3krK319ZWxzZSBpZigiLi4uLyI9PT1DKWZvcihDPWJbSisxXSYmZihiW0orMV0pOzEwMD55Oyl7aWYocSYmdChxLEMpKXtKKys7YnJlYWt9aWYoIXF8fCJIVE1MIj09PXEubm9kZU5hbWUpcmV0dXJuITE7cT1xLnBhcmVudEVsZW1lbnQ7eSsrfWVsc2UgaWYoIi4uLi4uLyI9PT1DKXtxPWEuYy5lJiZhLmMuZS5kb2N1bWVudCYmYS5jLmUuZG9jdW1lbnQuYm9keTtpZighcSlyZXR1cm4hMTt5Kyt9ZWxzZSBpZigiPT4vIj09PUMpe3E9SShxKTtpZighcSlyZXR1cm4hMTt5Kyt9ZWxzZSBpZigiLS8iPT09Qyl7cT1hLmEucHJldmlvdXNFbGVtZW50U2libGluZyhxKTtpZighcSlyZXR1cm4hMTt5Kyt9ZWxzZSBpZigiKy8iPT09Qyl7aWYocT1hLmEubmV4dEVsZW1lbnRTaWJsaW5nKHEpLCFxKXJldHVybiExfWVsc2UgaWYoYyhDLCIkWyIpKWlmKEM9KHo9KEM9Qy5zdWJzdHJpbmcoMixDLmxlbmd0aC0yKSkmJkMuc3BsaXQoInwiKSkmJnpbMF0sej16JiZ6WzFdLEMmJnopaWYoQz1HKHEsQyx6KSl4LnB1c2goQykseSsrO2Vsc2UgcmV0dXJuITE7ZWxzZSByZXR1cm4hMTtlbHNlIGlmKCJeLyI9PT1DKXtxPWg7aWYoIXEpcmV0dXJuITE7eSsrfWVsc2UgaWYoIklOX0lGUkFNRS8iPT09Qyl7aWYoIWEuYy5wKXJldHVybiExO3krK31lbHNlIGlmKCJJTl9YX0ZSQU1FLyI9PT1DKXtpZighYS5jLmVuKXJldHVybiExO3krK31lbHNlIGlmKEM9ZihDKSwhdChxLEMpKXtpZighZChxKSlyZXR1cm4hMTtxPXEucXVlcnlTZWxlY3RvckFsbChDKTtpZihnJiZKPT09Yi5sZW5ndGgtMSlyZXR1cm4gcT9xOiExO2lmKCFxfHwxIT09cS5sZW5ndGgpcmV0dXJuITE7cT1xWzBdfX1yZXR1cm4gcX1hLnU9e307dmFyIGc9Ik1vYXRRU1NoaW1PcmRfUkVVVEVSU19IRUFERVIxXyIrYS5jLmJqLGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWEuaW5kZXhPZihiKSYmYn0sYj1mdW5jdGlvbihhLGIpe3ZhciBjPWEuaW5kZXhPZihiKTtyZXR1cm4gMD5jP2EubGVuZ3RoKzE6Y307YS51LmE9ZnVuY3Rpb24oYixjKXt2YXIgZD1bXTthLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGEpeyhhPWYoYSxjKSkmJmQucHVzaChhKX0pO3JldHVybiBkfTthLnUuYz1mdW5jdGlvbihiLGMpe3ZhciBkPVtdO2EuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYSl7aWYoYT1mKGEsYywhMCkpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfSk7cmV0dXJuIGR9O2EudS5iPWZ1bmN0aW9uKGIsYyxkKXtiPWEudS5hKGIsZCk7YS5hLmZvckVhY2goYixmdW5jdGlvbihiKXthLmouYyhjLGIpfSk7cmV0dXJuISFifX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGIsYyxkLGUsZyxoKXtofHwoaD13aW5kb3cpO2Eudi5kPWI7dmFyIGY9YS52LmYsbD1hLnYuZyxrPWEudi5oLHA9MCxtPWZ1bmN0aW9uKCl7dmFyIGc7Yy5udW1Ucmllcz1wKys7aWYoYS5jLmVvJiZhLnYuZShtLG51bGwsYyl8fGEuYy5lcCYmYS52LmUobSxudWxsLGMpfHxhLmcuaihoKSYmaC5lYkNmZyYmNDM9PWguZWJDZmcuZm9ybWF0SWQmJjE9PWguZWJDZmcuZGxtJiYoYS5jLmVxPSEwLGEudi5lKG0sbnVsbCxjKSkpcmV0dXJuITA7aWYoIWcpdHJ5e2wmJihnPWwoYixjLGQsZSxudWxsLGgpKX1jYXRjaChrKXt9aWYoIWcmJihnPWYoYixjLGQsZSxudWxsLGgpLCEwPT09ZykpcmV0dXJuITA7aWYoYS5hLmVhKG4sYykpe3ZhciB6PSEhYy5hY3RpdmVDb25maWc7ZyYmYS50Lm8oZyk7Yy5hY3RpdmVDb25maWcmJiF6JiYoYy5hZEZpbmRpbmdNZXRob2Q9InN0cmluZyI9PT10eXBlb2YgYy5hZEZpbmRpbmdNZXRob2Q/IkV4cHM6ICIrYy5hY3RpdmVDb25maWcrIiB8ICIrYy5hZEZpbmRpbmdNZXRob2Q6IkV4cHM6ICIrYy5hY3RpdmVDb25maWcpO2c9ZyYmZyE9PWEudC5pfWVsc2UgZz1nJiYhMDtyZXR1cm4gZ307aWYoYS5jLmMmJmEuYS5lYShuLGMpKXt2YXIgdCxxO2MmJih0PSJza2luImluIGMmJjE9PWMuc2tpbixxPSJmb3JtYXQiaW4gYyYmIldhbGxwYXBlciI9PWMuZm9ybWF0KTtpZih0fHxxKSJ3aWR0aCI9PWEueC5iJiZhLnguZCgpLGMuc2tpbj0xLHQ/KGMuaXNTa2luPTEsYy5hZEZpbmRpbmdNZXRob2Q9InNraW4xIik6cSYmKGMuaXNBb2xTa2luPTEsYy5hZEZpbmRpbmdNZXRob2Q9IkFPTCBTa2luIiksbT1mdW5jdGlvbigpe3ZhciBiPWEuYy5lLmRvY3VtZW50LmJvZHk7Yy5udW1Ucmllcz1wKys7aWYoYS54LmUuYShiLGMpKXtpZihiJiZhLmEuYnQoYikpdmFyIGU9YS5hLmJmKGIpLGU9YS5kLmYoYixlfHxiLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpO3JldHVybiBlJiYhMH19fWc9YS5hLmJpbmQobnVsbCxmdW5jdGlvbihiKXthLnkuYigxMSxiKX0sYyk7YS5sLmsobSxrLDUwMCxnKX1mdW5jdGlvbiBkKGIsYyxkLGUsZyl7dmFyIGgsZixsLGssbj1hLmMuZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXllRGl2Iik7aWYoTCYmTC5pZCYmMDw9TC5pZC5pbmRleE9mKCJlYmViRG5sU2NyaXB0Iikpe3ZhciBwPUwuaWQuc3BsaXQoIl8iKTtwJiYzPT09cC5sZW5ndGgmJihsPXBbMV0saz1wWzJdKX1sPWx8fGcuZWJBZElEO2s9a3x8Zy5lYlJhbmQ7bCYmayYmKGY9bCsiXyIrayk7aWYoZiYmIm9iamVjdCI9PT10eXBlb2YgZy5lYkFkcyYmZy5lYkFkc1tmXSYmKGs9Zy5lYkFkc1tmXS52aXNpYmlsaXR5TWdyJiZnLmViQWRzW2ZdLnZpc2liaWxpdHlNZ3IuX3JlcykmJmEuYS5idChrKSYmKGMuYWRGaW5kaW5nTWV0aG9kPSJTSVpNRUtBRFMiLGg9YS5kLmYoayxrLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpKSlyZXR1cm4gaDtpZihoPWZ1bmN0aW9uKCl7dmFyIGI9W10sZT1hLnUuYShbImlmcmFtZVtpZCo9J2hlYWRlcl9pZnJhbWVfIitmKyInXSJdLG4pWzBdLGc9YS51LmEoWyJpZnJhbWVbaWQqPSdsZWZ0Z3V0dGVyX2lmcmFtZV8iK2YrIiddIl0sbilbMF0sbD1hLnUuYShbImlmcmFtZVtpZCo9J3JpZ2h0Z3V0dGVyX2lmcmFtZV8iK2YrIiddIl0sbilbMF07aWYoZSlpZihhLmEuYnQoZSkpYi5wdXNoKGUpO2Vsc2UgcmV0dXJuITE7aWYoZylpZihhLmEuYnQoZykpYi5wdXNoKGcpO2Vsc2UgcmV0dXJuITE7aWYobClpZihhLmEuYnQobCkpYi5wdXNoKGwpO2Vsc2UgcmV0dXJuITE7aWYoYiYmMDxiLmxlbmd0aCYmKGg9YS5kLnAoYixiWzBdLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IlNJWk1FS0FEUy0xIixofSgpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD1hLmMuZXE/IlNJWk1FS0FEUy1Db21wb3NpdGUtUEwiOiJTSVpNRUtBRFMtQ29tcG9zaXRlIixoO2lmKGEuYy5lcSlyZXR1cm4hMTtpZihsJiZnLmdFYkJhbm5lcnMmJmEuYS5mKGcuZ0ViQmFubmVycykpe3ZhciBtPSExO2EuYS5mb3JFYWNoKGcuZ0ViQmFubmVycyxmdW5jdGlvbihhKXtpZihhJiZhLmFkRGF0YSYmYS5hZERhdGEubkFkSUQ9PWwpcmV0dXJuIG09YSwhMX0pO2lmKG0mJihnPW0uZGlzcGxheVVuaXQmJm0uZGlzcGxheVVuaXQuZGVmYXVsdFBhbmVsJiZtLmRpc3BsYXlVbml0LmRlZmF1bHRQYW5lbC5wYW5lbERpdikmJmcubm9kZU5hbWUmJiJkaXYiPT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJihoPXkoZyxjLGQsZSkpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iU0laTUVLQURTIGJhbm5lciIsaH1nPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2c9YS5hLmNnKGcpOyJESVYiPT09Yi5ub2RlTmFtZSYmZy5wdXNoKGIpO2lmKGcmJjA8Zy5sZW5ndGgpe3ZhciB0PVtdO2EuYS5mb3JFYWNoKGcsZnVuY3Rpb24oYSl7YSYmYS5pZCYmYS5pZC5tYXRjaCgvZWJEaXZcZCsvKSYmdC5wdXNoKGEpfSk7aWYodCYmMDx0Lmxlbmd0aCYmYS5jLmUmJmEuYy5lLmRvY3VtZW50KXt2YXIgcTthLmEuZm9yRWFjaCh0LGZ1bmN0aW9uKGIpe3ZhciBjPWEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO2lmKGMmJmMhPT1iKXJldHVybiBxPWMsITF9KTtpZihxKXtpZihoPXkocSxjLGQsZSkpcmV0dXJuIGg7aWYocSYmYS5hLmJ0KHEpJiZlKHEpKXtpZihjLmFkRmluZGluZ01ldGhvZD0iU0laTUVLQURTIGFkRHZpIixoPWEuZC5mKHEscS5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkKSlyZXR1cm4gaH1lbHNle2I9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIik7Zz1xLmlkLnNwbGl0KCJlYkRpdiIpWzFdO3ZhciB4PW5ldyBSZWdFeHAoImViQmFubmVySUZyYW1lX1xcZCtfIitnKSxyO2lmKGImJjA8Yi5sZW5ndGgmJihhLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGIpe2lmKGImJmIuaWQmJmIuaWQubWF0Y2goeCkmJmEuYS5idChiKSlyZXR1cm4gcj1iLCExfSksciYmZShyKSYmKGMuYWRGaW5kaW5nTWV0aG9kPSJTSVpNRUtBRFMgYmFubmVyIGlmcmFtZSIsaD1hLmQuZihyLHIubm9kZU5hbWUsITEsdm9pZCAwLGMsZCkpKSlyZXR1cm4gaH19fX1pZihmJiZuJiYoKGU9YS51LmEoWyJkaXZbaWQqPSciK2YrIiddIl0sbilbMF0pfHwoZT1hLnUuYShbImRpdltpZF49J2ViJ11baWQqPSciK2YrIiddIl0sbilbMF0pLGUmJigoaD15KGUsYyxkKSl8fGEuYS5idChlKSYmKGMuYWRGaW5kaW5nTWV0aG9kPSJTSVpNRUtBRFMtQnJlYWtvdXQiLGg9YS5kLmYoZSxlLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpKSkpKXJldHVybiBofWZ1bmN0aW9uIGYoYixjLGQsZSxnKXtmdW5jdGlvbiBoKGIpe3JldHVybiBiP2EudS5hKFsiZGl2Lmpwc3RhZ2UiXSxiKVswXXx8ITE6ITF9dmFyIGY9aChiKSxsPWEuYy5lLmRvY3VtZW50O2UmJiFmJiYoZj1hLnUuYShbIi4uLi4vLi4vZGl2LmpwcGxhdGZvcm1fIitlLCIuLi4uLi9kaXZbaWQ9J2pwcGxhdGZvcm1fIitlKyInXSIsIi4uLi4uL2Rpdi5qcHBsYXRmb3JtXyIrZV0sYilbMF0pO2Z8fChmPWgobC5nZXRFbGVtZW50QnlJZCgianBzdXBlcmhlYWRlciIpKSk7Znx8KGY9aChhLmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgianBlZGl0b3JpYWx1bml0IiwiRElWIixsLmJvZHkpWzBdKSk7Znx8KGY9aChsLmdldEVsZW1lbnRCeUlkKCJqcGRfYWRoZXNpb24iKSkpO2Z8fChiPShiPWwuZ2V0RWxlbWVudEJ5SWQoImpwX292ZXJsYXkiKXx8ZSYmbC5nZXRFbGVtZW50QnlJZCgianBfb3ZlcmxheV8iK2UpKSYmYS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImpwcGFuZWwiLCJESVYiLGIpKSYmMTw9Yi5sZW5ndGgmJmEuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYil7aWYoYiYmYS5hLmJ0KGIpKXJldHVybiBmPWIsITF9KTtmfHwobD1sLmdldEVsZW1lbnRCeUlkKCJqcGRfZXhwZm9vdGVyIiksZj1oKGwpKTtpZihmJiZhLmEuYnQoZikmJmcoZikmJihjLmFkRmluZGluZ01ldGhvZD0iSkVUUEFDS0RJR0lUQUxBRFMiLGFkPWEuZC5mKGYsZi5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkKSkpcmV0dXJuIGFkfWZ1bmN0aW9uIGcoYixjLGQsZSl7aWYoKGI9YS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm9yaWdpbnBsYXRmb3JtLWFkIiwiU0NSSVBUIixhLmMucT9iLm93bmVyRG9jdW1lbnQmJmIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGI6YilbMF0pJiZiLmlkJiYoYj1iLmlkLm1hdGNoKC9lbWJlZF9vcmlnaW5fKFxkKykvKSkmJmJbMV0mJihiPSJPcmlnaW5QbGF0Zm9ybUFkVW5pdC0iK2JbMV0rIi1pbnBhZ2UiLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYil8fGEuYy5xJiZhLmMuZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSkmJihjLmFkRmluZGluZ01ldGhvZD0iT1JJR0lOQURTIixjPWEuZC5mKGIsYi5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkKSkpcmV0dXJuIGN9ZnVuY3Rpb24gYyhiLGMsZCxlKXt2YXIgZyxoLGYsbD1iLmNoaWxkTm9kZXMsaz0hMTtmb3IoZz1sLmxlbmd0aC0xOzA8PWc7Zy0tKXt2YXIgbj1sW2ddOyIjY29tbWVudCI9PT1uLm5vZGVOYW1lJiYvdW5kZXJ0b25lL2kudGVzdChuLm5vZGVWYWx1ZSk/az0hMDoiU1RZTEUiPT09bi5ub2RlTmFtZSYmKG49bi5pbm5lckhUTUwubWF0Y2goLyh1dHBnYVxkKykuKy9pKSkmJjI9PT1uLmxlbmd0aCYmKGY9blsxXSl9aWYoayl7Zz1hLmMucT8oZz1hLmcuZyhiKSkmJmcub3duZXJEb2N1bWVudD9nLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ6ZG9jdW1lbnQ7ZiYmKGg9Zy5nZXRFbGVtZW50QnlJZChmKSwhaCYmYS5jLnEmJihoPWRvY3VtZW50LmdldEVsZW1lbnRzQnlJZChmKSkpO2h8fChmPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLGEuYS5mb3JFYWNoKGYsZnVuY3Rpb24oYSl7aWYoYSYmYS5pZCYmYS5pZC5tYXRjaCgidXRwZ2EiKSlyZXR1cm4gaD1hLCExfSksIWgmJmEuYy5xJiYoZj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IiksYS5hLmZvckVhY2goZixmdW5jdGlvbihhKXtpZihhJiZhLmlkJiZhLmlkLm1hdGNoKCJ1dHBnYSIpKXJldHVybiBoPWEsITF9KSkpO2lmKGgmJigoZj15KGgsYyxkLGUpKXx8YS5hLmJ0KGgpJiZlKGgpJiYoYy5hZEZpbmRpbmdNZXRob2Q9IlVOREVSVE9ORSBwYWdlR3JhYmJlckRpdiIsZj1hLmQuZihoLGgubm9kZU5hbWUsITEsdm9pZCAwLGMsZCkpKSlyZXR1cm4gZjtpZigoZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXRiYW5uZXIiKXx8YS5jLnEmJmEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1dGJhbm5lciIpKSYmKGY9YS5nLmUoZikpJiZmLmJvZHkmJihmPXkoZi5ib2R5LGMsZCxlKSkpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJVTkRFUlRPTkUgZnVsbFBhZ2VBZElmcmFtZSIsZjtpZigoZj1hLmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidXRfY29udGFpbmVyIiwiRElWIilbMF18fGEuYy5xJiZhLmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidXRfY29udGFpbmVyIiwiRElWIixhLmMuZS5kb2N1bWVudClbMF0pJiZhLmEuYnQoZikmJmUoZikpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJVTkRFUlRPTkUgc2NyZWVuc2hpZnQiLGY9YS5kLmYoZixmLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQse2FkVHlwZToyfSk7aWYoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXllRGl2Iil8fGEuYy5xJiZhLmMuZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXllRGl2IikpZm9yKGQ9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksZz0wO2c8ZC5sZW5ndGg7ZysrKWlmKGY9ZFtnXSwiZml4ZWQiPT1mLnN0eWxlLnBvc2l0aW9uJiZhLmEuYnQoZikmJmUoZikpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJVTkRFUlRPTkUgc2xpZGVyIixmPWEuZC5mKHtlbDpmLGFkSWRzOmN9KX19ZnVuY3Rpb24gYihiLGMsZCxlLGcpe2lmKChiPWMudGx2aWV3X2lkfHxjLnRsdmlld0lEKSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYil8fGEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKSYmYS5hLmJ0KGIpJiYoYz1hLmQuZihiLGIubm9kZU5hbWUsITEsdm9pZCAwLGMsZCkpKXJldHVybiBjfWZ1bmN0aW9uIGUoYixjLGQsZSxnKXtpZihiPWEudi5rKFsiW3RsZWlkXSJdLGIsYyxkKSlyZXR1cm4gYn1mdW5jdGlvbiBoKGIsYyxkLGUsZyl7aWYoZy5fdGxDcmVhdGl2ZXMmJjE9PT1nLl90bENyZWF0aXZlcy5sZW5ndGgmJmcuX3RsQ3JlYXRpdmVzWzBdLmhvb2smJihjPShiPWcuX3RsQ3JlYXRpdmVzWzBdLmhvb2spJiZhLnYuayhbIi0vW3RsZWlkXSJdLGIsYyxkKSkpcmV0dXJuIGN9ZnVuY3Rpb24gbChiLGMsZCxlLGcsaCl7dmFyIGYsbCxrLG4sbT1bXTtpZihmPWU/ZTpoLkFkZm9ybSYmaC5BZGZvcm0uQURGQmFubmVyRGF0YSYmInN0cmluZyI9PT10eXBlb2YgaC5BZGZvcm0uQURGQmFubmVyRGF0YS5CTiYmaC5BZGZvcm0uQURGQmFubmVyRGF0YS5CTil7aWYoZT0oYj1oLkFkZm9ybSYmaC5BZGZvcm0uYWRSZWdpc3RlcikmJmJbZl0paz1lLmNvbGxhcHNlZENvbnRlbnQmJmUuY29sbGFwc2VkQ29udGVudC5fZWxlbWVudCxuPWUuZXhwYW5kZWRDb250ZW50JiZlLmV4cGFuZGVkQ29udGVudC5fZWxlbWVudCxsPWUuYWRCb3gmJmUuYWRCb3guX2F0dHJpYnV0ZXMmJmUuYWRCb3guX2F0dHJpYnV0ZXMuZWxlbWVudDtsfHxhLmEuZm9yRWFjaChoLkFkZm9ybSYmaC5BZGZvcm0uYWREYXRhLGZ1bmN0aW9uKGEpe2lmKGw9YSYmYS5ibiYmYS5ibj09ZiYmYS5jb250YWluZXIpcmV0dXJuITF9KTtpZihrJiZuJiYoYS5hLmJ0KGspfHxhLmEuYnQobikpJiYoYy5hZEZpbmRpbmdNZXRob2Q9IkFERk9STUFEUyB0d28tZWxlbWVudCBleHBhbmRhYmxlIixoPWEuZC5mKGssay5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkLHthZFR5cGU6Mn0pKSlyZXR1cm4gaC5hZGZvcm1Db2xsYXBzZWRFbD1rLGguYWRmb3JtRXhwYW5kZWRFbD1uLGg7aWYobiYmYS5hLmJ0KG4pJiYoYy5hZEZpbmRpbmdNZXRob2Q9IkFERk9STUFEUyBTaW5nbGUtZWxlbWVudCBleHBhbmRhYmxlIixoPWEuZC5mKG4sbi5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkLHthZFR5cGU6Mn0pKSlyZXR1cm4gaDtpZihsJiZhLmEuYnQobCkpe2ImJmEuYS5mb3JFYWNoKGIsZnVuY3Rpb24oYixjKXtpZihjJiZjLmluZGV4T2YmJi0xPGMuaW5kZXhPZihmKyIjIikpe3ZhciBkPWImJmIuYWRCb3gmJmIuYWRCb3guX2F0dHJpYnV0ZXMmJmIuYWRCb3guX2F0dHJpYnV0ZXMuZWxlbWVudDtkJiZkIT09bCYmYS5hLmJ0KGQpJiZtLnB1c2goZCl9fSk7aWYoMDxtLmxlbmd0aCYmKG0udW5zaGlmdChsKSxoPWEuZC5wKG0sbVswXS5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkLHthZFR5cGU6Mn0pKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IkFERk9STUFEUyBjb21wb3NpdGUiLGg7Yy5hZEZpbmRpbmdNZXRob2Q9IkFERk9STUFEUy0xIjtpZihoPWEuZC5mKGwsbC5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkLHthZFR5cGU6Mn0pKXJldHVybiBofX19ZnVuY3Rpb24gcChiLGMsZCxlLGcsaCl7aWYoZyYmaCYmKGU9YS52LmsoWyJkaXZbaWQ9J3ltXyIrZysiJ10gPiBpZnJhbWUvPT4vZGl2W2lkPSciK2grIiddIl0sYixjLGQpKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IllJRUxETU9BRFMiLGU7aWYoZT1hLnYuayhbIi4uLi4vaWZyYW1lW2lkJD0nX3RwaSddLyRbaWR8KFswLTldKilfdHBpXS8uLi9baWQ9JyQwJ10iLCIuLi4uL2lmcmFtZVtpZCQ9J190cGknXS8uLi9kaXYueW0vJFtkYXRhLWxmLWlkfChbMC05XSspXS9pZnJhbWUvPT4vW2lkPSckMCddIl0sYixjLGQpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iWUlFTERNT0FEUy0xIixlO2lmKGU9YS52LmsoWyJkaXYueW0vaWZyYW1lLz0+L2JvZHkvdmlkZW8udmlkZW8tZWxlbSJdLGIsYyxkKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IllJRUxETU9BRFMtMiIsZTtpZihlPWEudi5rKFsiZGl2LnltIl0sYixjLGQpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iWUlFTERNT0FEUy0zIixlfWZ1bmN0aW9uIHQoYixjLGQsZSl7dmFyIGc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmYS5tb2F0T2JqZWN0JiZhLm1vYXRPYmplY3RbYl19LGg9ZnVuY3Rpb24oYil7cmV0dXJuIGEudS5hKFsiZGl2Lm1vYXRfdHJhY2thYmxlIl0sYilbMF19LGY9ZnVuY3Rpb24oYil7cmV0dXJuKGI9KGI9YS5nLmUoYikpJiZiLmRvY3VtZW50RWxlbWVudCkmJmgoYil9LGw9ZnVuY3Rpb24oYil7dmFyIGM7Yj1hLnYuYShiLGEudi5iKTthLmEuZm9yRWFjaChiLGZ1bmN0aW9uKGEpe2lmKGM9ZihhKSlyZXR1cm4hMX0pO3JldHVybiBjfSxrPWZ1bmN0aW9uKCl7dmFyIGI9ZyhuLCJhZEVsZW1lbnQiKTtpZihiIT09bSlpZihhLmEuYnQoYikpe3ZhciBkPXA7bT1iO21bTV09Yy5hZE51bTttW0RdPSEwO2EuYS5idihtLGQsITApOyhiPWcobiwiYWRQcm94eUVsZW1lbnQiKSkmJmEuai5jKHAsYil9ZWxzZSBhLmEuYnUobSl8fChiPW0sYS5hYy5nKHApLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWRMb2FkZWQiLGspLGJbTV09dm9pZCAwLGJbRF09dm9pZCAwLHRhKCkpfTtlPWZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBlPWcobiwiY3JlYXRpdmVUeXBlIiksaD1nKG4sImFkUHJveHlFbGVtZW50Iik7c3dpdGNoKGUpe2Nhc2UiYmFubmVyIjppZihhLmEuYnQoYikpe2MuYWRGaW5kaW5nTWV0aG9kPSJDcmVhdGl2ZSBBUEkgLSBCYW5uZXIiO3ZhciBmPWEuZC5mKGIsYi5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkKX1oJiZhLmQubihmLFtoXSk7cmV0dXJuIGY7Y2FzZSJtdWx0aXBhcnQiOmlmKGY9YS5kLm8oYiwiRElWIiwhMSx2b2lkIDAsYyxkLG51bGwsaCkpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJDcmVhdGl2ZSBBUEkgLSBNdWx0aXBhcnQiLGY7Y2FzZSJjb21wb3NpdGUiOmlmKGY9YS5kLnAoYiwiRElWIiwhMSx2b2lkIDAsYyxkLG51bGwsaCkpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJDcmVhdGl2ZSBBUEkgLSBDb21wb3NpdGUiLGY7Y2FzZSJleHBhbmRhYmxlIjpyZXR1cm4gYS5hLmJ0KGIpJiYoYy5hZEZpbmRpbmdNZXRob2Q9IkNyZWF0aXZlIEFQSSAtIEV4cGFuZGFibGUiLGY9YS5kLmYoYixiLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpLGgmJmEuZC5uKGYsW2hdKSxuLmFkZEV2ZW50TGlzdGVuZXIoImFkTG9hZGVkIixrKSksZn19fTt2YXIgbj1mdW5jdGlvbihiKXtpZihhLmMuZXApcmV0dXJuIGEuYy5lcDt2YXIgYz1oKGIpO2N8fChjPWwoYikpO2N8fChhLmMucD8oYz1hLmcuYihiKSxjPWYoYykpOmM9dm9pZCAwKTtpZighYylhOntpZihhLmMucSYmKGI9YS5nLmcoYikpKXt2YXIgYz1hLmEuYmUoYik9PT1hLmMuZSxkPWEuYy5jJiYiQk9EWSI9PT1iLm5vZGVOYW1lO2lmKCFjfHwhZCl7Yz1oKGIpO2JyZWFrIGF9fWM9dm9pZCAwfWMmJihhLmMuZXA9Yyk7cmV0dXJuIGN9KGIpO2lmKG4pe2lmKCFnKG4sImFkTG9hZGVkIikpcmV0dXJuITE7dmFyIG09ZyhuLCJhZEVsZW1lbnQiKTtpZighbSlyZXR1cm4hMTt2YXIgcD1lKG0pO3JldHVybiBwP3A6ITF9fWZ1bmN0aW9uIHEoYixjLGQsZSl7dmFyIGc9ZnVuY3Rpb24oYil7cmV0dXJuIGEudS5hKFsiZGl2LmNlbHRyYS1hZC12MyIsImRpdi5jZWx0cmEtYWQtdjQiXSxiKVswXX07ZT1mdW5jdGlvbihiLGMpe3ZhciBkLGU9YS52LmEoYixhLnYuYik7YS5hLmZvckVhY2goZSxmdW5jdGlvbihiKXtpZihiLm9mZnNldFdpZHRoKmIub2Zmc2V0SGVpZ2h0PT09YylyZXR1cm4gZD1hLmcuZShiKS5ib2R5LCExfSk7cmV0dXJuIGQ/ZDohMX07dmFyIGg9ZnVuY3Rpb24oKXt2YXIgYyxkPWEudi5hKGIsYS52LmIpO2EuYS5mb3JFYWNoKGQsZnVuY3Rpb24oYil7aWYoKGI9KGI9YS5nLmUoYikpJiZiLmRvY3VtZW50RWxlbWVudCkmJmcoYikpcmV0dXJuIGM9ZyhiKSwhMX0pO3JldHVybiBjfSxmPWZ1bmN0aW9uKCl7aWYoYS5jLnEpe3ZhciBjPWEuZy5nKGIpO2lmKGMpe3ZhciBkPWEuYS5iZShjKT09PWEuYy5lLGU9YS5jLmMmJiJCT0RZIj09PWMubm9kZU5hbWU7ZCYmZXx8KGNlbHRyYURpdmlJblBhcmVudEZyYW1lPWcoYykpfX19LGw7YS5jLmVvP2w9YS5jLmVvOigobD1nKGIpKXx8KGw9aCgpKSxsfHwobD1mKCkpKTt2YXIgaztsJiYoaz1sJiZsLmNlbHRyYSYmbC5jZWx0cmEudmlld2FiaWxpdHlPYnNlcnZlZSk7aWYoayYmYS5hLmJ0KGspKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iQ2VsdHJhIEFQSSIsYz1hLmQuZihrLGsubm9kZU5hbWUsITEsdm9pZCAwLGMsZCksZD1hLmEuY3MoYyksKGs9ZShrLGQpKSYmYS5qLmMoYyxrKSxjO2wmJiFrJiYoYS5jLmVvPWwpO3JldHVybiExfWZ1bmN0aW9uIHkoYixjLGQsZSl7ZT1lfHxmdW5jdGlvbigpe3JldHVybiEwfTtpZighYilyZXR1cm4hMTt2YXIgZz1hLnUuYShbImRpdi52b3hBZERhdGEiXSxiKVswXTtpZigoZz1nJiZnLmVsZW1lbnRUb1RyYWNrKSYmYS5hLmJ0KGcpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iVm94IEFQSSIsYS5kLmYoZyxnLm5vZGVOYW1lLCExLHZvaWQgMCxjLGQpO3ZhciBnPWEuYS5zKCksaD1udWxsIT09ZyYmMTE+ZztpZighaClmb3IodmFyIGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBsPWZbZ107aWYoITAhPT1sW0RdJiYtMT09PWwuaWQuaW5kZXhPZigibW9hdFB4IikmJmEuYS5idChsKSYmbC5nZXRBdHRyaWJ1dGUoInNyYyIpJiZlKGwpKXt2YXIgaz1sLmdldEF0dHJpYnV0ZSgic3JjIik7ZT1hLmFmLmEoayxsKTtjLmFkRmluZGluZ01ldGhvZD0iQU9MLTEiO3JldHVybiBrPWEuZC5mKGwsaywhMSxlLGMsZCl9fWZvcih2YXIgbj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxnPTA7ZzxuLmxlbmd0aDtnKyspaWYoZj1uW2ddLGEuYS5idChmKSYmZShmKSYmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGZbRF18fCEwIT09ZltEXSkmJi0xPT1mLmlkLmluZGV4T2YoIm1vYXRQeCIpKXtmb3IodmFyIG09MDttPGYuY2hpbGRyZW4ubGVuZ3RoO20rKylpZigibW92aWUiPT09Zi5jaGlsZHJlblttXS5uYW1lfHwiTW92aWUiPT09Zi5jaGlsZHJlblttXS5uYW1lKWlmKGs9Zi5jaGlsZHJlblttXS52YWx1ZSwha3x8IWsubWF0Y2goInNjb3JlY2FyZHJlc2VhcmNoIikpZm9yKHZhciBwPTA7cDxmLmNoaWxkcmVuLmxlbmd0aDtwKyspe2lmKCFoJiYiRU1CRUQiPT09Zi5jaGlsZHJlbltwXS50YWdOYW1lKXtsPWYuY2hpbGRyZW5bcF07aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgbFtEXSYmITA9PT1sW0RdfHwtMSE9bC5pZC5pbmRleE9mKCJtb2F0UHgiKSljb250aW51ZTtpZihhLmEuYnQobCkmJmUobCkpcmV0dXJuIGU9YS5hZi5hKGssbCksYy5hZEZpbmRpbmdNZXRob2Q9IkFPTCBFbWJlZCIsaz1hLmQuZihsLGssITEsZSxjLGQpfWlmKCJPQkpFQ1QiPT09Zi5jaGlsZHJlbltwXS50YWdOYW1lJiYobD1mLmNoaWxkcmVuW3BdLGEuYS5idChsKSYmITAhPT1sW0RdJiYtMT09PWwuaWQuaW5kZXhPZigibW9hdFB4IikmJmUobCkpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iQU9MIE9iamVjdCIsaz1hLmQuZihsLHZvaWQgMCwhMSx2b2lkIDAsYyxkKX1mLm9iamVjdCYmZi5vYmplY3QuTW92aWU/az1mLm9iamVjdC5Nb3ZpZTpmLmRhdGEmJihrPWYuZGF0YSk7aWYoIWt8fCFrLm1hdGNoKCJzY29yZWNhcmRyZXNlYXJjaCIpKXJldHVybiBlPWEuYWYuYShrLGYpLGMuYWRGaW5kaW5nTWV0aG9kPSJTV0YgYWRzIixrPWEuZC5mKGYsaywhMSxlLGMsZCl9aWYoaz1hLnYubShiLGMsZCxlKSlyZXR1cm4gaztrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO2ZvcihnPTA7ZzxrLmxlbmd0aDtnKyspaWYoaD1rW2ddLCgidW5kZWZpbmVkIj09PXR5cGVvZiBoW0RdfHwhMCE9PWhbRF0pJiZhLmEuYnQoaCkmJihsPWguZ2V0QXR0cmlidXRlKCJzcmMiKSkmJiIiIT09bCYmLTE9PT1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YobCkmJmUoaCkpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJTdGFuZGFyZCBJbWFnZSBBZCBmaW5kaW5nICIsYS5kLmYoaCxsLCExLHZvaWQgMCxjLGQpO2lmKGI9KGs9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY2FudmFzIikpJiZrWzBdKXtpZigxPT09ay5sZW5ndGgmJmEuYS5idChiKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IkFLUUFHQVBHRU4gQ2FudmFzIixjPWEuZC5mKGIsYi5ub2RlTmFtZSwhMSx2b2lkIDAsYyxkKTtpZigxPGsubGVuZ3RoKXtpZihlKGIucGFyZW50Tm9kZSkmJmEuYS5idChiLnBhcmVudE5vZGUpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iQUtRQUdBUEdFTi0xIixjPWEuZC5mKGIucGFyZW50Tm9kZSxiLnBhcmVudE5vZGUubm9kZU5hbWUsITEsdm9pZCAwLGMsZCk7aWYoYS5hLmJ0KGIpJiYoYy5hZEZpbmRpbmdNZXRob2Q9IkFLUUFHQVBHRU4tMiIsYz1hLmQuZihiLGIubm9kZU5hbWUsITEsdm9pZCAwLGMsZCkpKXJldHVybiBhLmMucD9hLnUuYihbIi4uLi9ib2R5Il0sYyxiKTphLnUuYihbIi4uL2RpdiJdLGMsYiksY319cmV0dXJuITF9ZnVuY3Rpb24geChiLGMpe3ZhciBkPVtdO2lmKCFiKXJldHVybiBkO2Zvcih2YXIgZT1hLmEuZihiKT9iOmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGcsaD0wO2g8ZS5sZW5ndGg7aCsrKWlmKGc9ZVtoXSwhZ1tEXSl7dmFyIGY9YS5nLmUoZyk/ITE6ITA7KDE9PT1jJiZmJiZhLmEuYnQoZyl8fDI9PT1jJiYhZikmJmQucHVzaChnKX1yZXR1cm4gZH1hLnY9e307YS52LmQ9dm9pZCAwO3ZhciBuPVsiZmVhdGhlciIsImRpc3BsYXkiXTthLnYuZT1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuYy5hdi5hZEZpbmRpbmdUaW1lb3V0PyhhLmEuYShhLmMuYXYuYWRGaW5kaW5nVGltZW91dCksYS5jLmF2LmFkRmluZGluZ1RpbWVvdXQ9bnVsbCxjfHwoYz1mdW5jdGlvbigpe2EueS5iKDExLGQpfSksYS5sLmsoYiw5OTk5LDUwMCxjKSwhMCk6ITF9O2Eudi5jPWZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzO2EuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKT9hLmsuYS5henN4KCJub0xvbmdlclByZVJlbmRlcmVkIixmdW5jdGlvbihhKXtrLmFwcGx5KHRoaXMsYil9LHtvbmNlOiEwfSk6ay5hcHBseSh0aGlzLGIpfTthLnYubT1mdW5jdGlvbihiLGMsZCxlKXtlPWV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9O2I9eChiLDEpO2lmKGJbMF0mJmEuYS5idChiWzBdKSYmZShiWzBdKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9ImZpbmRJZnJhbWVBZHMiLGEuZC5mKGJbMF0sYlswXS5zcmMsITEsdm9pZCAwLGMsZCl9O2Eudi5sPWZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGgsZjtiPWEudi5hKGV8fGIsYS52LmIpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspaWYoZj1iW2VdLChnPWEuZy5lKGYpKSYmZy5kb2N1bWVudEVsZW1lbnQpe2E6e2g9Yzt2YXIgbD1kO2lmKGYuaWQmJmYuaWQubWF0Y2goImViQmFubmVySUZyYW1lIikmJmEuYS5idChmKSYmKGguYWRGaW5kaW5nTWV0aG9kPSJzaXptZWsgYmFubmVyIGlmcmFtZSIsaD1hLmQuZihmLGYubm9kZU5hbWUsITEsdm9pZCAwLGgsbCkpKWJyZWFrIGE7aD12b2lkIDB9aWYoaClyZXR1cm4gaDtpZihoPWEudi5rKFsiW2lkPSdhZCddIl0sZy5kb2N1bWVudEVsZW1lbnQsYyxkKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9ImFkIixoO2lmKGg9eShnLmRvY3VtZW50RWxlbWVudCxjLGQpKXJldHVybiBjLmFkRmluZGluZ01ldGhvZD0iRG9tc2VhcmNoIGZyaWVuZGx5IGlmcmFtZSIsaDtpZihoKXJldHVybiBoO2lmKGg9YS52Lm4oZy5kb2N1bWVudEVsZW1lbnQsYyxkKSlyZXR1cm4gYy5hZEZpbmRpbmdNZXRob2Q9IkRvbXNlYXJjaCBhZ2FpbiBpbiBmcmllbmRseSBpZnJhbWUiLGh9fTthLnYubj1mdW5jdGlvbihiLGMsZCl7dmFyIGU7Yj1hLnYuYShiLGEudi5iKTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10sKGU9YS5nLmUoZSkpJiZlLmRvY3VtZW50RWxlbWVudCYmKGU9eShlLmRvY3VtZW50RWxlbWVudCxjLGQpKSlyZXR1cm4gZX07YS52Lmo9ZnVuY3Rpb24oYixjLGQpe2lmKCFhLmEuZWEobixjKSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGQmJihiPWEudC5uKGIsYykpKXtpZihiPT09YS50LmkpcmV0dXJuIGEudC5pO2MuYWRGaW5kaW5nTWV0aG9kPWMuYWN0aXZlQ29uZmlnPyJFWFA6ICIrYy5hY3RpdmVDb25maWc6IkVYUCBVbm1hcHBlZCI7cmV0dXJuIGEuZC5mKGIsImRpdiIsITEsdm9pZCAwLGMsZCl9fTthLnYubz1mdW5jdGlvbihiLGMpe2lmKCFqYSYmITEhPT1iLnNob3VsZEtpbGxBZCl7dmFyIGQ9KG5ldyBBKS5nZXRUaW1lKCktYy5hby5zdGFydFRpbWU7ITAhPT1jLmVtJiYhMCE9PWMucHJldmVudFRyeUZpbmRpbmdBZEFnYWluJiY1ZTM+ZCYmKGEudi5wKGMpLGIuc2hvdWxkS2lsbEFkPSExKX19O2Euay5hLmF6c3goImJlZm9yZUFkS2lsbGVkIixhLnYubyk7YS52LnE9ZnVuY3Rpb24oYSl7fTthLnYucD1mdW5jdGlvbihiKXtpZighMCE9PWIuZW0pe2RlbGV0ZSBCW2IuenJdO2EuYS5hKGIuY2MpO2IucGVyaXNjb3BlTWFuYWdlciYmYi5wZXJpc2NvcGVNYW5hZ2VyLmtpbGxBbGxQaXhlbHMoKTt2YXIgYzsoYz1MJiZMLnBhcmVudE5vZGUpJiZhLnYuYyhjLGIuYW8sYix2b2lkIDAsZnVuY3Rpb24oKXthLmFjLmcoYil9LHZvaWQgMCl9fTthLnYuaz1mdW5jdGlvbihiLGMsZCxlKXtiPWEudS5hKGIsYyk7dmFyIGc7YS5hLmZvckVhY2goYixmdW5jdGlvbihiKXtpZihhLmEuYnQoYikpcmV0dXJuIGc9YiwhMX0pO2lmKGcpcmV0dXJuIGI9YS5hLmJmKGcpfHxnLnNyY3x8IkRJViIsZC5hZEZpbmRpbmdNZXRob2Q9IkRPTVNFQVJDSCIsYS5kLmYoZyxiLCExLHZvaWQgMCxkLGUpfTt2YXIgbT1mdW5jdGlvbihiLGMsZCxlLGcsaCl7ZD1hLnUuYShjLGQpO2Q9YS5hLmZpbHRlcihkLGEuYS5idCk7aWYoZC5sZW5ndGg+PShoP2MubGVuZ3RoOjEpKXJldHVybiBjPWEuYS5iZihkWzBdKXx8ZFswXS5nZXRBdHRyaWJ1dGUoInNyYyIpfHwiRElWIixiKGQsYywhMSx2b2lkIDAsZSxnKX07YS52LnI9ZnVuY3Rpb24oYixjLGQsZSxnKXtyZXR1cm4gbShhLmQucCxiLGMsZCxlLGcpfTthLnYucz1mdW5jdGlvbihiLGMsZCxlLGcpe3JldHVybiBtKGEuZC5vLGIsYyxkLGUsZyl9O2Eudi5pPXk7YS52LmY9ZnVuY3Rpb24oayxuLG0seCx5LHIpe2EuZy5kKHIpJiYocj13aW5kb3cpO3J8fChyPXdpbmRvdyk7eT15fHxmdW5jdGlvbigpe3JldHVybiEwfTt2YXIgdT1hLnYuaSx3PWEudi5qO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGspcmV0dXJuITE7aWYoYS5jLnAmJiJIRUFEIj09PWsudGFnTmFtZSl7dmFyIHY9ay5wYXJlbnROb2RlOyJIVE1MIj09PXYudGFnTmFtZSYmKHY9di5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpLDA8di5sZW5ndGgmJihrPXZbMF0pKX1pZih2PXEoayxuLG0seSkpcmV0dXJuIHY7aWYoYS5jLmVvKXJldHVybiExO2lmKHY9dChrLG4sbSx5KSlyZXR1cm4gdjtpZihhLmMuZXApcmV0dXJuITE7aWYodj1hLnYuayhbIltpZD0nYWQnXSJdLGssbixtKSlyZXR1cm4gbi5hZEZpbmRpbmdNZXRob2Q9IkRPTSBJZCA9IGFkIix2O2lmKHY9YS52LmsoWyIuLi9ib2R5L2luc1tjbGFzcz0nZGNtYWRzJ11bZGF0YS1kY20tcmVuZGVyaW5nLW1vZGU9J3NjcmlwdCddIl0sayxuLG0pKXJldHVybiBuLmFkRmluZGluZ01ldGhvZD0iRENNIGlucyIsdjtpZih2PWEudi5rKFsiZGl2LnRlYWRzLXBsYXllci9pZnJhbWUiLCJkaXZbaWRePSdwbGF5QXJlYSddIl0sayxuLG0pKXJldHVybiBuLmFkRmluZGluZ01ldGhvZD0idGVhZHMiLHY7aWYodj1hLnYuayhbImRpdi5hdmFsYW5jaGUiXSxrLG4sbSkpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJhdmFsYW5jaGUiLHY7aWYodj1kKGssbixtLHkscikpcmV0dXJuIHY7aWYoYS5jLmVxKXJldHVybiExO2lmKHY9biYmbi5udHZEb21TZWFyY2gpcmV0dXJuIGs9YS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodiksaz1hLmEuZmlsdGVyKGssYS5hLmJ0KSwxPGsubGVuZ3RoJiYodj1hLmQucChrLCJESVYiLCExLHZvaWQgMCxuLG0pKT8obi5hZEZpbmRpbmdNZXRob2Q9Ik5hdGl2b0FkcyBjb21wb3NpdGUgYWRzIix2KToxPT09ay5sZW5ndGgmJihuLmFkRmluZGluZ01ldGhvZD0iTmF0aXZvQWRzIHNpbmdsZSBhZCIsdj1hLmQuZihrWzBdLGtbMF0ubm9kZU5hbWUsITEsdm9pZCAwLG4sbSkpP3Y6ITE7aWYodj1hLnYuayhbImRpdi5zdHItYWR1bml0IiwiW2RhdGEtc3RyLW5hdGl2ZS1rZXldIiwiW2RhdGEtc3RyLXNpYmxpbmddIiwiLi4uLi8uLi9bZGF0YS1zdHItbmF0aXZlLWtleV0iXSxrLG4sbSkpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJTaGFyZXRocm91Z2giLHY7aWYodj1hLnYuayhbIi4uLi9bZGF0YS1nZy1tb2F0XS9bZGF0YS1nZy1tb2F0LWlmcl0iLCIuLi4vW2RhdGEtZ2ctbW9hdF0iLCJbZGF0YS1nZy1tb2F0XSJdLGssbixtKSlyZXR1cm4gbi5hZEZpbmRpbmdNZXRob2Q9Ikd1bUd1bSIsdjt2YXIgdj0odj1hLmMucD9rLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OmspJiZ2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxBPXt9LEIsRDt2JiYwPHYubGVuZ3RoJiYoQS5qcGQ9L2Fkc1wuamV0cGFja2RpZ2l0YWxcLmNvbVwvbGluZWl0ZW1zXC8oXGQrKVwvanBkLyxBLmFkZm9ybT0vYWRmb3JtXC4oPzpjb218bmV0KVwvYWRmc2NyaXB0XC8/XD9ibj0oWzAtOV0rKS8sQS5xdWFydHo9L2Fkc1wucXNcLmNvbS8sQS55aWVsZG1vPS9hZHNcLnlpZWxkbW9cLmNvbVwvLipcJnA9KFswLTldKykuKlwmbGY9KFswLTldKykvLEEueWllbGRtbzI9L3N0YXRpY1wueWllbGRtb1wuY29tXC95bVwuW2EtejAtOV17Mn1cLmpzLyxhLmEuZm9yRWFjaCh2LGZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBBKWlmKEEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWEmJmEuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZihjJiYoQj1jLm1hdGNoKEFbYl0pKSlyZXR1cm4gRD1iLCExfX0pKTthLnUuYShbIi4uLi9bY2xhc3MqPSdqcGVkaXRvcmlhbHVuaXQnXSIsIi4uLi9bY2xhc3MqPSdqcGJhbm5lciddIiwiLi4uL1tpZCo9J2pwcGxhdGZvcm0nXSIsIi4uLi9baWQqPSdqcGRfYWRoZXNpb24nXSJdLGspWzBdJiYoRD0ianBkIik7aWYoRCYmImpwZCI9PT1EJiYodj1mKGssbixtLEImJkJbMV0seSkpfHwodj1nKGssbixtLHkpKXx8RCYmImFkZm9ybSI9PT1EJiYodj1sKGssbixtLEImJkJbMV0seSxyKSkpcmV0dXJuIHY7aWYodj1iKGssbixtLHkscikpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJUUklQTEVMSUZUQURTOiBNb2F0IHNjcmlwdCBxdWVyeSBzdHJpbmcgbG9naWMgLSAiKyhuLnRsdmlld19pZD8idGx2aWV3X2lkIjoidGx2aWV3SUQiKSx2O2lmKHY9ZShrLG4sbSx5LHIpKXJldHVybiBuLmFkRmluZGluZ01ldGhvZD0iVFJJUExFTElGVEFEUzogRG9tc2VhcmNoIHRsZWlkIGF0dHJpYnV0ZSIsdjtpZih2PWgoayxuLG0seSxyKSlyZXR1cm4gbi5hZEZpbmRpbmdNZXRob2Q9IlRSSVBMRUxJRlRBRFM6IERvbXNlYXJjaCBiYXNlZCBvbiB3aW5kb3ciLHY7aWYodj1hLnYuayhbIltpZD0ncXphZCddIiwiZGl2I3F6Yy1jb250YWluZXIiXSxrLG4sbSkpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJRdWFydHoiLHY7eD12PSIiO0QmJmEuYS5heChbInlpZWxkbW8iLCJ5aWVsZG1vMiJdLEQpJiYodj1CJiZCWzFdLHg9QiYmQlsyXSk7aWYodj1wKGssbixtLHksdix4KSlyZXR1cm4gdjtpZihyPXIud2Vib3JhbWFfZGlzcGxheV90YWcmJnIud2Vib3JhbWFfZGlzcGxheV90YWcubWVkaWFwYXRoKXt2PS9odHRwcz86XC9cLyhbMC05YS16QS1aXC5cL10rKS87cj1yLm1hdGNoJiZyLm1hdGNoKHYpWzFdO3g9YS51LmMoWyIuLi4uLi9kaXZbaWRePSdzY3JfJ11baWQqPSdyZW1vdGVkaXYnXSJdLGspO2Zvcih2YXIgRj0wO0Y8eC5sZW5ndGg7RisrKWlmKHY9YS52LmsoWyIke1tzcmMqPSciK3IrIiddfSIsIisvJHtbc3JjKj0nIityKyInXX0iXSx4W0ZdLG4sbSkpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJXZWJvcmFtYSIsdn1pZigodj13KGssbixtKSl8fCh2PXUoayxuLG0seSkpKXJldHVybiB2O2lmKHY9YS52LmwoayxuLG0pKXJldHVybiBuLmFkRmluZGluZ01ldGhvZD0iZnJpZW5kbHkgaWZyYW1lIix2O2lmKHg9YS5nLmcoaykpaWYodj1hLnYubCh4LG4sbSkpcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kPSJmaW5kIGlmcmFtZSBwYXJlbnQiLHY7aWYoYS5jLnF8fHgpaWYoeD14fHxhLmcuZyhrKSlpZihyPWEuYS5iZSh4KT09PWEuYy5lLHY9YS5jLmMmJiJCT0RZIj09PXgubm9kZU5hbWUsIXJ8fCF2KXtpZih2PXcoeCxuLG0pKXJldHVybiBuLmFkRmluZGluZ01ldGhvZD0iaWZyYW1lIHBhcmVudCBleHBhbmRhYmxlIix2O2lmKHY9dSh4LG4sbSx5KSlyZXR1cm4gbi5hZEZpbmRpbmdNZXRob2Q9ImlmcmFtZSBwYXJlbnQgZmluZEFkIix2fXJldHVybih2PWMoayxuLG0seSkpPyhuLmFkRmluZGluZ01ldGhvZD0iVW5kZXJ0b25lIix2KToodj1hLnYuayhbIi4uL2lmcmFtZSN2ZXJ2ZS1iYW5uZXIiLCIuLi4vYm9keS9pZnJhbWUjdmVydmUtZXhwYW5kYWJsZS89Pi9kaXYuY29udGVudCIsIi4uLi9ib2R5L2lmcmFtZSN2ZXJ2ZS1leHBhbmRhYmxlIiwiaWZyYW1lI3ZlcnZlLWJhbm5lci89Pi9kaXYuY29udGVudCIsImlmcmFtZSN2ZXJ2ZS1iYW5uZXIiXSxrLG4sbSkpPyhuLmFkRmluZGluZ01ldGhvZD0iVmVydmUiLHYpOiExfTthLnYuYT14O2Eudi50PWZ1bmN0aW9uKGIsYyxkKXtpZighYS5hLmVhKG4sYykpcmV0dXJuITE7aWYoYS5jLmMmJmImJmEuYS5idChiKSYmYS54LmUuYShiLGMpKXsid2lkdGgiPT1hLnguYiYmYS54LmQoKTtjLnNraW49MTt2YXIgZT1hLmEuYmYoYik7aWYoYj1hLmQuZihiLGV8fGIubm9kZU5hbWUsITEsdm9pZCAwLGMsZCkpcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kPSJXQUxMUEFQRVJTIEFEUyIsYn19O2Eudi51PTE7YS52LmI9MjthLnYudj01MDA7YS52Lmg9MjA7YS52Lnc9e29iamVjdDoxLGVtYmVkOjEsaW1nOjEsaWZyYW1lOjF9fSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoZCxnLGMsYil7dmFyIGU9e307ZD1kLnJlcGxhY2UoLyZhbXA7L2csIiYiKS5yZXBsYWNlKC8oXlxzK3xccyskKS9nLCIiKTtmb3IodmFyIGg9ZC5zcGxpdCgiJiIpLGw9MDtsPGgubGVuZ3RoO2wrKyl7dmFyIGs9aFtsXS5zcGxpdCgiPSIpO2lmKCJzdHJpbmciPT09dHlwZW9mIGtbMV0pe2tbMF0mJmtbMF0ubWF0Y2goIm1vYXRDbGllbnQiKSYmKGVbInJhd00iK2tbMF0uc2xpY2UoMSldPWtbMV0pO3ZhciB0PWsscSx5PXE9a1sxXTt0cnl7Zm9yKHZhciB4PTA7MTAwPngmJihxPWRlY29kZVVSSUNvbXBvbmVudChxKSx5IT1xKSYmIXEubWF0Y2goL15odHRwKHMpP1w6Lyk7eCsrKXk9cX1jYXRjaChuKXt9cT1xLnJlcGxhY2UoLyheXHMrfFxzKyQpL2csIiIpO3RbMV09cX1lbHNlIGtbMV09IiI7ZVtrWzBdXT1rWzFdfWEuYXAuZihlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBjJiYoZS5jbGllbnRab25lPSJ1bmRlZmluZWQiIT09Yz9jOiIiKTthLmsuYS56YXhzKCJnZXRBZElkZW50aWZpZXJzRnJvbVF1ZXJ5U3RyaW5nIixlLGQsZyxjLGIpO3JldHVybiBlPWEuYXAuZyhlKX1mdW5jdGlvbiBkKGQsZyl7ZnVuY3Rpb24gYyhhKXtpZigoYT1hLm1hdGNoKCJodHRwcz86Ly8oPzpbYS16QS1aMC05XFwtXFxfXSopLmRvdWJsZWNsaWNrLm5ldC8oPzpbYS16QS1aMC05XSopL2Fkai8oLiopIikpJiZhWzFdKXJldHVybiBhWzFdfXZhciBiO2lmKCJzdHJpbmciPT09dHlwZW9mIGFkc3JjKWI9YWRzcmM7ZWxzZXtmb3IodmFyIGUgaW4gYS5jLmUpe3ZhciBoPWUubWF0Y2goIl5hZHNyY18iKTtpZihoJiZoWzBdJiYic3RyaW5nIj09PXR5cGVvZiBhLmMuZVtlXSl7Yj1hLmMuZVtlXTticmVha319aWYoIWIpZm9yKGU9Zy5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxoPTA7aDxlLmxlbmd0aDtoKyspaWYoZVtoXS5zcmMpe3ZhciBsPWMoZVtoXS5zcmMpO2lmKGwpe2I9bDticmVha319Ynx8IWEuYy5wfHxhLmMucXx8KGU9YyhhLmMuZS5sb2NhdGlvbi5ocmVmKSkmJihiPWUpfWQuek1vYXRSYXdTbGljZXIxPWQubW9hdENsaWVudFNsaWNlcjF8fCJ1bmNsYXNzaWZpZWQiO2Quek1vYXRSYXdTbGljZXIyPWQubW9hdENsaWVudFNsaWNlcjJ8fCJ1bmNsYXNzaWZpZWQiO2I/KGI9Yi5zcGxpdCgiOyIpWzBdLnNwbGl0KCIvIiksZC56TW9hdFJldXRlcnNTbGljZXIxPWJbMF18fGQubW9hdENsaWVudFNsaWNlcjF8fCJ1bmNsYXNzaWZpZWQiLGQuek1vYXRSZXV0ZXJzU2xpY2VyMj1iWzFdfHxkLm1vYXRDbGllbnRTbGljZXIyfHwidW5jbGFzc2lmaWVkIik6KGQuek1vYXRSZXV0ZXJzU2xpY2VyMT1kLm1vYXRDbGllbnRTbGljZXIxfHwidW5jbGFzc2lmaWVkIixkLnpNb2F0UmV1dGVyc1NsaWNlcjI9ZC5tb2F0Q2xpZW50U2xpY2VyMnx8InVuY2xhc3NpZmllZCIpO3JldHVybiBkfWEuYXA9e307YS5hcC5hPWZ1bmN0aW9uKGQsZyl7aWYoIWQpcmV0dXJuITE7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZC5zdGFydFRpbWV8fGcpZC5zdGFydFRpbWU9YS5jLmJqO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGQucmFuZHx8ZylkLnJhbmQ9dy5mbG9vcih3LnJhbmRvbSgpKncucG93KDEwLDEyKSk7InVuZGVmaW5lZCI9PT10eXBlb2YgZC5hZE51bSYmKGQuYWROdW09ci56cixyLnpyKyspfTthLmFwLmI9ZnVuY3Rpb24oZCxnKXtpZighZClyZXR1cm4hMTt2YXIgYz1hLmEuYWEoKTthLmEuYW8oKTtkZWNvZGVVUklDb21wb25lbnQoYyk7cmV0dXJuIGR9O2EuYXAuYz1mdW5jdGlvbihkLGcpe3ZhciBjPWEuYXAuZChkLGcpO2MmJihjLl9BRF9GT1JNQVQ9Zyk7YS5rLmEuYXpzeCgiYWRJbml0aWFsaXplZCIsZnVuY3Rpb24oYil7dmFyIGM9Yi5EZnBTbG90O2I9Yi5hbztpZihjKXthLmEuZHooYik7Yi5mdWxsQWRVbml0UGF0aD1hLmFuLmMoYyk7Yi5kZnBTbG90SWQ9YS5hbi5kKGMpO2Zvcih2YXIgYz1hLmFuLmUoYyksZD0wO2Q8Yy5sZW5ndGg7ZCsrKWJbImRmcEFkVW5pdExhYmVsIitkXT1jW2RdfX0pO2Euay5hLnpheHMoImdldElkcyIsYyxkLGcpO3JldHVybiBjfTthLmFwLmQ9ZnVuY3Rpb24oYSxnKXt0cnl7dmFyIGM9YS5jbGFzc05hbWUsYj1hLmdldEF0dHJpYnV0ZSgic3JjIik7Yy5zcGxpdCgiXG4iKS5qb2luKCIgIik7aWYoLTEhPT1jLmluZGV4T2YoIm1vYXRmb290ZXIiKSlyZXR1cm4hMTt2YXIgZT1iLnNwbGl0KCI/IiksaD1iLnNwbGl0KCIjIiksYz0hMTsxPGUubGVuZ3RoJiYxPGgubGVuZ3RoJiZlWzFdLmxlbmd0aDxoWzFdLmxlbmd0aCYmKGM9ITApO2lmKDE9PWUubGVuZ3RofHxjKWU9aDtpZigxPGUubGVuZ3RoKXt2YXIgbD1rKGVbMV0sZywidW5kZWZpbmVkIik7cmV0dXJuIGw9ZChsLGEpfXJldHVybiExfWNhdGNoKHApe3JldHVybiExfX07YS5hcC5lPWZ1bmN0aW9uKGEsZCl7aWYoIWEpcmV0dXJuITE7dmFyIGM9e307dHJ5e3ZhciBiPWEmJmEuY2xhc3NOYW1lLnJlcGxhY2UoImFtcDsiLCIiKS5zcGxpdCgiPyIpWzFdO2lmKGM9YiYmayhiLGQpKWMuX0FEX0ZPUk1BVD1kO3JldHVybiBjfWNhdGNoKGUpe3JldHVybiExfX07YS5hcC5mPWZ1bmN0aW9uKGQpe3ZhciBnPWEuYS5hbSgpO2cmJihkLnpNb2F0Q1VSTD1nKTthLmsuYS56YXhzKCJhcHBlbmROb25Rc0FkSWRzIixkKX07YS5hcC5nPWZ1bmN0aW9uKGEpe2lmKGEpe2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmQmJmQubWF0Y2goIm1vYXRDbGllbnRMZXZlbCIpJiYic3RyaW5nIj09PXR5cGVvZiBhW2RdJiYoYVtkXT1hW2RdLnJlcGxhY2UoL1w6L2csIl8iKS5yZXBsYWNlKC8lM0EvZ2ksIl8iKSk7cmV0dXJuIGF9fTthLmFwLmg9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZHx8e319O2EuYXAuaT1mdW5jdGlvbihhKXthPWRlY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQoYSkpOy0xPGEuaW5kZXhPZigiYW5vbnltb3VzLmdvb2dsZSIpJiYoYT0iYW5vbnltb3VzLmdvb2dsZSIpO3ZhciBkPWEubWF0Y2goL14oPzpbXjpdezEsfTpcL1wvKT8oPzo6KlwvP1wvPyk/KD86d3d3XC4pPyhbXlwvOl0qKS8pO2QmJmRbMV0mJihhPWRbMV0pO3JldHVybiBhLnNwbGl0KCIvIilbMF19O2EuYXAuaj1mdW5jdGlvbihkKXthLmFwLmEoZCk7YS5hcC5rKGQpO2Q9YS5hcC5nKGQpO2EuYXAubCYmYS5hcC5sKGQpO3JldHVybiBkfX0pKHUpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBrKGEpeyJvYmplY3QiPT09dHlwZW9mIGEmJihhLmZxPTAsYS5nbT0wLGEuY2g9MCxhLmdhPTAsYS5naD0wLGEuaGFzT3duUHJvcGVydHkoImx4IikmJmRlbGV0ZSBhLmx4LGEudW09MSl9ZnVuY3Rpb24gZChiLGMsZCl7ZD1hLmEuZHooYyk7YS5hLmR1KHthbGw6ITB9LGQpJiYoYi56R1NSUz0iMSIpO2IuekdTUkM9IjEiO2Muek1vYXRDSE5MUyYmKGIuZ3Y9Yy56TW9hdENITkxTKTtjLnpNb2F0R1NDQUNIRSYmKGIuaHc9Yy56TW9hdEdTQ0FDSEUpfWZ1bmN0aW9uIGYoYSxiKXtiLmk9YSYmYS5zbGkmJiJmYWxzZSIhPT1hLnVzZVNsb3RJa2V5JiYhMSE9PWEudXNlU2xvdElrZXk/YS5zbGk6IlJFVVRFUlNfSEVBREVSMSJ9ZnVuY3Rpb24gZyhiLGMpe3ZhciBkPVsidHlwZSIsImRpdl9pZCJdO2QmJjA8ZC5sZW5ndGgmJmMuZGZwSGVhZGVyU2xvdHMmJmEuYS5jZChiLGMuZGZwSGVhZGVyU2xvdHMpfWZ1bmN0aW9uIGMoYil7dmFyIGM9YS5jLmUuZ29vZ2xldGFnLGM9YyYmImZ1bmN0aW9uIj09PXR5cGVvZiBjLnB1YmFkcyYmYy5wdWJhZHMoKSxkPS0xO2lmKGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgYy5nZXRTbG90cyl0cnl7dmFyIGU9Yy5nZXRTbG90cygpLGQ9YS5hLmYoZSk/ZS5sZW5ndGg6LTF9Y2F0Y2goZyl7fWIudmI9ZH1mdW5jdGlvbiBiKGIsYyl7YS5hLmFrKGEuYy5iYSkmJjVlMz5lbmNvZGVVUklDb21wb25lbnQoYS5jLmJhKS5sZW5ndGgmJihiLmd1PWEuYy5iYSk7Yi5pZD1hLmMuYmI/IjEiOiIwIjtiLmlpPWEuYy5hdX1mdW5jdGlvbiBlKGEsYil7YS5ibz1iLm1vYXRDbGllbnRTbGljZXIxO2EuYmQ9Yi5tb2F0Q2xpZW50U2xpY2VyMn1mdW5jdGlvbiBoKGIsYyl7aWYoYS5jLmVzKXt2YXIgZD1iLmNtOyJudW1iZXIiPT09dHlwZW9mIGQmJihiLnBjPWQpO2IuY209MX19ZnVuY3Rpb24gbChiLGMpe3ZhciBkLGU9W10sZyxoPWEuYS5hdigpPzIwNDg6Nzc1MCxmPWN8fHt9O2c9e307Yi5mcz0iMTkzMjI0Ijtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJigxIT1iLmV8fCJ4IiE9PWQmJiJ5IiE9PWQmJiJjIiE9PWQ/ZS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChkKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pKTpnW2RdPWJbZF0uc3BsaXQoImEiKSk7ZD1lLmpvaW4oIiYiKTt2YXIgZT1oLWQubGVuZ3RoLGw9MDtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBnLngpe2Zvcih2YXIgaz0wLHA9MDtwPGcueC5sZW5ndGg7cCsrKWlmKGsrPWcueFtwXS5sZW5ndGgrKGcueVtwXT9nLnlbcF0ubGVuZ3RoOjApKyhnLmNbcF0/Zy5jW3BdLmxlbmd0aDowKSxrPGUpbCsrO2Vsc2UgYnJlYWs7MDxsJiYoZCs9IiZ4PSIrZy54LnNsaWNlKDAsbC0xKS5qb2luKCJhIiksZCs9IiZ5PSIrZy55LnNsaWNlKDAsbC0xKS5qb2luKCJhIiksZCs9IiZjPSIrZy5jLnNsaWNlKDAsbC0xKS5qb2luKCJhIikpfWZvcih2YXIgdCBpbiBmKWYuaGFzT3duUHJvcGVydHkodCkmJihnPSImIitlbmNvZGVVUklDb21wb25lbnQodCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW3RdKSxnLmxlbmd0aCtkLmxlbmd0aDxoJiYoZCs9ZykpO2Q9ZC5yZXBsYWNlKC9ceDI3L2csIiUyNyIpO3RyeXtkKz0iJm5hPSIrYS5hLmN3KGQsYi5pKX1jYXRjaChxKXt9cmV0dXJuIGR9ZnVuY3Rpb24gcChiLGMpe2Iuaj0yNT09Yz8ic3RyaW5nIj09dHlwZW9mIGEuYy5kJiZhLmMuZC5zbGljZSgwLDUwMCl8fCIiOmEuYS5hcChhLmMuZCl9ZnVuY3Rpb24gdChiLGMpe2lmKCFhLmMuYyl7dmFyIGQ9YS5hLmFiKCk7ZCYmKGIubHA9ZCl9fWZ1bmN0aW9uIHEoYixjLGQpe3ZhciBlPWEuYS5keihkKSxnPWEuYS5kdSh7YWxsOiEwfSxlKTthLmEuZm9yRWFjaChjLGZ1bmN0aW9uKGEpe2lmKGJbYV0pcmV0dXJuITA7Zz9kW2FdJiYiLSIhPT1kW2FdJiYoYlthXT1kW2FdKTpiW2FdPWRbYV18fCItIn0pO3JldHVybiBifWEueT17fTt2YXIgeT0iek1vYXRQUyB6TW9hdFRQIHpNb2F0U1Qgek1vYXRBUkJMIHpNb2F0QWRVbml0MSB6TW9hdFN0b3J5IHpNb2F0QVUgek1vYXRQaXhlbERpc3RhbmNlIHpNb2F0UmF3U2xpY2VyMSB6TW9hdFJhd1NsaWNlcjIgek1vYXRSZXV0ZXJzU2xpY2VyMSB6TW9hdFJldXRlcnNTbGljZXIyIHpNb2F0QmxhY2tsaXN0IHpNb2F0SlMiLnNwbGl0KCIgIikseD17ZGlzcGxheToxLHZpZGVvOjIsYWR4OjMsaHRtbDU6NCxjb250ZW50OjUsZmVhdGhlcjo2LGl2dF9vbmx5Ojd9O2EueS5jPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS5hLmR6KGMpO2IuaHA9MTtjLnpNb2F0QWRVbml0MSYmKGIuek1vYXRBZFVuaXQxPWMuek1vYXRBZFVuaXQxKTtjLnpNb2F0QWRVbml0MiYmKGIuek1vYXRBZFVuaXQyPWMuek1vYXRBZFVuaXQyKTtjLnpNb2F0QWRVbml0MyYmKGIuek1vYXRBZFVuaXQzPWMuek1vYXRBZFVuaXQzKTtjLnpNb2F0QWRVbml0NCYmKGIuek1vYXRBZFVuaXQ0PWMuek1vYXRBZFVuaXQ0KTthLmMuYyYmd2luZG93LnRvcC5kb2N1bWVudCYmd2luZG93LnRvcC5kb2N1bWVudC5oYXNGb2N1cyYmImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cudG9wLmRvY3VtZW50Lmhhc0ZvY3VzJiYoYi53Zj13aW5kb3cudG9wLmRvY3VtZW50Lmhhc0ZvY3VzKCk/MTowKTtkPXhbZF07InVuZGVmaW5lZCIhPT10eXBlb2YgZCYmKGIucmE9ZCk7Yy5hbHRLZXkmJihiW2MuYWx0S2V5XT0xKTtiLnB4bT0iNyI7Yi5zZ3M9MzthLmsuYS56YXhzKCJhcHBlbmRDb21tb25LZXlzIixiLGMpfTthLnkuYj1mdW5jdGlvbihuLG0seCxHLHUpe3ZhciBDPWEuYS5keihtKTthLmFwLmEobSxHKTt2YXIgej17fTt6LmU9bjthLmEuY2Qoeix4KTtmKG0seik7YS55LmMoeixtKTtjKHopO2EuaCYmKHouY209YS5hLmFzKGEuaCxhLmkpLm11bHRpcGxpZXIpO3RyeXt6LmtxPWEuYy5lJiZhLmMuZS5kZXZpY2VQaXhlbFJhdGlvfWNhdGNoKHcpe3oua3E9MX16LmhxPWEuYy5tPzE6MDt6LmhzPWEuYy5qPzE6MDt6Lmh1PWEuYy5haD8xOjA7ei5ocj1hLmMuYWQ/MTowO3ouaHQ9YS5jLmFrPzE6MDt6LmRudD1hLmMuZWo/MTowO2lmKDExPT09bil7YS5rLmEuemF4cygiYWROb3RGb3VuZCIpO3ZhciBBPVtdLEU7Zm9yKEUgaW4gb2Epb2EuaGFzT3duUHJvcGVydHkoRSkmJkEucHVzaChFKyI9IitvYVtFXSk7ei5rPUEuam9pbigiJiIpLnNsaWNlKDAsMzAwKX1pZighKHouZSBpbiBzYSkpe3ouYnE9YS5jLm47MT09PW0uc2tpbiYmKHoud3A9MT09PW0uaXNTa2luPzE6MT09PW0uaXNBb2xTa2luPzI6Myk7ei5mPU51bWJlcigha2EpO2EuYy5kYyYmKHoubmg9MSk7bS5JU19QQUdFX0xFVkVMfHxwKHosei5lKTt0KHosei5lKTt6LnQ9bS5zdGFydFRpbWU7ei5kZT1tLnJhbmQ7ei5yeD1hLmMuYXguYTt6Lm09MDt6LmFyPSIyOWFkNTlkLWNsZWFuIjt6Lml3PSIzMWQ2OTY1IjthLmEuY2goeiwiYWkiLHIueik7YS5hLmNoKHosIndyIixyLkFDVElWRVRJTUVVTlRJTFNDUk9MTCk7ei5xPXIubSsrO3ouY2I9VT8xOjA7ei5jdT1SO3oubGw9YS5jLmRofHwwO2EuYS5jaCh6LCJsbSIsYS5jLmRkKCkpO3oubG49YS5jLnA/MTowO2EuYS5jZCh6LGEuZm9jdXMuZ2V0UXVlcnlTdHJpbmcoKSk7YS5hcC5oKG0seik7InVuZGVmaW5lZCIhPT10eXBlb2YgbSYmKHouZD1tLm1vYXRDbGllbnRMZXZlbDErIjoiK20ubW9hdENsaWVudExldmVsMisiOiIrbS5tb2F0Q2xpZW50TGV2ZWwzKyI6IittLm1vYXRDbGllbnRMZXZlbDQsQT1hLmEuZHgoe2FsbDoiek1vYXRQUyB6TW9hdFRQIHpNb2F0U1Qgek1vYXRBUkJMIHpNb2F0QWRVbml0MSB6TW9hdFN0b3J5IHpNb2F0QVUgek1vYXRQaXhlbERpc3RhbmNlIHpNb2F0UmF3U2xpY2VyMSB6TW9hdFJhd1NsaWNlcjIgek1vYXRSZXV0ZXJzU2xpY2VyMSB6TW9hdFJldXRlcnNTbGljZXIyIHpNb2F0QmxhY2tsaXN0IHpNb2F0SlMiLnNwbGl0KCIgIil9LEMpfHx5LHEoeixBLG0pLG0uYWRGaW5kaW5nTWV0aG9kJiYoei5odj1tLmFkRmluZGluZ01ldGhvZCksZCh6LG0sQyksYih6LG0pLG0mJih6LnpNb2F0UmF3U2xpY2VyMT1tLnpNb2F0UmF3U2xpY2VyMXx8InVuY2xhc3NpZmllZCIsei56TW9hdFJhd1NsaWNlcjI9bS56TW9hdFJhd1NsaWNlcjJ8fCJ1bmNsYXNzaWZpZWQiKSxBPVsiMjAxNTkyMzIiLCIzMzc3NDkxMiIsIjI3NjM1ODMyIiwiMzIyNzY4MzIiLCIxOTk3MTY3MiJdLG0mJm0ubW9hdENsaWVudExldmVsMSYmIWEuYS5heChBLG0ubW9hdENsaWVudExldmVsMSkmJih6LnpNb2F0QmxhY2tsaXN0PSEwKSxhLmEuZHUoe2FsbDohMH0sQykmJmUoeixtKSx6Lmd3PSJyZXV0ZXJzaGVhZGVyMTk0ODgzNTUyMDI0Iix6LmZkPSIxIik7ei5hYz0xO3ouaXQ9YS52LnY7YS5jLmFtKCkuaXNJbkFwcCYmKHoubHY9YS5jLmNwKCksei56bD1hLmMuZWEoKT8xOjAsYS5jLmNxKCk/KGEuYS5icCgpJiYoei53bz0xKSwoQz1hLmEuYmwoYS5jLmJjKSkmJih6LnpNb2F0TU1BS25zPUMpKTphLmMuZGEoKSYmKHoubHg9MSkpO2EuZC5jKCkmJmsoeik7Zyh6LG0pOyhDPWEuYXEuYSgpKSYmKHoucGU9Qyk7YS5rLmEuemF4cygiZHJvcE5vbkFkUGl4ZWwiLHosbixtLHgsRyx1KTtoKHosdSk7eD1sKHopO249VzttPWEueS5kKG0seCsiJmNzPTAiLHopO2lmKCEwPT09dSlyZXR1cm57cXM6eixyZXM6bX07bS5zaG91bGRTZW5kUGl4ZWwmJm0ucXVlcnlzdHJpbmcmJnIueWgueWkobS5xdWVyeXN0cmluZyxuKX19O2EueS5hPWZ1bmN0aW9uKG4sbSx4KXtpZih3aW5kb3cmJndpbmRvdy5jbG9zZWR8fCFufHwhMD09PW4uZXApcmV0dXJuITE7dmFyIEc9bi5nZXRGb3JtYXQoKTthLnkuYyhtLG4uYW8pO2MobSk7dHJ5e20ua3E9YS5jLmUmJmEuYy5lLmRldmljZVBpeGVsUmF0aW99Y2F0Y2godSl7bS5rcT0xfWEudi5xKG4pO2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIG4uYW8mJigyIT09bi5hbnx8MSE9PW0uZSYmMyE9PW0uZSkmJiEobS5lIGluIHNhKSl7bS5sbz1uLkZJTkRfQURfVFJJRVM7bi5wcm94eVRyYWNraW5nRW5hYmxlZCYmKG0udHI9MSk7bS51az1hLmEuYmwoYS5jLmJjKTt2YXIgQT1hLmEuYm4oKSxDPWEuYS5ibShBLnJlc3VsdHMpLHo9e2FydGljbGU6InBrIixwYWdlX2hlaWdodDoid2siLG1ldGFfcHJvcGVydGllczoicmsiLGZhdmljb246InRrIn07YS5hLmZvckVhY2goQyxmdW5jdGlvbihhKXttW3pbYV1dPUEucmVzdWx0c1thXT8xOjB9KTtuLmhhc05vbklmcmFtZUxpc3RlbmVyJiYobS5uaT0xKTt2YXIgQj1uLmFnLEM9e30sRT1hLncuYihuLnpyKTtpZig5PT09bS5lJiYyPT09bS5xfHwyNT09PW0uZSl7Zm9yKHZhciBEIGluIEIpQi5oYXNPd25Qcm9wZXJ0eShEKSYmIiIhPT1EJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBCW0RdJiYtMT09PUQuaW5kZXhPZigiZHZDb250YWlucyIpJiYtMT09PUQuaW5kZXhPZigiaW5kZXhPZiIpJiYtMT09PUQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJjbGlja3RhZyIpJiYoQ1sieiIrRF09QltEXSk7bS5lPTI1fTA9PT1uLmFuJiYobS5kYz1uLldNT0RFKTsic3RyaW5nIiE9PXR5cGVvZiBuLmFlfHwwIT1tLmUmJjI1IT1tLmU/bS5haz0iLSI6KEQ9YS5jLmo/NzAwOjEyMDAsbS5haz1uLmFlLmxlbmd0aDw9RD9uLmFlOm4uYWUuc2xpY2UoMCxEKSk7bi5iaT5uLmJnJiYobi5iZz1uLmJpKTtuLmJtPm4uYmsmJihuLmJrPW4uYm0pO2Yobi5hbyxtKTthLmEuY2QobSxhLmYucighMCkpO20uYnE9YS5jLm47ZyhtLG4uYW8pOzE9PT1uLmFvLnNraW4mJihtLndwPTE9PT1uLmFvLmlzU2tpbj8xOjE9PT1uLmFvLmlzQW9sU2tpbj8yOjMpO20uZz1uLmFxLmcrKzt2YXIgdixIO24uaXNTUkVNZWFzdXJhYmxlfHxuLnNldERpbWVuc2lvbnMoKTtuLklTX1BBR0VfTEVWRUx8fCgxPT09bi5hby5za2luPyhIPWEuYy5yKGEuYy5lKSx2PUgud2lkdGgsSD1ILmhlaWdodCk6bi5jb21wb3NpdGVBZEFyZWFQeD8odj1uLmNvbXBvc2l0ZUFkQXJlYVB4LEg9MSk6KHY9bi5JTklUSUFMX1dJRFRILEg9bi5JTklUSUFMX0hFSUdIVCkpO3Y9dnx8MDtIPUh8fDA7MDx2JiYwPEgmJihuLmlzU1JFTWVhc3VyYWJsZT0hMCk7bS5ocT1hLmMubT8xOjA7bS5ocz1hLmMuaj8xOjA7bS5odT1hLmMuYWg/MTowO20uaHI9YS5jLmFkPzE6MDttLmh0PWEuYy5haz8xOjA7bS5kbnQ9YS5jLmVqPzE6MDttLmg9SDttLnc9djttLnJtPW4uaXNTUkVNZWFzdXJhYmxlPzE6MDt0cnl7YS5jLmRsKCkmJm4mJm4uZWxlbWVudFJlY3QmJihtLmZ5PW4uZWxlbWVudFJlY3QubGVmdCxtLmdwPW4uZWxlbWVudFJlY3QudG9wKX1jYXRjaCh1KXt9ZChtLG4uYW8sRyk7YihtLG4uYW8pO2EuaCYmKG0uY209YS5hLmFzKGEuaCxhLmkpLm11bHRpcGxpZXIpO20uZj1OdW1iZXIoIWthKTtuLklTX1BBR0VfTEVWRUx8fHAobSxtLmUpO3QobSxtLmUpO20udD1uLmFvLnN0YXJ0VGltZTttLmRlPW4uYW8ucmFuZDttLnJ4PWEuYy5heC5hO20uY3U9UjttLm09bS5tfHxhLmEuYmIobik7bS5hcj0iMjlhZDU5ZC1jbGVhbiI7bS5pdz0iMzFkNjk2NSI7bS5jYj1VPzE6MDthLmEuY2gobSwicmQiLG4ucmVmcmVzaERlY2lzaW9uKTthLmEuY2gobSwiek1vYXRBUiIsbi5tb2F0QXV0b1JlZnJlc2hlZCk7YS5hLmNoKG0sInpNb2F0V0RBQyIsbi53YXNEdXBlQXV0b0NyZWF0aXZlKTttLmxsPWEuYy5kaHx8MDthLmEuY2gobSwibG0iLGEuYy5kZCgpKTttLmxuPWEuYy5wPzE6MDthLmMuYyYmKG0uZ2g9MSk7YS5jLmRjJiYobS5uaD0xKTttLnh4PWEuYy5lcisiOiIrYS5mLmFrKCk7bS50ZD1hLmMuZGU7YS5jLnQoKTttLnFhPWEuYy53O20ucWI9YS5jLng7bS5xaT1hLmMudTttLnFqPWEuYy52O20ucWY9YS5jLnk7bS5xZT1hLmMuejttLnFoPWEuYy5hYTttLnFnPWEuYy5hYjt0cnl7bS5saz1uJiZuLmVsZW1lbnRSZWN0JiZuLmVsZW1lbnRSZWN0LnRvcCthLmMuYWN8fCJ1bmRlZmluZWQifWNhdGNoKHUpe31pc05hTihhLmMuaCl8fChtLmxiPWEuYy5oKTttLmxlPUVhPzE6MDthLmYmJnZvaWQgMCE9PWEuZi5hbCYmKG0ubGY9YS5mLmFsKTthLmYmJnZvaWQgMCE9PWEuZi5hYSYmKG0ubGc9YS5mLmFhKTthLmYmJnZvaWQgMCE9PWEuZi5hbSYmKG0ubGg9YS5mLmFtKTthLmMuY2ImJihtLmZhPTEpOyJudW1iZXIiIT09dHlwZW9mIGEuYy5jZHx8aXNOYU4oYS5jLmNkKXx8KG0ueno9YS5jLmNkKTtpZihhLm0mJmEubS5hKCkpbS5jaD0xLG0uZ2g9MTtlbHNlIGlmKGEubyYmYS5vLmEpe2EuYy5idyYmKG0uc3M9MSk7aWYobiYmbi5wZXJpc2NvcGVNYW5hZ2VyKXt2PSFhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKSYmbiYmbi5jb3VudGVycyYmbi5jb3VudGVycy5zdHJpY3REd2VsbCYmMD09bi5jb3VudGVycy5zdHJpY3REd2VsbC50Q3VyJiYyMT09bS5lO0g9YS5hLmF5JiYiMCIhPWEuYS5heSgpO2lmKG4ucGVyaXNjb3BlTWFuYWdlci5tZWFzdXJhYmxlfHwhYS5jLmMmJnYmJkgpbS5jaD0xO24ucGVyaXNjb3BlTWFuYWdlci5mdWxseU1lYXN1cmFibGUmJm4uYW8mJjEhPW4uYW8uc2tpbiYmKG0uZ2E9MSl9ZWxzZSBtLmNoPTE7InVuZGVmaW5lZCIhPT10eXBlb2YgYS5vLmQmJm4mJm4uYW8mJm4uYW8uc3RhcnRUaW1lJiYhaXNOYU4obi5hby5zdGFydFRpbWUpJiYodj1hLm8uZC1uLmFvLnN0YXJ0VGltZSxtLmZnPTA8PXY/djowKX1lbHNlIG0uY2g9MDttLnZ2PUU/bi52aWV3YWJpbGl0eU1ldGhvZFtFXTowO3Y9bi52aWV3YWJpbGl0eU1ldGhvZDttLnZ3PSh2LnN0cmljdHx8MCkrIjoiKyh2LnNmcmFtZXx8MCkrIjoiKyh2LnBzY29wZXx8MCk7dj1uLnZpZXdhYmlsaXR5UGVyY2VudDttLnZwPXZbRV07bS52eD12LnN0cmljdCsiOiIrdi5zZnJhbWUrIjoiK3YucHNjb3BlOyh2PWEuYXEuYSgpKSYmKG0ucGU9dik7YS5hLmNkKG0sYS53LnUobi56cixtKSk7YS5hLmNkKG0sYS5mb2N1cy5nZXRRdWVyeVN0cmluZygpKTthLmEuY2QobSxhLmFpLmIobi56cikpO2EuYS5jZChtLGEuYXIuYShuLnpyKSk7YS5hLmNkKG0sbi5jb3VudGVycy5nZXRRcygpKTtuLnB4MiYmbi5weDIuaW5TYW1wbGUmJiFuLnB4Mi5zdWNjZXNzJiYobS56TW9hdElERj0xKTtuLnB4MiYmKG0ueGQ9KG4ucHgyLmluU2FtcGxlPyIxIjoiMCIpKyhuLnB4Mi5maXJlZFBpeGVsPyIxIjoiMCIpKTthLmFzLmEobixtKTthLmF0LmEobixtKTthLmEuY2gobSwiYWkiLHIueik7YS5hLmNoKG0sIndyIixyLkFDVElWRVRJTUVVTlRJTFNDUk9MTCk7YS5hLmNoKG0sImFwIixuLmNiKTthLmEuY2gobSwiYXgiLG4uYmcpO2EuYS5jaChtLCJheSIsbi5iaSk7YS5hLmNoKG0sImF6IixuLmJrKTthLmEuY2gobSwiYmEiLG4uYm0pO2EuYS5jaChtLCJhdyIsbi5iYyk7YS5hLmNoKG0sImJnIixuLmJkKTthLmEuY2gobSwiYmUiLG4uYmUpO2EuYS5jaChtLCJiYyIsbi5idyk7YS5hLmNoKG0sImJmIixuLmJ5KTthLmEuY2gobSwiYmgiLG4uYngpO2EuYS5jaChtLCJieiIsbi5jdSk7bS5jbD13LnJvdW5kKDEwMCpuLklSNS5BUkVBLyhtLncqbS5oKSk7MDxuLmFxWzJdJiYobS5hdT1uLmFxWzJdLTEpOzA8bi5hcVszXSYmKG0uYXY9bi5hcVszXS0xKTswPG4uYXFbMjNdJiYobS5ieT1uLmFxWzIzXS0xKTttLmF0PW4uZG07YS5hcC5oKG4uYW8sbSk7bS5kPW4uYW8ubW9hdENsaWVudExldmVsMSsiOiIrbi5hby5tb2F0Q2xpZW50TGV2ZWwyKyI6IituLmFvLm1vYXRDbGllbnRMZXZlbDMrIjoiK24uYW8ubW9hdENsaWVudExldmVsNDtuLmFvJiYobS56TW9hdFJhd1NsaWNlcjE9bi5hby56TW9hdFJhd1NsaWNlcjF8fCJ1bmNsYXNzaWZpZWQiLG0uek1vYXRSYXdTbGljZXIyPW4uYW8uek1vYXRSYXdTbGljZXIyfHwidW5jbGFzc2lmaWVkIik7dj1bIjIwMTU5MjMyIiwiMzM3NzQ5MTIiLCIyNzYzNTgzMiIsIjMyMjc2ODMyIiwiMTk5NzE2NzIiXTtuLmFvJiZuLmFvLm1vYXRDbGllbnRMZXZlbDEmJiFhLmEuYXgodixuLmFvLm1vYXRDbGllbnRMZXZlbDEpJiYobS56TW9hdEJsYWNrbGlzdD0hMCk7YS5hLmR1KHthbGw6ITB9LEcpJiZlKG0sbi5hbyk7bS5ndz0icmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNCI7Rz1hLmEuZHgoe2FsbDoiek1vYXRQUyB6TW9hdFRQIHpNb2F0U1Qgek1vYXRBUkJMIHpNb2F0QWRVbml0MSB6TW9hdFN0b3J5IHpNb2F0QVUgek1vYXRQaXhlbERpc3RhbmNlIHpNb2F0UmF3U2xpY2VyMSB6TW9hdFJhd1NsaWNlcjIgek1vYXRSZXV0ZXJzU2xpY2VyMSB6TW9hdFJldXRlcnNTbGljZXIyIHpNb2F0QmxhY2tsaXN0IHpNb2F0SlMiLnNwbGl0KCIgIil9LEcpfHx5O3Y9YS5hLmkobi5hbyk7cShtLEcsdik7bi5hby5hZEZpbmRpbmdNZXRob2QmJihtLmh2PW4uYW8uYWRGaW5kaW5nTWV0aG9kKTttLmFiPW4uYW47bS5hYz0xO20uZmQ9IjEiO20ua3Q9RTttLml0PWEudi52O24uYmk9bi5iZztuLmJtPW4uYms7YS5hYS5mKG4pJiYobS5mej0xKTtFPWEuYWEuZyhuLnpyKTttLm9xPUU/MTowOyJ1bmRlZmluZWQiIT09dHlwZW9mIG4uenImJihtLm90PWEuYWEuaFtuLnpyXS5zdGF0ZU1hc2sudG9TdHJpbmcoMTYpKTthLmMuYW0oKS5pc0luQXBwJiYobS5sdj1hLmMuY3AoKSxtLnpsPWEuYy5lYSgpPzE6MCxhLmMuY3EoKT8oYS5hLmJwKCkmJihtLndvPTEpLChFPWEuYS5ibChhLmMuYmMpKSYmKG0uek1vYXRNTUFLbnM9RSkpOmEuYy5kYSgpJiYobS5seD0xKSk7bi5kZWJ1Z0RhdGEmJihtLnpNb2F0SlM9bi5kZWJ1Z0RhdGEuZ2V0VmFsdWUoKSk7biYmbi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpJiZrKG0pO2EuZC5jKCkmJmsobSk7YS5hLmF4KFsyXSxtLmUpJiZuLmFxLnRjKys7bS50Yz1uLmFxLnRjO2Euay5hLnpheHMoImRyb3BQaXhlbCIsbixtLHgpO2gobSx4KTtHPWwobSxDKTtFPVc7aWYoeClyZXR1cm4gbTtuPWEueS5kKG4uYW8sRysiJmNzPTAiLG0sQyk7bi5zaG91bGRTZW5kUGl4ZWwmJm4ucXVlcnlzdHJpbmcmJnIueWgueWkobi5xdWVyeXN0cmluZyxFKX19O2EueS5lPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS5hLmR6KGMpO2Iuek1vYXRTcmNkPWIuZDtiLnpNb2F0U3JjYm89Yi5ibztiLnpNb2F0U3JjYnA9Yi5icDtiLnpNb2F0U3JjYmQ9Yi5iZDtiLmQ9KGMubW9hdENsaWVudExldmVsMXx8IiIpKyI6IjtiLmQrPShjLm1vYXRDbGllbnRMZXZlbDJ8fCIiKSsiOiI7Yi5kKz0oYy5tb2F0Q2xpZW50TGV2ZWwzfHwiIikrIjoiO2IuZCs9Yy5tb2F0Q2xpZW50TGV2ZWw0fHwiIjthLmEuZHUoe2FsbDohMH0sZCkmJmUoYixjKTtyZXR1cm4gYn07YS55LmY9ZnVuY3Rpb24oYixjLGQsZSxnLGgsZil7Yj0iZXh0cmFQeF8iK2I7Y1tiXXx8KGNbYl09e30pO2U9YS5hLmkoZSk7ZS56TW9hdFNyY2k9ZS5pO2UuaT1kO2YmJihlPWEueS5lKGUsZikpO2lmKGEuZi5hbiYmIWNbYl0udGltZXN0YW1wc1Jlc2V0KWZvcih2YXIgaz0wO2s8YS5mLmFuLmxlbmd0aDtrKyspe3ZhciBwPWEuZi5hbltrXTtwLnpNb2F0U3JjaT1wLmk7cC5pPWQ7ZiYmKHA9YS55LmUocCxmKSk7cD1sKHApKyImY3M9MCI7ci55aC55aShwLGcpfWNbYl0udGltZXN0YW1wc1Jlc2V0fHwoY1tiXS50aW1lc3RhbXBzUmVzZXQ9ITAsZS5sYyYmKGUubGM9MCksZS5jZCYmKGUuY2Q9MCksZS5zbSYmKGUuc209MCksZS5mdiYmKGUuZnY9MCksZS5wbiYmKGUucG49MCksZS5sdCYmKGUubHQ9MCksZS5iYSYmKGUuYmE9MCksZS5zcSYmKGUuc3E9MCksZS5nZyYmKGUuZ2c9MCksZS5tdSYmKGUubXU9MCksZS5zaSYmKGUuc2k9MCksZS5tYyYmKGUubWM9MCksZS5kdCYmKGUuZHQ9MCksZS5ndCYmKGUuZ3Q9MCksZS5hbyYmKGUuYW89MCksZS5tayYmKGUubWs9MCksZS5kciYmKGUuZHI9MCksZS5ldiYmKGUuZXY9MCksZS5nZSYmKGUuZ2U9MCksZS5teCYmKGUubXg9MCksZS5hbiYmKGUuYW49MCksZS5jZiYmKGUuY2Y9MCksZS5nbCYmKGUuZ2w9MCksZS5tdyYmKGUubXc9MCksZS54YiYmKGUueGI9MCksZS5kYiYmKGUuZGI9MCksZS5hbSYmKGUuYW09MCksZS5maiYmKGUuZmo9MCksZS5teSYmKGUubXk9MCksZS5teiYmKGUubXo9MCksZS5jbiYmKGUuY249MCksZS5lcyYmKGUuZXM9MCksZS5zYSYmKGUuc2E9MCksZS5wZiYmKGUucGY9MCksZS5heSYmKGUuYXk9MCksZS5ieCYmKGUuYng9MCkpO2I9bChlLGgpO3IueWgueWkoYisiJmNzPTAiLGcpfTthLnkuZD1mdW5jdGlvbihiLGMsZCxlKXtiPSEwO2lmKGEuaCYmKGI9YS5hLmF1KCksIWIpKXtmb3IodmFyIGc9WzEsMiwzLDIzLDI1XSxoPTAsZj1nLmxlbmd0aDtoPGY7aCsrKWlmKGQuZT09Z1toXSl7Yj0hMDticmVha31iJiYoZC5jbT0wLGM9bChkLGUpLGMrPSImY3M9MCIpfXJldHVybntzaG91bGRTZW5kUGl4ZWw6YixxdWVyeXN0cmluZzpjfX07YS55Lmc9ZnVuY3Rpb24oYSxiKXtpZigyIT09YS5hbnx8MSE9PWIuZSYmMyE9PWIuZSluZXcgSW1hZ2UoMSwxKS5zcmM9IiJ9O2EueS5oPWZ1bmN0aW9uKGIpe3ZhciBjPWEueS5pKGIuZGF0YSk7Yy5pPWEuYS5keShjLmksYi5pS2V5U3VmZml4KTt2YXIgZD1sKGMsYi5mbGFzaFZhcnNGb3JRUykrIiZjcz0wIjtpZihiLnNlbmROb3cpe2lmKGEuZi5hbilmb3IodmFyIGU9MDtlPGEuZi5hbi5sZW5ndGg7ZSsrKXt2YXIgZz1hLmYuYW5bZV07Zy5pPWEuYS5keShnLmksYi5pS2V5U3VmZml4KTtnPWwoZykrIiZjcz0wIjtyLnloLnlpKGcsYi5waXhlbFVSTCl9ci55aC55aShkLGIucGl4ZWxVUkwpfXJldHVybiBjfTthLnkuaT1mdW5jdGlvbihiKXtiPWEuYS5pKGIpO2Zvcih2YXIgYz0iYW0gYW4gYW8gYXkgYmEgYnggY2QgY2YgZGIgZHIgZHQgZXMgZXYgc2Egc3Egc2kgc20gbWMgbGMgcGYgeGIgZ2UgZ2cgY24gZ2wgcG4gZmogbHQgbXUgbWsgbXcgbXggbXkgbXogZnYiLnNwbGl0KCIgIiksZD0wO2Q8Yy5sZW5ndGg7ZCsrKWJbY1tkXV0mJihiW2NbZF1dPTApO3JldHVybiBifTthLnkuaj1mdW5jdGlvbihhLGIpe3JldHVybiBsKGEsYil9O2EueS5rPWZ1bmN0aW9uKGIpe3ZhciBjPXtlOjE2fTtjLnE9Yi5hcVsxNl0rKzthLnkuYShiLGMpfTthLnkubD1mdW5jdGlvbihiKXt2YXIgYz0hMSxkPSEhYiYmYi5nZXRGb3JtYXQoKSxlPWEueS5iKDgsYi5hbywhMSwhMSwhMCk7aWYoZSYmZS5xcyYmZS5xcy5kKXtjPWUucXMuZC5zcGxpdCgiOiIpO2M9e3ZpZXdIYXNoOiJSRVVURVJTX0hFQURFUjEiLG1vYXRDbGllbnRMZXZlbDE6Y1swXSxtb2F0Q2xpZW50TGV2ZWwyOmNbMV0sbW9hdENsaWVudExldmVsMzpjWzJdLG1vYXRDbGllbnRMZXZlbDQ6Y1szXSx0YWdTdGFydFRpbWU6YS5jLmJqfTtpZihiJiZiLmFvKWZvcih2YXIgZyBpbiBiLmFvKWIuYW8uaGFzT3duUHJvcGVydHkoZykmJi0xIT1nLmluZGV4T2YoInpNb2F0IikmJihjW2ddPWIuYW9bZ10pO2ZvcihnIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShnKSYmLTEhPWcuaW5kZXhPZigiek1vYXQiKSYmKGNbZ109ZVtnXSk7YS5hLmR1KHthbGw6ITB9LGQpJiYoYj1jLGU9ZS5xcyxiLm1vYXRDbGllbnRTbGljZXIxPWUuYm8sYi5tb2F0Q2xpZW50U2xpY2VyMj1lLmJkKX1yZXR1cm4gY307YS55Lm09ZnVuY3Rpb24oYil7dmFyIGM9e2U6OH07Yy5xPWIuYXFbOF0rKztyZXR1cm4gYS55LmEoYixjLCEwKX19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhkLGMsYixlLGgpe3ZhciBmPTFlNDthLmMuYW0oKS5pc0luQXBwJiYoZj01MDApOyhuZXcgQSkuZ2V0VGltZSgpO3RoaXMudE1heENvbnRpbnVvdXM9dGhpcy50Q29udGludW91cz10aGlzLnRMYXN0PXRoaXMudEN1cj0wO3RoaXMuZ2V0TWF4Q29udGludW91cz1mdW5jdGlvbigpe3JldHVybiB3Lm1heCh0aGlzLnRDb250aW51b3VzLHRoaXMudE1heENvbnRpbnVvdXMpfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy50TGFzdD10aGlzLnRDdXI9MH07dGhpcy51cGRhdGU9ZnVuY3Rpb24oYSxiLGMpe2QoYSk/KGI9dy5taW4oYixmKSxhPXR5cGVvZiBlLGImJjA+YiYmKGI9MCksdGhpcy50Q3VyKz1iLHRoaXMudENvbnRpbnVvdXMrPWIsIm51bWJlciI9PT1hJiYwPGU/dGhpcy50Q3VyPmUmJih0aGlzLnRDdXI9ZSk6ImZ1bmN0aW9uIj09PWEmJihiPWUoKSwibnVtYmVyIj09PXR5cGVvZiBiJiZ0aGlzLnRDdXI+YiYmMDxiJiYodGhpcy50Q3VyPWIpKSk6KHRoaXMudE1heENvbnRpbnVvdXM8dGhpcy50Q29udGludW91cyYmKHRoaXMudE1heENvbnRpbnVvdXM9dGhpcy50Q29udGludW91cyksdGhpcy50Q29udGludW91cz0wKTtoJiZoKHRoaXMudEN1cil9O3RoaXMuZ2V0UXM9ZnVuY3Rpb24oYSl7YT10aGlzLnF1ZXJ5KGEpO3RoaXMudExhc3Q9dGhpcy50Q3VyO3JldHVybiBhfTt0aGlzLnF1ZXJ5PWZ1bmN0aW9uKGEpe2E9YXx8e307dGhpcy50TGFzdD50aGlzLnRDdXImJih0aGlzLnRMYXN0PXRoaXMudEN1cik7YyYmYiYmKGFbY109dGhpcy50Q3VyLGFbYl09dGhpcy50TGFzdCk7cmV0dXJuIGF9fWEuYWM9e307YS5hYy5oPXt9O2EuYWMuaC5hPVtdO2EuYWMuaC5iPVtdO3ZhciBkPSExLGY9e307YS5hYy5pPWZ1bmN0aW9uKCl7aWYoIWQpe2Q9ITA7dHJ5e3Iuc3dkZS5henN4KCJzY3JvbGwiLGEuYWMuail9Y2F0Y2goZyl7fX19O2EuYWMuaz1mdW5jdGlvbihkLGMpe3RyeXt2YXIgYj1kLmFhLGU9YS5hLmJnKGIsNSksaD1lJiYoNj09ZS5sZW5ndGh8fDE8PWUubGVuZ3RoJiYiSFRNTCI9PT1lW2UubGVuZ3RoLTFdLm5vZGVOYW1lKTtjPWN8fGQuV0lORE9XfHxhLmEuYmUoYik7cmV0dXJuIShiJiZjJiZoKXx8YS5hLmVhKFsiZmVhdGhlciIsImRpc3BsYXkiLCJ2aWRlbyJdLGQuYW8pJiYiVW5pY2FzdCBHZW5lcmljIj09PWQuYW8uYWN0aXZlQ29uZmlnJiZhLnQuayhkLnpyKSYmKDM+Yi5vZmZzZXRXaWR0aHx8Mz5iLm9mZnNldEhlaWdodCl8fGIub3duZXJEb2N1bWVudCYmYi5vd25lckRvY3VtZW50LmJvZHkmJiFiLm93bmVyRG9jdW1lbnQuYm9keS5jb250YWlucyhiKT8hMTohMH1jYXRjaChmKXtyZXR1cm4hMX19O2EuYWMubD1mdW5jdGlvbigpe2Z1bmN0aW9uIGQoKXtpZighZil0cnl7Zj0hMCxjKGgpLGY9ITF9Y2F0Y2goYSl7dGhyb3cgZj0hMSxhfX1mdW5jdGlvbiBjKGEpe3ZhciBjPWEuTW9hdDthPWEuZG9tTm9kZXNJZFRvQWQ7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYy5hLmVhKFsiZmVhdGhlciIsImRpc3BsYXkiLCJ2aWRlbyJdLGFbZF0uYW8pJiZjLnQubSgibG9vcCIsZCk7Yy5hYy5tKCk7ZD0obmV3IEEpLmdldFRpbWUoKTthPXcubWF4KHcubWluKGQtYixlKSwwKTtjLmsuYS56YXhzKCJ2aWV3OnRpY2siLGEsZCk7Yj1kO2MuYW8uYigpfXZhciBiPShuZXcgQSkuZ2V0VGltZSgpLGU9MWU0O2EuYy5hbSgpLmlzSW5BcHAmJihlPTUwMCk7dmFyIGg9e01vYXQ6YSxkb21Ob2Rlc0lkVG9BZDpCfSxmPSExO2Euay5hLmF6c3goInBlcmlzY29wZTpvblN0YXRlQ2hhbmdlIixkKTthLmsuYS5henN4KCJ2aWV3Q291bnRlclN0YXJ0ZWQiLGQpO3ZhciBrPSJNT0FUX1ZJRVdfTE9PUF9JRF8iKyhuZXcgQSkuZ2V0VGltZSgpO2EubC5nKGMsaCwyMDAsayk7cmV0dXJuIGEuYS5kZihbaF0sYyl9KCk7YS5hYy5tPWZ1bmN0aW9uKCl7dmFyIGQsYztmb3IoYyBpbiBCKUIuaGFzT3duUHJvcGVydHkoYykmJihkPUJbY10sYS5hYy5rKGQsZC5XSU5ET1cpfHxhLmFjLmcoZCkpfTthLmFjLmc9ZnVuY3Rpb24oZCl7aWYoITAhPT1kLmVwKXtpZighamEpe3ZhciBjPXtzaG91bGRLaWxsQWQ6ITB9O2Euay5hLnpheHMoImJlZm9yZUFkS2lsbGVkIixjLGQpO2lmKCFjLnNob3VsZEtpbGxBZClyZXR1cm59YS5rLmEuemF4cygiYWRLaWxsZWQiLGQpO2EuZC5sKGQpfX07YS5hYy5jPWZ1bmN0aW9uKGQpe2QuZXF8fChkLmVxPSEwKTt2YXIgYz17ZTo1fTtjLnE9ZC5hcVs1XSsrO2EueS5hKGQsYyl9O2EuYWMuYj1mdW5jdGlvbihkKXtpZighZHx8IWQuYXF8fCFkLmFxWzBdKXJldHVybiExO3ZhciBjPXtlOjM3fTtjLnE9ZC5hcVszN10rKzthLnkuYShkLGMpfTthLmFjLm49W107YS5hYy5vPWZ1bmN0aW9uKGQsYyl7dmFyIGI9ITE7aWYoIWR8fCFkLmFxfHwhZC5hcVsyOV18fDM+ZC5hcVsyOV0pcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBoPWNbZV07LTE9PT1hLmEuaW5kZXhPZihhLmFjLm4saCkmJihiPSEwLGEuYWMubi5wdXNoKGgpKX1iJiYoYj17ZTozN30sYi5xPWQuYXFbMzddKyssYS55LmEoZCxiKSl9O2EuYWMuYT1mdW5jdGlvbihkKXt2YXIgYztjPWQuYWE7aWYoMT09ZC5hby5za2luKXJldHVybiExO2lmKGEuYWkuYyhkKSlyZXR1cm4hMDtkLmVsZW1lbnRSZWN0fHwoZC5jdXJyZW50V2lkdGg9Yy5vZmZzZXRXaWR0aCxkLmN1cnJlbnRIZWlnaHQ9Yy5vZmZzZXRIZWlnaHQpO2M9ZC5jdXJyZW50V2lkdGg7ZD1kLmN1cnJlbnRIZWlnaHQ7cmV0dXJuIDM+Y3x8Mz5kfHwhYS5jLmNlKCkmJmEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKT8hMDohMX07YS5hYy5lPWZ1bmN0aW9uKGQpe3JldHVybiBkP2EuZm9jdXMucGFnZUlzVmlzaWJsZSgpOiExfTthLmFjLnA9ZnVuY3Rpb24oZCl7dmFyIGM9MTtzY3JlZW4uZGV2aWNlWERQST9jPXNjcmVlbi5kZXZpY2VYRFBJL3NjcmVlbi5zeXN0ZW1YRFBJOmQuZGV2aWNlUGl4ZWxSYXRpbyYmInVuZGVmaW5lZCIhPT10eXBlb2YgZC5tb3pJbm5lclNjcmVlblgmJihjPWQuZGV2aWNlUGl4ZWxSYXRpbyk7cmV0dXJuKGQ9YS5jLnMoKSk/e3c6YypkLndpZHRoLGg6YypkLmhlaWdodH06e3c6MCxoOjB9fTthLmFjLmY9ZnVuY3Rpb24oZCl7ZC5jb3VudGVycz17fTtkLmNvdW50ZXJzLmxheER3ZWxsPW5ldyBrKGZ1bmN0aW9uKCl7cmV0dXJuIWEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKX0sImJ1IiwiY2QiKTtkLmNvdW50ZXJzLnN0cmljdER3ZWxsPW5ldyBrKGEuZm9jdXMucGFnZUlzVmlzaWJsZSwiYWgiLCJhbSIpO2QuY291bnRlcnMucXVlcnk9ZnVuY3Rpb24oKXt2YXIgYT17fSxjO2ZvcihjIGluIHRoaXMpaWYodGhpcy5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9dGhpc1tjXTsiZnVuY3Rpb24iPT09dHlwZW9mIGQucXVlcnkmJmQucXVlcnkoYSl9cmV0dXJuIGF9O2QuY291bnRlcnMuZ2V0UXM9ZnVuY3Rpb24oKXt2YXIgYT17fSxjO2ZvcihjIGluIHRoaXMpaWYodGhpcy5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9dGhpc1tjXTsiZnVuY3Rpb24iPT09dHlwZW9mIGQuZ2V0UXMmJmQuZ2V0UXMoYSl9cmV0dXJuIGF9O2QuY291bnRlcnMudXBkYXRlPWZ1bmN0aW9uKGEsYyxkKXtmb3IodmFyIGcgaW4gdGhpcylpZih0aGlzLmhhc093blByb3BlcnR5KGcpKXt2YXIgZj10aGlzW2ddOyJmdW5jdGlvbiI9PT10eXBlb2YgZi51cGRhdGUmJiEwIT09YS5lcCYmZi51cGRhdGUoYSxjLGQpfX07YS5rLmEuYXpzeCgic3RhcnRBZFRyYWNraW5nIixhLmFjLmkpO3ZhciBjPWEuay5hLmF6c3goInZpZXc6dGljayIsYS5hLmRmKFtkXSxkLmNvdW50ZXJzLnVwZGF0ZSxkLmNvdW50ZXJzKSk7ZltkLnpyXT1jfTthLmFjLnE9ZnVuY3Rpb24oKXtyLno9dm9pZCAwO3IuQUNUSVZFVElNRVVOVElMU0NST0xMPXZvaWQgMDtyLnpzPSExO3IueHo9ITE7ci5kY3N4LndzcWEoImdsb2JhbFNjcm9sbGV2ZW50IityLmRjc3gudWlkKTthLmEuZm9yRWFjaChhLmFjLmguYSxmdW5jdGlvbihhKXtpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEpdHJ5e2EoKX1jYXRjaChjKXt9fSl9O2EuYWMuaj1mdW5jdGlvbihkKXtpZihhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKSl7ZD0obmV3IEEpLmdldFRpbWUoKTsidW5kZWZpbmVkIj09PXR5cGVvZiByLnomJihyLno9ZC1SKTtpZigidW5kZWZpbmVkIj09PXR5cGVvZiByLkFDVElWRVRJTUVVTlRJTFNDUk9MTCl7dmFyIGM9YS5mb2N1cy5mb2N1c1N0YXJ0VGltZXx8UjtjPFImJihjPVIpO3IuQUNUSVZFVElNRVVOVElMU0NST0xMPWQtY31hOntmb3IodmFyIGIgaW4gQilpZihCLmhhc093blByb3BlcnR5KGIpJiYoZD1CW2JdKSYmInVuZGVmaW5lZCIhPT10eXBlb2YgZC5hbyl7aWYoZC5jZSlicmVhayBhO2M9e2U6NH07Yy5xPWQuYXFbNF0rKztjLmFpPXIuejtjLndyPXIuQUNUSVZFVElNRVVOVElMU0NST0xMO2EueS5hKGQsYyk7ZC5jZT0hMH10cnl7ci5kY3N4LndzcWEoImdsb2JhbFNjcm9sbGV2ZW50IityLmRjc3gudWlkKSxyLnN3ZGUuc3hheigic2Nyb2xsIix7Y2FsbGJhY2s6YS5hYy5qfSl9Y2F0Y2goZSl7fX19fTthLmFjLmQ9ZnVuY3Rpb24oZCxjKXt2YXIgYj17ZTo5fTtiLnE9ZC5hcVs5XSsrO2QuY2k9K25ldyBBO2MmJiJvYmplY3QiPT09dHlwZW9mIGMmJmEuYS5mb3JFYWNoKGMsZnVuY3Rpb24oYSxjKXtiW2NdPWF9KTthLnkuYShkLGIpfTthLmsuYS5henN4KCJhZEtpbGxlZCIsZnVuY3Rpb24oZCl7ZCYmIWQuZXAmJmYuaGFzT3duUHJvcGVydHkoZC56cikmJmEuay5hLnN4YXooInZpZXc6dGljayIse2lkOmZbZC56cl19KX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYSxmKXtmdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbigpe3RyeXthLnNlbmRpbmcmJihhLnNlbmRpbmc9ITEsaz0wLGMoKSl9Y2F0Y2goYil7fX19ZnVuY3Rpb24gYyhhLGIpe2lmKGEpe3ZhciBjPXtxczphLGpzZDpifTtpZigwPT09YS5pbmRleE9mKCJlPTIxJiIpKXtlKGMsITApO3JldHVybn1sLnB1c2goYyl9MD09PWsmJjA8bC5sZW5ndGgmJihrKyssYz1sLnNoaWZ0KCksYy5zZW5kaW5nPSEwLGMudWlkPWYuTWF0aC5mbG9vcigxZTEwKmYuTWF0aC5yYW5kb20oKSksYy50aW1lb3V0SWQ9c2V0VGltZW91dChnKGMpLDJlMykseFtjLnVpZF09YyxlKGMpKX1mdW5jdGlvbiBiKCl7dHJ5e3JldHVybiBuZXcgdCgxLDEpfWNhdGNoKGEpe3ZhciBiPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtiLmhlaWdodD0xO2Iud2lkdGg9MTtyZXR1cm4gYn19ZnVuY3Rpb24gZShhLGMpe3ZhciBkPWIoKTtkLnRvU2VuZD1hO2N8fChkLm9uZXJyb3I9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRvU2VuZDthLmZhaWxlZEF0dGVtcHRzPSJudW1iZXIiPT10eXBlb2YgYS5mYWlsZWRBdHRlbXB0cz9hLmZhaWxlZEF0dGVtcHRzKzE6MDt2YXIgYj0oYS5qc2QrIi9waXhlbC5naWY/IithLnFzKS5sZW5ndGg7MT5hLmZhaWxlZEF0dGVtcHRzP2UoYSk6bSYmYj5yJiZoKGEpfSxkLm9ubG9hZD1mdW5jdGlvbigpe2godGhpcy50b1NlbmQpfSk7ZC5zcmM9YS5qc2QrIi9waXhlbC5naWY/IithLnFzfWZ1bmN0aW9uIGgoYSl7dmFyIGI9YSYmYS51aWQmJngmJnhbYS51aWRdO2lmKGEmJmEucXMmJiJ0cmFjZXI9Ij09YS5xcylyZXR1cm4hMTtpZihiKXt4W2EudWlkXT1udWxsO3RyeXtkZWxldGUgeFthLnVpZF19Y2F0Y2goZCl7fXRyeXtjbGVhclRpbWVvdXQoYi50aW1lb3V0SWQpfWNhdGNoKGQpe31pZigiYm9vbGVhbiIhPXR5cGVvZiBiLnNlbmRpbmd8fGIuc2VuZGluZyliLnNlbmRpbmc9ITE7ZWxzZSByZXR1cm4hMX0wPGsmJmstLTtjKCl9dmFyIGw9W10saz0wLHQscT1mW2FdLHk9Zi5NYXRoLmZsb29yKDFlMTAqZi5NYXRoLnJhbmRvbSgpKSx4PXt9O3EueWg9e307cT1xLnloO3Q9Zi5JbWFnZTtxLnlpPWZ1bmN0aW9uKGEsYil7YyhhLGIpfTtxLnhxPWZ1bmN0aW9uKCl7cmV0dXJuIHl9O3ZhciBuLG0scj0yMDgzO3RyeXtuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uaW5uZXJIVE1MPSJceDNjIS0tW2lmIElFIDhdPng8IVtlbmRpZl0tLVx4M2UiLG09IngiPT09bi5pbm5lckhUTUx9Y2F0Y2godSl7bT0hMX19YS5hdT17fTthLmF1LmE9ZnVuY3Rpb24oZCl7dHJ5e2lmKHIueWgpcmV0dXJufWNhdGNoKGYpe31hLmEuZGooaywiJyIrYS5jLmF3KyInLHdpbmRvdyIsZCl9fSkodSk7KGZ1bmN0aW9uKGEpe2EuYXY9e307YS5hdi5hPWZ1bmN0aW9uKGssZCl7dmFyIGY9ITA7ZCYmYS5jLmR0KGssITApfHwoZj0hMSk7aWYoZil7Zj0hMDtkJiZkLmdldENhcmVBYm91dEZvY3VzJiYoZj1kLmdldENhcmVBYm91dEZvY3VzKCkpO3ZhciBnPWEuYWMuYShrKSxmPSghZnx8YS5hYy5lKGspKSYmIWd9cmV0dXJuIGZ9O2EuYXYuYj1mdW5jdGlvbihrKXt0aGlzLmxhYmVsPWs7dGhpcy5tZXRyaWNzPXt9O3RoaXMuaGFzVGlja1VwZGF0ZU1ldHJpY3M9ITE7dGhpcy5zZXQ9ZnVuY3Rpb24oYSxmLGcpe3RoaXMubWV0cmljc1thXT10aGlzLm1ldHJpY3NbYV18fHt9O3RoaXMubWV0cmljc1thXS52YWx1ZT1mfHwwO2cmJih0aGlzLmhhc1RpY2tVcGRhdGVNZXRyaWNzfHwodGhpcy5oYXNUaWNrVXBkYXRlTWV0cmljcz0hMCksdGhpcy5tZXRyaWNzW2FdLmluY3JlbWVudFZhbHVlPWcuaW5jcmVtZW50VmFsdWV8fCJkZWx0YSIsdGhpcy5tZXRyaWNzW2FdLmlnbm9yZVN0YXRlQ2hlY2s9Zy5pZ25vcmVTdGF0ZUNoZWNrfHwhMSx0aGlzLm1ldHJpY3NbYV0uc2hvdWxkSW5jcmVtZW50Rm49Zy5zaG91bGRJbmNyZW1lbnRGbix0aGlzLm1ldHJpY3NbYV0ucG9zdEluY3JlbWVudGF0aW9uRm49Zy5wb3N0SW5jcmVtZW50YXRpb25Gbnx8ITEsdGhpcy5tZXRyaWNzW2FdLmlnbm9yZU9taWRDaGVjaz1nLmlnbm9yZU9taWRDaGVja3x8ITEsZy51c2VEZWx0YUNvbXBlbnNhdGlvbiYmKHRoaXMubWV0cmljc1thXS51c2VEZWx0YUNvbXBlbnNhdGlvbj0hMCx0aGlzLm1ldHJpY3NbYV0uaW5jcmVtZW50ZWRMYXN0VGljaz0hMSkpO3JldHVybiB0aGlzLm1ldHJpY3NbYV0udmFsdWV9O3RoaXMuaW5jcmVtZW50PWZ1bmN0aW9uKGEsZixnLGMsYil7dmFyIGU9IXRoaXMubWV0cmljc1thXXx8Im51bWJlciIhPT10eXBlb2YgdGhpcy5tZXRyaWNzW2FdLnZhbHVlO3RyeXtpZihjLmRlYnVnRGF0YSYmZSYmInB1YmxpY2lzX2NvdW50ZXIiPT10aGlzLmxhYmVsKXt2YXIgaDt0aGlzLm1ldHJpY3NbYV0/dGhpcy5tZXRyaWNzW2FdLnZhbHVlJiYoaD10aGlzLm1ldHJpY3NbYV0udmFsdWUpOmg9Ik5PTkUiO3ZhciBsPVtmLGgsYl0uam9pbigiLSIpO2MuZGVidWdEYXRhLmNhY2hlLnB1c2gobCl9fWNhdGNoKGspe31mPWU/dGhpcy5zZXQoYSxmKTp0aGlzLm1ldHJpY3NbYV0udmFsdWUrPWY7Im51bWJlciI9PT10eXBlb2YgZyYmKGY9dGhpcy5jYXAoYSxmKSk7cmV0dXJuIGZ9O3RoaXMuY2FwPWZ1bmN0aW9uKGEsZil7cmV0dXJuIHRoaXMuc2V0KGEsdy5taW4odGhpcy5nZXQoYSksZikpfTt0aGlzLm1heD1mdW5jdGlvbihhLGYpe3JldHVybiB0aGlzLnNldChhLHcubWF4KHRoaXMuZ2V0KGEpLGYpKX07dGhpcy5nZXQ9ZnVuY3Rpb24oZCxmKXtpZighYS5kLmMoKXx8InZpc09uTGFzdENoZWNrIj09PWR8fHRoaXMubWV0cmljc1tkXSYmdGhpcy5tZXRyaWNzW2RdLmlnbm9yZU9taWRDaGVjaylyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLm1ldHJpY3NbZF0/dGhpcy5zZXQoZCwidW5kZWZpbmVkIiE9PXR5cGVvZiBmP2Y6MCk6dGhpcy5tZXRyaWNzW2RdLnZhbHVlfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbihkLGYsZyl7aWYoZCYmdGhpcy5oYXNUaWNrVXBkYXRlTWV0cmljcyl7Zz1hLncuayhkLnpyLCEwKTt2YXIgYz1hLmF2LmEoZCxnKSxiO2ZvcihiIGluIHRoaXMubWV0cmljcylpZihhLmEuY3kodGhpcy5tZXRyaWNzLGIpKXt2YXIgZT10aGlzLm1ldHJpY3NbYl07aWYoZS5zaG91bGRJbmNyZW1lbnRGbil7dmFyIGg9KGN8fCEwPT09ZS5pZ25vcmVTdGF0ZUNoZWNrKSYmZS5zaG91bGRJbmNyZW1lbnRGbihkLGcpO2UudXNlRGVsdGFDb21wZW5zYXRpb24/KGgmJmUuaW5jcmVtZW50ZWRMYXN0VGljaz90aGlzLmluY3JlbWVudChiLGYsdm9pZCAwLGQsMSk6KGh8fGUuaW5jcmVtZW50ZWRMYXN0VGljaykmJnRoaXMuaW5jcmVtZW50KGIsdy5yb3VuZChmLzIpLHZvaWQgMCxkLDIpLGUuaW5jcmVtZW50ZWRMYXN0VGljaz1oKTpoJiYoImRlbHRhIj09PWUuaW5jcmVtZW50VmFsdWU/dGhpcy5pbmNyZW1lbnQoYixmLHZvaWQgMCxkLDMpOiJhZGRSZXR1cm5WYWx1ZSI9PT1lLmluY3JlbWVudFZhbHVlP3RoaXMuaW5jcmVtZW50KGIsaCx2b2lkIDAsZCw0KToic2V0UmV0dXJuVmFsdWUiPT09ZS5pbmNyZW1lbnRWYWx1ZSYmdGhpcy5zZXQoYixoKSk7ImZ1bmN0aW9uIj09PXR5cGVvZiBlLnBvc3RJbmNyZW1lbnRhdGlvbkZuJiZlLnBvc3RJbmNyZW1lbnRhdGlvbkZuKGgpfX19fX07YS5hdi5jPWZ1bmN0aW9uKGssZCl7aWYoIWspcmV0dXJuITE7dmFyIGY7a1tkXT9mPWtbZF06KGY9bmV3IGEuYXYuYihkKSxrW2RdPWYpO3JldHVybiBmfTthLmF2LmQ9ZnVuY3Rpb24oayxkLGYpe2lmKCFkKXJldHVybiExO2Q9YS5hdi5jKGQsZik7ay5zZWNvbmRhcnlDb3VudGVycz1rLnNlY29uZGFyeUNvdW50ZXJzfHxbXTtrLnNlY29uZGFyeUNvdW50ZXJzLnB1c2goZCk7cmV0dXJuIGR9fSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoZCxjLGIpe3RoaXMubmFtZT1kO3RoaXMucmVhY2hlZEluVmlld1RpbWVUaHJlc2hvbGQ9ITE7dGhpcy5hbHdheXNJbnZpZXc9ITA7dGhpcy5xdWVyeVN0cmluZ0tleT1iLnF1ZXJ5U3RyaW5nS2V5O3RoaXMudGltZVRocmVzaG9sZD1iLnRpbWVUaHJlc2hvbGR8fDFlMzt0aGlzLnJhd1BlcmNUaHJlc2hvbGQ9Yi5wZXJjVGhyZXNob2xkLzEwMHx8NTA7dGhpcy5wZXJjVGhyZXNob2xkPXcubWluKGIucGVyY1RocmVzaG9sZC8xMDAsLjk4KTt0aGlzLmNvbnRpbnVvdXM9Yi5jb250aW51b3VzfHwhMTt0aGlzLnRpbWVQZXJjZW50PWIudGltZVBlcmNlbnQ7dGhpcy5jYXBUaW1lVGhyZXNob2xkPWIuY2FwVGltZVRocmVzaG9sZDt0aGlzLmF1ZGlibGU9Yi5hdWRpYmxlfHwhMTt0aGlzLnZpZGVvPWIudmlkZW98fCExO3RoaXMuZnVsbHNjcmVlbj1iLmZ1bGxzY3JlZW58fCExOyJ1bmRlZmluZWQiIT09dGhpcy50aW1lVGhyZXNob2xkJiYodGhpcy50aW1lVGhyZXNob2xkPXcubWF4KHRoaXMudGltZVRocmVzaG9sZCwxKSk7dGhpcy5jb3VudGVyU3RhdGU9e307ZD1hLmF2LmModGhpcy5jb3VudGVyU3RhdGUsImN1c3RvbUluVmlld0NvdW50ZXIiKTtkLnNldCgiaW5WaWV3VGltZSIsMCk7ZC5zZXQoImNvbnRpbnVvdXNJblZpZXdUaW1lIiwwKTtkLnNldCgibWF4Q29udGludW91c0luVmlld1RpbWUiLDApO2Quc2V0KCJ2aXNPbkxhc3RDaGVjayIsITEpO2Quc2V0KCJfdExhc3RDaGVja2VkIiwobmV3IEEpLmdldFRpbWUoKSl9YS5hdD17fTt2YXIgZD17fSxmPXt9O2EuYXQuYj1mdW5jdGlvbihhLGMsYil7dmFyIGU9Yy56cjtkW2VdfHwoZFtlXT17fSk7aWYoZFtlXS5oYXNPd25Qcm9wZXJ0eShhKXx8dm9pZCAwPT1iLnBlcmNUaHJlc2hvbGQmJnZvaWQgMD09Yi5mdWxsc2NyZWVufHx2b2lkIDA9PWIudGltZVRocmVzaG9sZCYmdm9pZCAwPT1iLnRpbWVQZXJjZW50KXJldHVybiExO2I9bmV3IGsoYSxjLGIpO3JldHVybiBkW2MuenJdW2FdPWJ9O2EuYXQuYz1mdW5jdGlvbihnLGMpe3JldHVybiFhLmQuYygpJiZkW2NdJiZkW2NdLmhhc093blByb3BlcnR5KGcpP2RbY11bZ106ITF9O2EuYXQuZD1mdW5jdGlvbihnKXtpZighZFtnXSlyZXR1cm4hMDt2YXIgYz0hMDthLmEuZm9yRWFjaChkW2ddLGZ1bmN0aW9uKGEpe2lmKCFhLnJlYWNoZWRJblZpZXdUaW1lVGhyZXNob2xkKXJldHVybiBjPSExfSk7cmV0dXJuIGN9O2sucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihkLGMsYil7aWYoZCYmdGhpcy5pc01lYXN1cmFibGUoZCkmJiF0aGlzLnJlYWNoZWRJblZpZXdUaW1lVGhyZXNob2xkKXt2YXIgZSxoPWEuYXYuYyh0aGlzLmNvdW50ZXJTdGF0ZSwiY3VzdG9tSW5WaWV3Q291bnRlciIpLGY9YS53LmsoZC56ciwhMCk7aWYoZil7dmFyIGs9Zi5nZXRMYXN0SW52aWV3UGVyY2VudCgpO2U9KGU9Zi5nZXRGdWxseUluVmlld1RocmVzaG9sZCgpKSYmIm51bWJlciI9PT10eXBlb2YgZT93Lm1pbih0aGlzLnBlcmNUaHJlc2hvbGQsZSk6dGhpcy5wZXJjVGhyZXNob2xkO2guZ2V0KCJfdExhc3RDaGVja2VkIik7aC5zZXQoIl90TGFzdENoZWNrZWQiLGIpO2I9ITA7Zi5nZXRDYXJlQWJvdXRGb2N1cyYmKGI9Zi5nZXRDYXJlQWJvdXRGb2N1cygpKTtkPWYuZ2V0UGF1c2VDaGVja2luZ0ZuP2YuZ2V0UGF1c2VDaGVja2luZ0ZuKCkoZCk6YS5hYy5hKGQpO2s9az49ZTtmPSFifHxhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKTthLmF0LmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5hdC5lJiYoaz1hLmF0LmUoaykpO2EuYXQuZiYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmF0LmYmJihmPWEuYXQuZihmKSk7az1rJiZmJiYhZDtkPWguZ2V0KCJ2aXNPbkxhc3RDaGVjayIpO2lmKGsmJmQpaC5pbmNyZW1lbnQoImluVmlld1RpbWUiLGMpLGguaW5jcmVtZW50KCJjb250aW51b3VzSW5WaWV3VGltZSIsYyk7ZWxzZSBpZihrfHxkKWM9dy5yb3VuZChjLzIpLGguaW5jcmVtZW50KCJpblZpZXdUaW1lIixjKSxoLmluY3JlbWVudCgiY29udGludW91c0luVmlld1RpbWUiLGMpO2t8fCh0aGlzLmFsd2F5c0ludmlldz0hMSk7aC5zZXQoInZpc09uTGFzdENoZWNrIixrKTtoLmdldCgiY29udGludW91c0luVmlld1RpbWUiKT5oLmdldCgibWF4Q29udGludW91c0luVmlld1RpbWUiKSYmaC5zZXQoIm1heENvbnRpbnVvdXNJblZpZXdUaW1lIixoLmdldCgiY29udGludW91c0luVmlld1RpbWUiKSk7a3x8aC5zZXQoImNvbnRpbnVvdXNJblZpZXdUaW1lIiwwKTt0aGlzLmluVmlld1RpbWVSZWFjaGVkKCkmJih0aGlzLnJlYWNoZWRJblZpZXdUaW1lVGhyZXNob2xkPSEwKX19fTtrLnByb3RvdHlwZS5nZXRJblZpZXdUaW1lPWZ1bmN0aW9uKCl7dmFyIGQ9YS5hdi5jKHRoaXMuY291bnRlclN0YXRlLCJjdXN0b21JblZpZXdDb3VudGVyIik7cmV0dXJuIHRoaXMuY29udGludW91cz9kLmdldCgibWF4Q29udGludW91c0luVmlld1RpbWUiKTpkLmdldCgiaW5WaWV3VGltZSIpfTtrLnByb3RvdHlwZS5pblZpZXdUaW1lUmVhY2hlZD1mdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT09dGhpcy50aW1lVGhyZXNob2xkJiZ0aGlzLmdldEluVmlld1RpbWUoKT49dGhpcy50aW1lVGhyZXNob2xkfTtrLnByb3RvdHlwZS5pc01lYXN1cmFibGU9ZnVuY3Rpb24oZCl7aWYoIWQpcmV0dXJuITE7dmFyIGM9ITE7InVuZGVmaW5lZCIhPT10aGlzLnRpbWVUaHJlc2hvbGQmJigicHNjb3BlIj09YS53LmIoZC56ciwhMCkmJmQuY3VzdG9taW52aWV3LnBlcmlzY29wZVRocmVzaG9sZHM/YS5hLmF4KGQuY3VzdG9taW52aWV3LnBlcmlzY29wZVRocmVzaG9sZHMsdGhpcy5yYXdQZXJjVGhyZXNob2xkKSYmYS5jLmR0KGQpJiYoYz0hMCk6YS5jLmR0KGQsITApJiYoYz0hMCkpO3JldHVybiBjfTthLmF0Lmc9ZnVuY3Rpb24oZCl7aWYoZCYmZC5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKXJldHVybiExO2EuYXQuYigiZnVsbF92aXNfMl9zZWNfY29udGludW91cyIsZCx7cGVyY1RocmVzaG9sZDoxMDAsdGltZVRocmVzaG9sZDoyZTMsdmlkZW86ITEsY29udGludW91czohMCxxdWVyeVN0cmluZ0tleToid2IifSl9O2EuYXQuaD1mdW5jdGlvbihkKXthLmF0LmcoZCk7ZC5jdXN0b21pbnZpZXc9e307ZC5jdXN0b21pbnZpZXcuZXZlbnRJZHM9e307ZC5jdXN0b21pbnZpZXcuZXZlbnRJZHMudmlld0NvdW50ZXJTdGFydGVkPWEuay5hLmF6c3goInZpZXdDb3VudGVyU3RhcnRlZCIsYS5hdC5pKTtkLmN1c3RvbWludmlldy5ldmVudElkc1sicGVyaXNjb3BlOm9uU3RhdGVDaGFuZ2UiXT1hLmsuYS5henN4KCJwZXJpc2NvcGU6b25TdGF0ZUNoYW5nZSIsYS5hdC5pLHtwcmlvcml0eTo1fSk7ZC5jdXN0b21pbnZpZXcuZXZlbnRJZHMuYWRLaWxsZWQ9YS5rLmEuYXpzeCgiYWRLaWxsZWQiLGEuYXQuaik7YS5hdC5pKGQpfTthLmF0Lmk9ZnVuY3Rpb24oZCl7dm9pZCAwIT09ZCYmKGlzTmFOKGQpfHwoZD1CW2RdKSxkJiZkLmN1c3RvbWludmlldyYmZC5jdXN0b21pbnZpZXcuZXZlbnRJZHMmJmEuYy5kdChkLCEwKSYmIWQuY3VzdG9taW52aWV3LmV2ZW50SWRzWyJ2aWV3OnRpY2siXSYmKGQuY3VzdG9taW52aWV3LmV2ZW50SWRzWyJ2aWV3OnRpY2siXT1hLmsuYS5henN4KCJ2aWV3OnRpY2siLGEuYS5kZihbZF0sYS5hdC5rKSx7cHJpb3JpdHk6Nn0pKSl9O2EuYXQuaz1mdW5jdGlvbihmLGMsYil7dmFyIGU9Zi56cjtpZighZFtlXXx8ZiYmZi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKXJldHVybiExO2EuYS5mb3JFYWNoKGRbZV0sZnVuY3Rpb24oYSl7YS51cGRhdGUoZixjLGIpfSl9O2EuYXQuaj1mdW5jdGlvbihkKXtkJiZkLmN1c3RvbWludmlldyYmZC5jdXN0b21pbnZpZXcuZXZlbnRJZHMmJihhLmsuYS5zeGF6KCJ2aWV3OnRpY2siLHtpZDpkLmN1c3RvbWludmlldy5ldmVudElkc1sidmlldzp0aWNrIl0scHJpb3JpdHk6Nn0pLGEuay5hLnN4YXooInZpZXdDb3VudGVyU3RhcnRlZCIse2lkOmQuY3VzdG9taW52aWV3LmV2ZW50SWRzLnZpZXdDb3VudGVyU3RhcnRlZH0pLGEuay5hLnN4YXooInBlcmlzY29wZTpvblN0YXRlQ2hhbmdlIix7aWQ6ZC5jdXN0b21pbnZpZXcuZXZlbnRJZHNbInBlcmlzY29wZTpvblN0YXRlQ2hhbmdlIl19KSxhLmsuYS5zeGF6KCJhZEtpbGxlZCIse2lkOmQuY3VzdG9taW52aWV3LmV2ZW50SWRzLmFkS2lsbGVkfSksYS5rLmEuc3hheigidmlkZW86QWRWaWRlb0NvbXBsZXRlIix7aWQ6ZC5jdXN0b21pbnZpZXcuZXZlbnRJZHNbInZpZGVvOkFkVmlkZW9Db21wbGV0ZSJdfSkpfTthLmF0Lmw9ZnVuY3Rpb24oKXthLmsuYS5zeGF6KCJzdGFydEFkVHJhY2tpbmciLHtpZDpmLnN0YXJ0QWRUcmFja2luZ30pO2Euay5hLnN4YXooImFsbExvY2FsQWRzS2lsbGVkIix7aWQ6Zi5hbGxMb2NhbEFkc0tpbGxlZH0pfTthLmF0LmE9ZnVuY3Rpb24oZixjKXtpZihmKXJldHVybiBhLmEuZm9yRWFjaChkW2YuenJdLGZ1bmN0aW9uKGIpeyJjdXN0b21faW52aWV3X21vZHVsZV9jb3VudGVyIj09PWIubmFtZT8oYy53bT0wLGMud2k9MCwhYS5kLmMoKSYmYi5pc01lYXN1cmFibGUoZikmJihjLndtPTEsYi5pblZpZXdUaW1lUmVhY2hlZCgpJiYoYy53aT0xKSkpOnZvaWQgMCE9Yi5xdWVyeVN0cmluZ0tleSYmKGNbYi5xdWVyeVN0cmluZ0tleV09MCwhYS5kLmMoKSYmYi5pc01lYXN1cmFibGUoZikmJihjW2IucXVlcnlTdHJpbmdLZXldPTEsYi5pblZpZXdUaW1lUmVhY2hlZCgpJiYoY1tiLnF1ZXJ5U3RyaW5nS2V5XT0yKSkpfSksY307YS5hdC5tPWZ1bmN0aW9uKGYpe2lmKCFmKXJldHVybiExO3ZhciBjPSExO2Y9Zi56cjtpZighZFtmXSlyZXR1cm4hMTthLmEuZm9yRWFjaChkW2ZdLGZ1bmN0aW9uKGEpeyJjdXN0b21faW52aWV3X21vZHVsZV9jb3VudGVyIj09PWEubmFtZSYmKGM9YS5yZWFjaGVkSW5WaWV3VGltZVRocmVzaG9sZCl9KTtyZXR1cm4gY307Zi5zdGFydEFkVHJhY2tpbmc9YS5rLmEuYXpzeCgic3RhcnRBZFRyYWNraW5nIixhLmF0LmgpfSkodSk7KGZ1bmN0aW9uKGEpe2EuYWs9e307YS5hay5iPXcuZmxvb3IoMWU4KncucmFuZG9tKCkpO2EuYWsuYT1mdW5jdGlvbihrLGQsZixnKXtpZihyJiYoZCYmKGQrPSJfIithLmFrLmIpLCFyLmpzb25wfHwhci5qc29ucFtrXSkpe3IuanNvbnA9ci5qc29ucHx8e307ci5qc29ucFtrXT1yLmpzb25wW2tdfHx7Y2FjaGVkUmVzcG9uc2U6ITF9O3ZhciBjPXIueGJ8fHdpbmRvdyxiPWMuZG9jdW1lbnQ7Y1tkXT1mdW5jdGlvbihhKXt2YXIgYjt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2I9YX1yLmpzb25wW2tdLmNhY2hlZFJlc3BvbnNlPWI7ci5zd2RlLnpheHMoaysiSnNvbnBSZWFkeSIsYik7Y1tkXT1udWxsfTt2YXIgZT1mdW5jdGlvbihiKXtiPWsrIiBKU09OUCByZXF1ZXN0IGhhbmRsaW5nIGZhaWxlZCIrKGI/YjoiIik7dHJ5e3ZhciBjPSJ1bmRlZmluZWQiIT09dHlwZW9mIG9taWROYXRpdmUmJigidW5kZWZpbmVkIj09PXR5cGVvZiBJbWFnZXx8SW1hZ2UmJkltYWdlLl9Nb2F0UHJveHlPZiksZD1jPyIiOmRvY3VtZW50LnJlZmVycmVyLGU9InVuZGVmaW5lZCIhPT10eXBlb2YgYSYmYS5jJiZhLmMubj9hLmMubjoiIixoPSJodHRwczovL3B4Lm1vYXRhZHMuY29tL3BpeGVsLmdpZj9lPTI0JmQ9ZGF0YSUzQWRhdGElM0FkYXRhJTNBZGF0YSZpPSIrZXNjYXBlKCJSRVVURVJTX0hFQURFUjEiKSsiJmFjPTEmaz0iK2VzY2FwZShiKSsiJmFyPSIrZXNjYXBlKCIyOWFkNTlkLWNsZWFuIikrIiZpdz0iK2VzY2FwZSgiMzFkNjk2NSIpKyImYnE9Iitlc2NhcGUoZSkrIiZqPSIrZXNjYXBlKGQpKyImY3M9IisobmV3IEEpLmdldFRpbWUoKTtjP29taWROYXRpdmUuc2VuZFVybChoKTpuZXcgSW1hZ2UoMSwxKS5zcmM9aH1jYXRjaChmKXt9fTt0cnl7dmFyIGg9YS5jLmJkKCksbD1mdW5jdGlvbigpeyJ1bmRlZmluZWQiPT09dHlwZW9mIGcmJihnPSJjYWxsYmFjayIpO3ZhciBjPVtmLCImIixnLCI9IixkXS5qb2luKCIiKSxlPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksaD1iLmJvZHl8fGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07YS5hLmNuKGMsaCxlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgaD8iZnVuY3Rpb24iPT09dHlwZW9mIGguZG93bmxvYWRKYXZhU2NyaXB0UmVzb3VyY2UmJmguZG93bmxvYWRKYXZhU2NyaXB0UmVzb3VyY2UoZixjW2RdLGUpOmwoKX1jYXRjaChwKXtlKHApfX19O2EuYWsuYz1mdW5jdGlvbihrLGQpe3IuanNvbnAmJnIuanNvbnBba10mJnIuanNvbnBba10uY2FjaGVkUmVzcG9uc2U/YS5hLmRmKFtyLmpzb25wW2tdLmNhY2hlZFJlc3BvbnNlXSxkKSgpOnIuc3dkZS5henN4KGsrIkpzb25wUmVhZHkiLGQse29uY2U6ITB9KX07YS5hay5kPWZ1bmN0aW9uKCl7dmFyIGs9e30sZDtyZXR1cm4gZnVuY3Rpb24oZixnLGMpe2tbZl0/YS5hay5jKGYsZ3x8ZnVuY3Rpb24oKXt9KTooInN0cmluZyI9PT10eXBlb2YgYz9kPWM6Im9iamVjdCI9PT10eXBlb2YgYyYmKGQ9YS5hay5lKGMsZikpLGEuYWsuYShmLGYrImNhbGxiYWNrIixkKSxnJiZhLmFrLmMoZixnKSxrW2ZdPSEwKX19KCk7YS5hay5lPWZ1bmN0aW9uKGssZCl7dmFyIGY7YTpzd2l0Y2goZCl7Y2FzZSJCcmFuZFNhZmV0eU5hZG9zIjpmPSIvcy92MiI7YnJlYWsgYTtjYXNlIk9uZVRhZ05hZG9zIjpmPSIvb3QvdjEiO2JyZWFrIGE7ZGVmYXVsdDpmPSIifXZhciBnPVsidXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEuYy5iYSldO2EuYS5mb3JFYWNoKGssZnVuY3Rpb24oYixjKXt2YXIgZD1jKyI9IitiO2EuYS5heChnLGQpfHxnLnB1c2goZCl9KTt2YXIgYz1nLmpvaW4oIiYiKSxjPWMrKCImb3JkPSIrYS5jLmJqKyImanY9IithLmEuY3YoYS5jLmJqK2MpKTtyZXR1cm4iaHR0cHM6Ly9tYi5tb2F0YWRzLmNvbSIrZisiPyIrY319KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhiLGQsaCl7dmFyIGY9YS5hYS5oW2JdLnN0YXRlTWFzaztpZihkPWNbZF0qKGg/MTY6MSkpYS5hYS5oW2JdLnN0YXRlTWFzaz1mfGQ8PDB9ZnVuY3Rpb24gZChiLGMsZCxmKXtkPWEuYS5kcihiLngsYy54LGQpO2I9YS5hLmRyKGIueSxjLnksZik7cmV0dXJuIGQmJmJ9ZnVuY3Rpb24gZihiLGMpe2EuYWEmJmEuYWEuaFtiXSYmKGEuYWEuaFtiXS5hbGxFZGdlc1NlZW49ITAsYS5hLmZvckVhY2goYS5hYS5oW2JdLm1lZGlhdG9ySWRzLGZ1bmN0aW9uKGIsYyl7YS5rLmEuc3hheihjLHtpZDpifSl9KSxjJiYoYS5hYS5oW2JdLmZhaWxzYWZlPSEwKSxhLmsuYS56YXhzKCJwYXNzdGhyb3VnaCIpKX12YXIgZz17fTthLmFhPXt9O2EuYWEuaT0yNDI1MDA7YS5hYS5qPTE7YS5hYS5oPXt9O3ZhciBjPXt0b3BMZWZ0OjgsdG9wUmlnaHQ6NCxib3R0b21MZWZ0OjIsYm90dG9tUmlnaHQ6MX07YS5hYS5rPWZ1bmN0aW9uKGIpe3JldHVybiFifHxiJiZiLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCl8fGEuZC5jKCk/ITE6YS5jLmRsKCl8fGEuYy5kdSgpfHx2b2lkIDB8fHZvaWQgMH07YS5hYS5hPWZ1bmN0aW9uKGIpe3JldHVybiJudW1iZXIiIT09dHlwZW9mIGJ8fGEuYS5sKCk/ITE6MjM2NDI1PD1ifTthLmFhLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuYW8/InNsYXZlIj09YS5hby5tb2F0Q2xpZW50QVQ/ITA6ITE6ITF9O2EuYWEubT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5hbz8iY3BjIj09YS5hby5tb2F0Q2xpZW50QlQ/ITA6ITE6ITF9O2EuYWEubj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5hbz8iY3BjdiI9PWEuYW8ubW9hdENsaWVudEJUPyEwOiExOiExfTthLmFhLm89ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuYW8/ImZsYXRyYXRlIj09YS5hby5tb2F0Q2xpZW50QlQ/ITA6ITE6ITF9O2EuYWEucD1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5hbz8ic2tpbiI9PWEuYW8ubW9hdENsaWVudEFUfHwiaHB0byI9PWEuYW8ubW9hdENsaWVudEFUfHwxPT1hLmFvLnNraW4/ITA6ITE6ITF9O2EuYWEuZj1mdW5jdGlvbihiKXtpZighYnx8IWIuYWEpcmV0dXJuITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmVyKXJldHVybiBiLmVyO2IudmlkZW8/IWEuYWEuayhiKXx8YS5hYS5uKGIpJiYhYi52aWRlby5yZWFjaGVkQ29tcGxldGV8fChiLmVyPSEwKTphLmFhLmwoYil8fGEuYWEubShiKXx8YS5hYS5vKGIpP2IuZXI9ITE6YS5hYS5wKGIpfHxiLmlzQ29tcG9zaXRlQWR8fGEuYWEuYShhLmEuY3MoYikpP2IuZXI9ITA6YS5hYS5rKGIpJiZhLncucyhiLGEuYWEuaiwhMCkmJihiLmVyPSEwKTtyZXR1cm4gYi5lcnx8ITF9O2EuYWEuYj1mdW5jdGlvbihiKXtpZighYnx8Yi5TRU5UX0ZJVCYmYi5ldHx8IWEuYWEuayhiKSlyZXR1cm4hMTt2YXIgYyxkLGY9YS53LmIoYi56cik7Yi5TRU5UX0ZJVHx8KGM9YS53LmYoYixmLCJoYWRGSVQiKSk7Yi5ldHx8KGQ9YS53LmYoYixmLCJoYWRGdWxsT1RTIikpO2lmKGN8fGQpYS5hYy5iKGIpLGIuU0VOVF9GSVQ9Yi5TRU5UX0ZJVHx8ISFjLGIuZXQ9Yi5ldHx8ISFkO3JldHVybiBjfHxkfTthLmFhLnE9ZnVuY3Rpb24oYixjLGgpe3ZhciBmO2EuYS5mb3JFYWNoKFtudWxsLHZvaWQgMCwhMV0sZnVuY3Rpb24oYSl7aWYoZj1jPT09YXx8aD09PWEpcmV0dXJuITF9KTtpZighMD09PWZ8fCEwIT09KGEuYS5kYihjLnRvcCkmJmEuYS5kYihjLmJvdHRvbSkmJmEuYS5kYihoLmJvdHRvbSkmJmEuYS5kYihoLnRvcCkpfHxjLnRvcD09PWMuYm90dG9tfHxjLmxlZnQ9PT1jLnJpZ2h0fHxoLnRvcD09PWguYm90dG9tfHxoLmxlZnQ9PT1oLnJpZ2h0KXJldHVybiExO3ZhciBnPWMucmlnaHQtYy5sZWZ0LGs9Yy5ib3R0b20tYy50b3AscT1nKigxLS45OCkseT1rKigxLS45OCkseD17eDpjLmxlZnQseTpjLnRvcH0sbj17eDpjLnJpZ2h0LHk6Yy50b3B9LG09e3g6Yy5sZWZ0LHk6Yy5ib3R0b219LHI9e3g6Yy5yaWdodCx5OmMuYm90dG9tfSx1PWMubGVmdCtxLEE9Yy50b3AreSxDPWMucmlnaHQtcSx6PWMudG9wK3ksQj1jLmxlZnQrcSxFPWMuYm90dG9tLXkscT1jLnJpZ2h0LXEseT1jLmJvdHRvbS15LEQ9e3g6aC5sZWZ0LHk6aC50b3B9LHY9e3g6aC5yaWdodCx5OmgudG9wfSxIPXt4OmgubGVmdCx5OmguYm90dG9tfSxGPXt4OmgucmlnaHQseTpoLmJvdHRvbX0sZz13LmNlaWwoLjAxKmcpLGs9dy5jZWlsKC4wMSprKSx4PWQoeCxELGcsayksbj1kKG4sdixnLGspLG09ZChtLEgsZyxrKSxyPWQocixGLGcsayk7YS5hYS5yKGIse3RvcExlZnQ6eCx0b3BSaWdodDpuLGJvdHRvbUxlZnQ6bSxib3R0b21SaWdodDpyfSx7dG9wTGVmdDp1Pj1oLmxlZnQmJkE+PWgudG9wLHRvcFJpZ2h0OkM8PWgucmlnaHQmJno+PWgudG9wLGJvdHRvbUxlZnQ6Qj49aC5sZWZ0JiZFPD1oLmJvdHRvbSxib3R0b21SaWdodDpxPD1oLnJpZ2h0JiZ5PD1oLmJvdHRvbX0pfTthLmFhLnM9ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYiYmMDw9YiYmIWEuYWEuaFtiXSl7YS5hYS5oW2JdPXt9O2EuYWEuaFtiXS5hbGxFZGdlc1NlZW49ITE7YS5hYS5oW2JdLm1lZGlhdG9ySWRzPXt9O2EuYWEuaFtiXS5vdXRlcj17dG9wTGVmdDohMSx0b3BSaWdodDohMSxib3R0b21MZWZ0OiExLGJvdHRvbVJpZ2h0OiExfTthLmFhLmhbYl0uaW5uZXI9e3RvcExlZnQ6ITEsdG9wUmlnaHQ6ITEsYm90dG9tTGVmdDohMSxib3R0b21SaWdodDohMX07YS5hYS5oW2JdLnN0YXRlTWFzaz0wO3ZhciBjPSJyZWN0c0F2YWlsYWJsZSIsZD1hLmsuYS5henN4KGMsYS5hYS5xKTthLmFhLmhbYl0ubWVkaWF0b3JJZHNbY109ZDtjPSJhZEVkZ2VzVmlld1N0YXR1cyI7ZD1hLmsuYS5henN4KGMsYS5hYS5yKTthLmFhLmhbYl0ubWVkaWF0b3JJZHNbY109ZDtjPSJhZEZ1bGx5VmlzaWJsZSI7ZD1hLmsuYS5henN4KGMsZix7Y29uZGl0aW9uOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGImJmMmJiFhLmFhLmcoYi56cikmJmEudyYmYS53LmImJmM9PT1hLncuYihiLnpyKX0sb25jZTohMH0pO2EuYWEuaFtiXS5tZWRpYXRvcklkc1tjXT1kfX07YS5hYS50PWZ1bmN0aW9uKGIpe3JldHVybiBhLmFhLmhbYl0uZmFpbHNhZmV9O2EuYWEucj1mdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZyhsLHkseCl7eCYmKGEuYS5mb3JFYWNoKFsidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0Il0sZnVuY3Rpb24oYSl7IXBbYV0mJmNbYV0mJihwW2FdPSEwLGsoYixhLCEwKSk7IXRbYV0mJmRbYV0mJih0W2FdPSEwLGsoYixhLCExKSl9KSwocC50b3BMZWZ0JiZwLnRvcFJpZ2h0JiZ0LmJvdHRvbUxlZnQmJnQuYm90dG9tUmlnaHR8fHQudG9wTGVmdCYmdC50b3BSaWdodCYmcC5ib3R0b21MZWZ0JiZwLmJvdHRvbVJpZ2h0fHxwLnRvcExlZnQmJnAuYm90dG9tTGVmdCYmdC50b3BSaWdodCYmdC5ib3R0b21SaWdodHx8dC50b3BMZWZ0JiZ0LmJvdHRvbUxlZnQmJnAudG9wUmlnaHQmJnAuYm90dG9tUmlnaHQpJiZmKGIpKX1pZighMCE9PWEuYWEuaFtiXS5hbGxFZGdlc1NlZW4pe2QmJiJvYmplY3QiPT09dHlwZW9mIGR8fChkPWMpO3ZhciBwPWEuYWEuaFtiXS5vdXRlcix0PWEuYWEuaFtiXS5pbm5lcjthLmsuYS5henN4KCJhZENoZWNraW5nU3RhdGUiLGcse29uY2U6ITAsY29uZGl0aW9uOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEudy5iKGIuenIpPT09Y319KX19O2EuYWEuZz1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiBiJiZiIGluIGEuYWEuaD9hLmFhLmhbYl0uYWxsRWRnZXNTZWVuOiExfTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hLm1heENvbnRpbnVvdXNseUluVmlld1RpbWUsZT1iLmdldCgiY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUiKTtlPmQmJihhLm1heENvbnRpbnVvdXNseUluVmlld1RpbWU9ZSxhLmNoZWNrTWlsZXN0b25lUmVhY2hlZCgpKTtjfHxiLnNldCgiY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUiLDApfX1mdW5jdGlvbiBkKCl7cmV0dXJuITF9ZnVuY3Rpb24gZihjKXt2YXIgZD1jLmZpeGVkSW5WaWV3VGltZVJlcXVpcmVtZW50O3RoaXMucGVyY3ZSZXF1aXJlZD1jLnBlcmN2UmVxdWlyZWQ7dGhpcy5zaG91bGRDb25zaWRlckxhcmdlQWRzPWEuYS5kYihjLmxhcmdlQWRTaXplKTt0aGlzLmxhcmdlQWRTaXplPWMubGFyZ2VBZFNpemU7dGhpcy5sYXJnZVBlcmN2UmVxdWlyZWQ9Yy5sYXJnZVBlcmN2UmVxdWlyZWQ7dGhpcy5yZXF1aXJlc1Bhc3N0aHJvdWdoPWMucmVxdWlyZXNQYXNzdGhyb3VnaDt0aGlzLnFzS2V5PWMucXNLZXk7Yy5wZXJjdlJlcXVpcmVkUGFzc3Rocm91Z2gmJih0aGlzLnBlcmN2UmVxdWlyZWRQYXNzdGhyb3VnaD1jLnBlcmN2UmVxdWlyZWRQYXNzdGhyb3VnaCk7dGhpcy5nZXRJblZpZXdUaW1lUmVxdWlyZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGR9fWZ1bmN0aW9uIGsoYyxkKXtyZXR1cm4gYS5hLmwoKT9kPT09YS5hYS5kLm4/YS5hYS5kLm4uYjphLmFhLmUubS5iOmQ9PT1hLmFhLmQubj9hLmFhLmQubi5hOmEuYWEuZS5tLmF9ZnVuY3Rpb24gdChkLGYsaCl7dGhpcy5sYWJlbD1oO3RoaXMuY29uZmlnPWY7dGhpcy5ncm91cG1NaWxlc3RvbmVSZWFjaGVkPSExO3RoaXMubWF4Q29udGludW91c2x5SW5WaWV3VGltZT0wO3RoaXMuYWQ9ZDt0aGlzLmZ1bGxWaWV3RXZlbnRQaXhlbEZpcmVkPSExO3ZhciBrPXRoaXM7aD1hLmF2LmQoZCxhLmFhLnUsImdyb3VwbV9jb3VudGVyXyIrZC55Zyt3LnJhbmRvbSgpKTt2YXIgbD1jKGssaCk7aWYoZj09PWEuYWEuZS5tLmF8fGY9PT1hLmFhLmUubS5iKWY9YS5rLmEuYXpzeCgiZnVsbE90c1JlYWNoZWQiLGZ1bmN0aW9uKCl7ay5ncm91cG1NaWxlc3RvbmVSZWFjaGVkPSEwO2subWlsZXN0b25lRmFpbHNhZmVUcmlnZ2VyZWQ9ITB9LHtvbmNlOiEwLGNvbmRpdGlvbjpmdW5jdGlvbihjLGUpe3ZhciBmPWEudy5iKGQuenIpO3JldHVybiBjLnpyPT09ZC56ciYmZT09PWZ9fSksZ1tkLnpyXT1mO3RoaXMuY2hlY2tNaWxlc3RvbmVSZWFjaGVkPWZ1bmN0aW9uKCl7dmFyIGM7Yz1rLm1heENvbnRpbnVvdXNseUluVmlld1RpbWU7dmFyIGQ7aWYoITA9PT1rLmdyb3VwbU1pbGVzdG9uZVJlYWNoZWQpcmV0dXJuITA7ZD1rLmNvbmZpZy5nZXRJblZpZXdUaW1lUmVxdWlyZW1lbnQoKTtjPWsuY29uZmlnLnJlcXVpcmVzUGFzc3Rocm91Z2goay5hZCk/YS5hYS5nKGsuYWQuenIpJiZjPj1kOmM+PWQ7ay5ncm91cG1NaWxlc3RvbmVSZWFjaGVkPWM7IWsuZnVsbFZpZXdFdmVudFBpeGVsRmlyZWQmJmMmJihrLmZ1bGxWaWV3RXZlbnRQaXhlbEZpcmVkPSEwLGsuYWQuZmlyZUZ1bGxWaWV3RXZlbnQ9ITApO3JldHVybiBrLmdyb3VwbU1pbGVzdG9uZVJlYWNoZWR9O2guc2V0KCJjdXJyZW50Q29udGludW91c2x5SW5WaWV3VGltZSIsMCx7dXNlRGVsdGFDb21wZW5zYXRpb246ITAsc2hvdWxkSW5jcmVtZW50Rm46ZnVuY3Rpb24oYyxkKXt2YXIgZSxmO2U9ZC5nZXRMYXN0SW52aWV3UGVyY2VudCgpO3ZhciBoPWsuY29uZmlnLnBlcmN2UmVxdWlyZWQsZz1rLmNvbmZpZy5sYXJnZVBlcmN2UmVxdWlyZWQ7Zj1hLmEuY3MoYyk7ZT1rLmNvbmZpZy5yZXF1aXJlc1Bhc3N0aHJvdWdoKGsuYWQpP2U+PWsuY29uZmlnLnBlcmN2UmVxdWlyZWRQYXNzdGhyb3VnaDooZj1rLmNvbmZpZy5zaG91bGRDb25zaWRlckxhcmdlQWRzJiZmPj1rLmNvbmZpZy5sYXJnZUFkU2l6ZSk/ZT49ZzplPj1oO3JldHVybiBlfSxwb3N0SW5jcmVtZW50YXRpb25GbjpsfSl9YS5hYS51PXt9O2EuYWEuZD17fTthLmFhLmQuYj0uOTg7YS5hYS5kLmM9MjM3NjUwO2EuYWEuZC5kPS41O2EuYWEuZC5lPWEuYWEuZC5iO2EuYWEuZC5mPTFlMzthLmFhLmQuZz1hLmFhLmQuZjthLmFhLmQuaD0uOTg7YS5hYS5kLmk9Mjk0ZTM7YS5hYS5kLmo9Ljg7YS5hYS5kLms9MTVlMzthLmFhLmQubD0iaW0iO2EuYWEuZC5tPSJoaiI7YS5hYS5kLm49e307YS5hYS5kLm4uYT17fTthLmFhLmQubi5iPXt9O3ZhciBxPXtwZXJjdlJlcXVpcmVkOmEuYWEuZC5iLGxhcmdlQWRTaXplOmEuYWEuZC5jLGxhcmdlUGVyY3ZSZXF1aXJlZDphLmFhLmQuZCxyZXF1aXJlc1Bhc3N0aHJvdWdoOmQsZml4ZWRJblZpZXdUaW1lUmVxdWlyZW1lbnQ6YS5hYS5kLmYsdmlld1RpbWVDYXA6ITEscXNLZXk6YS5hYS5kLmx9O2EuYWEuZC5uLmE9bmV3IGYocSk7YS5hYS5kLm4uYj1hLmFhLmQubi5hO2EuYWEuZT17fTthLmFhLmUuYj0uOTg7YS5hYS5lLmM9MjM3NjUwO2EuYWEuZS5kPS41O2EuYWEuZS5lPS45ODthLmFhLmUuZj0xZS00O2EuYWEuZS5nPTFlMzthLmFhLmUuaD0xZTM7YS5hYS5lLmk9Ljk4O2EuYWEuZS5qPTI5NGUzO2EuYWEuZS5rPS44O2EuYWEuZS5sPTE1ZTM7YS5hYS5lLm09e307YS5hYS5lLm0uYT17fTthLmFhLmUubS5iPXt9O2EuYWEuZS5uPSJpbiI7YS5hYS5lLm89ImhqIjtxPXtwZXJjdlJlcXVpcmVkOmEuYWEuZS5iLGxhcmdlQWRTaXplOmEuYWEuZS5jLGxhcmdlUGVyY3ZSZXF1aXJlZDphLmFhLmUuZCxyZXF1aXJlc1Bhc3N0aHJvdWdoOmQsZml4ZWRJblZpZXdUaW1lUmVxdWlyZW1lbnQ6YS5hYS5lLmcsdmlld1RpbWVDYXA6ITEscXNLZXk6YS5hYS5lLm59O2EuYWEuZS5tLmE9bmV3IGYocSk7cT17cGVyY3ZSZXF1aXJlZDphLmFhLmUuZSxwZXJjdlJlcXVpcmVkUGFzc3Rocm91Z2g6YS5hYS5lLmYsbGFyZ2VBZFNpemU6ITEsbGFyZ2VQZXJjdlJlcXVpcmVkOiExLHJlcXVpcmVzUGFzc3Rocm91Z2g6ZnVuY3Rpb24oYyl7dmFyIGQ7ZD1hLmMucihhLmMuZSk7dmFyIGU9Yy5jdXJyZW50V2lkdGh8fDAsZj1jLmN1cnJlbnRIZWlnaHR8fDA7YS5jLmRjPyhjPWEuYy53LGQ9YS5jLngpOihjPWQud2lkdGh8fDAsZD1kLmhlaWdodHx8MCk7cmV0dXJuIGMmJmQ/Zj5kfHxlPmM6ITF9LGZpeGVkSW5WaWV3VGltZVJlcXVpcmVtZW50OmEuYWEuZS5oLHZpZXdUaW1lQ2FwOiExLHFzS2V5OmEuYWEuZS5ufTthLmFhLmUubS5iPW5ldyBmKHEpO2EuYWEuZC5hPWZ1bmN0aW9uKGMpe3ZhciBkPWsoYyxhLmFhLmQubik7aWYoITEhPT1kKXJldHVybiBhLmFhLnMoYy56ciksYy5ncm91cG1WMj1jLmdyb3VwbVYyfHxuZXcgdChjLGQsIkdyb3VwTSBWMiIpLGMuZ3JvdXBtVjJ9O2EuYWEuZS5hPWZ1bmN0aW9uKGMpe3ZhciBkPWsoYyxhLmFhLmUubSk7aWYoITEhPT1kKXJldHVybiBhLmFhLnMoYy56ciksYy5ncm91cG1WMz1jLmdyb3VwbVYzfHxuZXcgdChjLGQsIkdyb3VwTSBWMyIpLGMuZ3JvdXBtVjN9O2EuYWEuYz1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9QlthXTtpZigib2JqZWN0IiE9PXR5cGVvZiBjKXJldHVybiBiO2lmKCJvYmplY3QiPT09dHlwZW9mIGMuZ3JvdXBtVjIpe3ZhciBkPWMuZ3JvdXBtVjIuY29uZmlnLnFzS2V5O2JbZF09Yy5ncm91cG1WMi5jaGVja01pbGVzdG9uZVJlYWNoZWQoKT8xOjB9Im9iamVjdCI9PT10eXBlb2YgYy5ncm91cG1WMyYmKGQ9Yy5ncm91cG1WMy5jb25maWcucXNLZXksYltkXT1jLmdyb3VwbVYzLmNoZWNrTWlsZXN0b25lUmVhY2hlZCgpPzE6MCk7cmV0dXJuIGJ9fSkoYSk7YS5rLmEuYXpzeCgiYWRLaWxsZWQiLGZ1bmN0aW9uKGIpe2lmKGImJiFiLmVwJiYoZy5oYXNPd25Qcm9wZXJ0eShiLnpyKSYmYS5rLmEuc3hheigiZnVsbE90c1JlYWNoZWQiLHtpZDpnW2IuenJdfSksYS5hYSYmYS5hYS51JiYib2JqZWN0Ij09PXR5cGVvZiBhLmFhLnUpKWZvcih2YXIgYyBpbiBhLmFhLnUpYS5hYS51Lmhhc093blByb3BlcnR5KGMpJiYtMTxhLmEuaW5kZXhPZihjLCJncm91cG1fY291bnRlcl8iK2IueWcpJiZkZWxldGUgYS5hYS51W2NdfSl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhjLGIpe3JldHVybiBmdW5jdGlvbihiLGQpe3ZhciBmLGc9e2xhcmdlOmMuY29uZmlnLkxBUkdFX1NJWkVfUkVRLG5vcm1hbDpjLmNvbmZpZy5OT1JNQUxfU0laRV9SRVF9LGs9ZC5nZXRMYXN0SW52aWV3UGVyY2VudCgpO2Y9KGY9YS5hLmNzKGIpPj1jLmNvbmZpZy5MQVJHRV9BRF9USFJFU0hPTEQpJiZrPj1nLmxhcmdlfHwhZiYmaz49Zy5ub3JtYWw7cmV0dXJuIGMuZnVsbHlWaXNPbkxhc3RDaGVjaz1mfX1mdW5jdGlvbiBkKGMsYil7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBmPWMubWF4Q29udGludW91c2x5SW5WaWV3VGltZSxnPWIuZ2V0KCJjdXJyZW50Q29udGludW91c2x5SW5WaWV3VGltZSIpO2c+ZiYmKGMubWF4Q29udGludW91c2x5SW5WaWV3VGltZT1nLGY9Zz49Yy5jb25maWcuVElNRV9USFJFU0hPTEQsYS5jLmR0KGMuYWQsITApJiYhYy5mdWxsVmlld0V2ZW50UGl4ZWxGaXJlZCYmZiYmKGMuZnVsbFZpZXdFdmVudFBpeGVsRmlyZWQ9ITAsYi5zZXQoImN1cnJlbnRDb250aW51b3VzbHlJblZpZXdUaW1lIiwwLHt9KSxjLmFkLmZpcmVGdWxsVmlld0V2ZW50PSEwKSk7ZHx8Yi5zZXQoImN1cnJlbnRDb250aW51b3VzbHlJblZpZXdUaW1lIiwwKX19ZnVuY3Rpb24gZihjLGIpe3RoaXMuYWQ9Yzt0aGlzLmxhYmVsPWI7dGhpcy5jb3VudGVycz17fTt0aGlzLmNvbmZpZz1nLmNvbmZpZzt0aGlzLmZ1bGxWaWV3RXZlbnRQaXhlbEZpcmVkPSExO3RoaXMubWF4Q29udGludW91c2x5SW5WaWV3VGltZT0wO3RoaXMuZnVsbHlWaXNPbkxhc3RDaGVjaz0hMTt2YXIgZT1hLmF2LmQodGhpcy5hZCx0aGlzLmNvdW50ZXJzLCJwdWJsaWNpc19jb3VudGVyXyIrYy55Zyt3LnJhbmRvbSgpKSxmPWsodGhpcyxlKSxsPWQodGhpcyxlKTtlLnNldCgiY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUiLDAse2lnbm9yZU9taWRDaGVjazohMCx1c2VEZWx0YUNvbXBlbnNhdGlvbjohMCxzaG91bGRJbmNyZW1lbnRGbjpmLHBvc3RJbmNyZW1lbnRhdGlvbkZuOmx9KX1hLmFlPXt9O3ZhciBnPXt2MTp7fSxjb25maWc6e319O2cudjEuZGlzcGxheT17fTtnLnYxLmRpc3BsYXkuTEFSR0VfQURfVEhSRVNIT0xEPTIzNzY1MDtnLnYxLmRpc3BsYXkuTk9STUFMX1NJWkVfUkVRPS45ODtnLnYxLmRpc3BsYXkuTEFSR0VfU0laRV9SRVE9LjM7Zy52MS5kaXNwbGF5LlRJTUVfVEhSRVNIT0xEPTFlMztnLnYxLnZpZGVvPXt9O2cudjEudmlkZW8uTEFSR0VfQURfVEhSRVNIT0xEPTIzNzY1MDtnLnYxLnZpZGVvLk5PUk1BTF9TSVpFX1JFUT0uOTg7Zy52MS52aWRlby5MQVJHRV9TSVpFX1JFUT0uNTtnLnYxLnZpZGVvLlRJTUVfVEhSRVNIT0xEPTJlMztnLnYxLmRpc3BsYXkuVklFV0FCTEVfS0VZPSJwZCI7Zy52MS52aWRlby5WSUVXQUJMRV9LRVk9InB2IjtnLmNvbmZpZz1nLnYxLmRpc3BsYXk7YS5hZS5iPWZ1bmN0aW9uKGEpe2EucHVibGljaXM9YS5wdWJsaWNpc3x8bmV3IGYoYSwiUHVibGljaXMgVjEiKTtyZXR1cm4gYS5wdWJsaWNpc307YS5hZS5hPWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgZD1CW2FdO2lmKCJvYmplY3QiIT09dHlwZW9mIGQpcmV0dXJuIGI7ZD1kLnB1YmxpY2lzOyJvYmplY3QiPT09dHlwZW9mIGQmJihiW2QuY29uZmlnLlZJRVdBQkxFX0tFWV09ZC5mdWxsVmlld0V2ZW50UGl4ZWxGaXJlZD8xOjApO3JldHVybiBifTthLmsuYS5henN4KCJhZEtpbGxlZCIsZnVuY3Rpb24oYyl7aWYoYyYmIWMuZXAmJmMucHVibGljaXMmJmMucHVibGljaXMuY291bnRlcnMmJiJvYmplY3QiPT09dHlwZW9mIGMucHVibGljaXMuY291bnRlcnMpZm9yKHZhciBiIGluIGMucHVibGljaXMuY291bnRlcnMpYy5wdWJsaWNpcy5jb3VudGVycy5oYXNPd25Qcm9wZXJ0eShiKSYmLTE8YS5hLmluZGV4T2YoYiwicHVibGljaXNfY291bnRlcl8iK2MueWcpJiZkZWxldGUgYy5wdWJsaWNpcy5jb3VudGVyc1tiXX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYyxiKXt2YXIgZD1jLmdldEZvcm1hdCgpLGY7Zj1hLmEuZHgoe2FsbDozMH0sZCk7YS5hLmRiKGYpfHwoYS5hLmRiKDMwKSxmPTMwKTtpZihhLmYuYWooYikpcmV0dXJuIGMucmVmcmVzaERlY2lzaW9uPTEsITE7Yy5hdXRvPXt9O3ZhciBrPWMuYW87Zyhbe3JhdGU6M2U0LG1heDoyNSx3aGl0ZWxpc3Q6W3tsb29rdXA6InR5cGUiLHZhbHVlczoibGVhZGVyYm9hcmQgbGVhZGVyYm9hcmRjZW50ZXIgbGVhZGVyYm9hcmRsb3cgbXB1IG1wdWxvdyBmbGV4IG1wdTIgbXB1MyBtcHU0IE1QVVBsdXMgbW9iaWxlX2hwX21wdSBiaV9jb250ZW50Ii5zcGxpdCgiICIpfSx7bG9va3VwOiJ6TW9hdEFkVW5pdDEiLHZhbHVlczpbImpwLnJldXRlcnMiLCJjbi5yZXV0ZXJzIl19XX1dLGspO2EuYS5keihrKTtrPWEuYW8uZDthLmFvLmkmJihrPWEuYW8uaSk7dmFyIHA7YS5hLmRiKGspJiYwPGs/cD0hMDooYS5hbyYmYS5hby5jJiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coIk1vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZToiLCJDdXN0b20gbWF4IHJlZnJlc2gga2V5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBvciBOYU47IG5vdCBlbmFibGluZyByZWZyZXNoIiksYyYmKGMucmVmcmVzaERlY2lzaW9uPTYpLHA9ITEpO2lmKCFwKXJldHVybiExO2MmJmMuRGZwU2xvdD9wPSEwOihjJiYoYy5yZWZyZXNoRGVjaXNpb249NykscD0hMSk7aWYoIXApcmV0dXJuITE7cD1hLmFuLmYoYy5EZnBTbG90KTt2YXIgdDtwJiYib2JqZWN0Ij09PXR5cGVvZiBwP3Q9ITA6KGMmJihjLnJlZnJlc2hEZWNpc2lvbj04KSx0PSExKTtpZighdClyZXR1cm4hMTt0PXAuaWQ7cC5nZXRBdHRyaWJ1dGUoIndpZHRoIik7cC5nZXRBdHRyaWJ1dGUoImhlaWdodCIpO2EuYW4uZChjLkRmcFNsb3QpO2EuYW4uaChjLkRmcFNsb3QpO3IuYXV0b19yZWZyZXNoPXIuYXV0b19yZWZyZXNofHx7fTtyLmF1dG9fcmVmcmVzaFt0XT1yLmF1dG9fcmVmcmVzaFt0XXx8e2lzQmxhY2tsaXN0ZWQ6ITEsbGFzdFJlZnJlc2hlZEJ5TW9hdDohMSxyZWZyZXNoQ291bnQ6MH07ITA9PT1yLmF1dG9fcmVmcmVzaFt0XS5sYXN0UmVmcmVzaGVkQnlNb2F0JiYoYy5tb2F0QXV0b1JlZnJlc2hlZD0xLHIuYXV0b19yZWZyZXNoW3RdLmxhc3RSZWZyZXNoZWRCeU1vYXQ9ITEpO3QmJnIuYXV0b19yZWZyZXNoW3RdLnJlZnJlc2hDb3VudDxrP2s9ITA6KGEuYW8mJmEuYW8uYyYmd2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyYmd2luZG93LmNvbnNvbGUubG9nKCJNb2F0IEludmVudG9yeSBJbnRlbGxpZ2VuY2U6IiwiUmVhY2hlZCBtYXggcmVmcmVzaCBsaW1pdCBmb3IgIit0KyIsIGRpc2FibGluZyByZWZyZXNoIiksYyYmKGMucmVmcmVzaERlY2lzaW9uPTkpLGs9ITEpO2lmKCFrKXJldHVybiExO2lmKCFhLmFvLmooYykpcmV0dXJuIHIuYXV0b19yZWZyZXNoW3RdLmlzQmxhY2tsaXN0ZWQ9ITAsITE7az0iTW9hdCBJbnZlbnRvcnkgSW50ZWxsaWdlbmNlOiI7YS5hbyYmYS5hby5jJiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coaywiQWRkaW5nIGxpc3RlbmVyIHRvIGFkIHNsb3QgIit0KTtrPSJNb2F0IEludmVudG9yeSBJbnRlbGxpZ2VuY2U6IjthLmFvJiZhLmFvLmMmJndpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2cmJndpbmRvdy5jb25zb2xlLmxvZyhrLHApO2Y9YS5hby5oP2EuYW8uaDoxZTMqZjt0cnl7YS5hby5rKGMuenIsImludmlldyIsZiksYS5hLmR1KHt9LGQpfHwoYy5hdXRvLm1vdXNlRXZ0SWQ9YS5rLmEuYXpzeCgibW91c2VFdmVudE9uQWQiLGEuYS5kZihbY10sYS5hby5sKSkpLGMucmVmcmVzaERlY2lzaW9uPTB9Y2F0Y2gocSl7YyYmKGMucmVmcmVzaERlY2lzaW9uPTIwKX19YS5hbz17fTthLmFvLmM9ITE7YS5hby5jPSIxIj09PWEuYS5hcShhLmMuYmEsIm1vYXRfbG9nIik7YS5hby5kPTU7YS5hby5lPTVlMzt2YXIgZD17fSxmPXtpbnZpZXc6ZnVuY3Rpb24oYyxiKXtyZXR1cm4gYS53LmkoYyxiLCEwKX0sZnVsbEludmlldzpmdW5jdGlvbihjLGIpe3JldHVybiBhLncucyhjLGIsITApfSxhY3RpdmVJbnZpZXc6ZnVuY3Rpb24oYyxiKXtpZighYS5jLmN8fCFjLmFjdGl2ZXRpbWUpcmV0dXJuITE7dmFyIGQ9YS53LmIoYy56cik7cmV0dXJuKGQ9YS5hdi5jKGMuYWN0aXZldGltZS5jb3VudGVycyxkKSkmJmQuZ2V0KCJhY3RpdmVJbnZpZXdUaW1lIik+PWJ9fSxnPWZ1bmN0aW9uKGMsYil7YS5hby5mPSExO2EuYW8uZz0hMTtjJiZhLmEuZihjKSYmYS5hLmZvckVhY2goYyxmdW5jdGlvbihjKXtpZihjLmhhc093blByb3BlcnR5KCJibGFja2xpc3QiKSl7aWYoYz1jLmJsYWNrbGlzdCxhLmEuY2koYyl8fGEuYS5kdChjLGIpKWEuYW8uZz0hMH1lbHNlIGlmKGMuaGFzT3duUHJvcGVydHkoIndoaXRlbGlzdCIpKXt2YXIgZD1jLndoaXRlbGlzdDtpZihhLmEuY2koZCl8fGEuYS5kdChkLGIpKWEuYW8uZj0hMCxhLmFvLmg9Yy5yYXRlLGEuYW8uaT1jLm1heH19KX07YS5hby5qPWZ1bmN0aW9uKGMpe3ZhciBiPWMuYW87YS5hbi5jKGMuRGZwU2xvdCk7YS5hbi5lKGMuRGZwU2xvdCk7YS5hbi5kKGMuRGZwU2xvdCk7dmFyIGQ9YS5hbi5mKGMuRGZwU2xvdCkuaWQ7Yy5nZXRGb3JtYXQoKTtpZigxPT09Yi5za2luKXJldHVybiBjLnJlZnJlc2hEZWNpc2lvbj0xMCwhMTt2YXIgZj1yJiZyLmF1dG9fcmVmcmVzaCYmci5hdXRvX3JlZnJlc2hbZF0mJnIuYXV0b19yZWZyZXNoW2RdLmNyZWF0aXZlSWQ7aWYoZiYmYi5tb2F0Q2xpZW50TGV2ZWw0JiZmPT09Yi5tb2F0Q2xpZW50TGV2ZWw0KXJldHVybiBhLmFvJiZhLmFvLmMmJndpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2cmJndpbmRvdy5jb25zb2xlLmxvZygiTW9hdCBJbnZlbnRvcnkgSW50ZWxsaWdlbmNlOiIsIlNlcnZlZCBzYW1lIGNyZWF0aXZlIGFzIGxhc3QgaW1wcmVzc2lvbiwgZGlzYWJsaW5nIGZ1cnRoZXIgcmVmcmVzaGluZyBmb3IgIitkKSxjLndhc0R1cGVBdXRvQ3JlYXRpdmU9ITAsYy5yZWZyZXNoRGVjaXNpb249MTMsITE7aWYoYS5hby5nKXJldHVybiBjLnJlZnJlc2hEZWNpc2lvbj0xNCwhMTtpZighYS5hby5mKXJldHVybiBjLnJlZnJlc2hEZWNpc2lvbj0xNSwhMTtiPXt9O2Euay5hLnpheHMoImFkU2hvdWxkUmVmcmVzaCIsYixjLGQpO2lmKCExPT09Yi5jYW5SZWZyZXNoKXJldHVybiExO2MucmVmcmVzaERlY2lzaW9uPTA7cmV0dXJuITB9O2EuYW8uYT1mdW5jdGlvbihjKXthLmFrLmMoImRhdGEiLGZ1bmN0aW9uKGIpe2I9YS5hLmRmKFtjLGJdLGspO2EuYW4uZyhiKX0pfTthLmFvLms9ZnVuY3Rpb24oYSxiLGUpe2QuaGFzT3duUHJvcGVydHkoYSl8fChkW2FdPXt9KTtkW2FdW2JdPWV9O2EuYW8ubD1mdW5jdGlvbihjKXt2YXIgYj0obmV3IEEpLmdldFRpbWUoKTtyZXR1cm4gMWUzPD0oYy5hdXRvLmxhc3RNb3VzZVRpbWVzdGFtcCYmYi1jLmF1dG8ubGFzdE1vdXNlVGltZXN0YW1wfHwwKXx8IWMuYXV0by5oYWRSZWNlbnRNb3VzZUV2ZW50PyhjLmF1dG8ubW91c2VDaGVja0lkJiZhLmEuYShjLmF1dG8ubW91c2VDaGVja0lkKSxjLmF1dG8uaGFkUmVjZW50TW91c2VFdmVudD0hMCxjLmF1dG8ubGFzdE1vdXNlVGltZXN0YW1wPWIsYj1hLmFvLmUsYS5hbyYmYS5hby5jJiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coIk1vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZToiLCJNb3VzZSBldmVudCEgRGlzYWJsaW5nIHJlZnJlc2ggZm9yICIrYisiIG1pbGxpc2Vjb25kcyIpLGMuYXV0by5tb3VzZUNoZWNrSWQ9YS5sLmYoYS5hLmRmKFtjXSxhLmFvLm0pLGIpLGMuYXV0by5tb3VzZUNoZWNrSWQpOiExfTthLmFvLm09ZnVuY3Rpb24oYyl7Yy5hdXRvLmhhZFJlY2VudE1vdXNlRXZlbnQ9ITE7YS5hbyYmYS5hby5jJiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coIk1vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZToiLCJNb3VzZSBzbGVlcCB0aW1lIG92ZXIsIHJlLWVuYWJsaW5nIHJlZnJlc2giKX07YS5hby5uPWZ1bmN0aW9uKGMpe2lmKGMpe3ZhciBiPWMuYW87Yy5nZXRGb3JtYXQoKTt2YXIgZD1hLmFuLmYoYy5EZnBTbG90KTtpZihkKWlmKGQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxkPWQuaWQsYS5hbi5kKGMuRGZwU2xvdCksYS5hbi5oKGMuRGZwU2xvdCksYS5hbi5pKCksZCYmYy5EZnBTbG90KXtpZighMD09PXIuYXV0b19yZWZyZXNoW2RdLmlzQmxhY2tsaXN0ZWQpcmV0dXJuIGMucmVmcmVzaERlY2lzaW9uPXIuYXV0b19yZWZyZXNoW2RdLnJlZnJlc2hEZWNpc2lvbnx8MTQsITE7ci5hdXRvX3JlZnJlc2hbZF0ucmVmcmVzaENvdW50PTErci5hdXRvX3JlZnJlc2hbZF0ucmVmcmVzaENvdW50O3IuYXV0b19yZWZyZXNoW2RdLmxhc3RSZWZyZXNoZWRCeU1vYXQ9ITA7ci5hdXRvX3JlZnJlc2hbZF0uY3JlYXRpdmVJZD1iLm1vYXRDbGllbnRMZXZlbDQ7ci5hdXRvX3JlZnJlc2hbZF0ucmVmcmVzaERlY2lzaW9uPWMucmVmcmVzaERlY2lzaW9uO2EuYW4uaihjLkRmcFNsb3QsIm1pdnIiLHIuYXV0b19yZWZyZXNoW2RdLnJlZnJlc2hDb3VudCk7Yj1jLkRmcFNsb3Q7YS5hbyYmYS5hby5jJiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coIk1vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZToiLCJSZWZyZXNoaW5nIHNsb3QgZm9yICIrYik7YS5hbi5rKFtiXSk7YS5hYy5nKGMpfWVsc2UgYy5yZWZyZXNoRGVjaXNpb249NztlbHNlIGMucmVmcmVzaERlY2lzaW9uPTh9fTthLmFvLmI9ZnVuY3Rpb24oKXtmb3IodmFyIGMgaW4gQilpZihCLmhhc093blByb3BlcnR5KGMpKXt2YXIgYj1CW2NdO2lmKCFiLmF1dG98fCFiLmF1dG8uaGFkUmVjZW50TW91c2VFdmVudCl7dmFyIGU9ZFtjXSxoO2ZvcihoIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShoKSYmZltoXShiLGVbaF0pKXt0cnl7YS5hby5uKGIpfWNhdGNoKGcpe31kZWxldGUgZVtoXTthLmsuYS5zeGF6KCJtb3VzZUV2ZW50T25BZCIse2lkOmIuYXV0by5tb3VzZUV2dElkfSl9fX19O2EuYW8ubz1mdW5jdGlvbigpe3ZhciBjPXt9LGI9YS5hbi5hKCk7aWYoIWIpcmV0dXJuITE7YS5hLmZvckVhY2goYixmdW5jdGlvbihhKXsoYT0oYT1hLmdldFJlc3BvbnNlSW5mb3JtYXRpb24oKSkmJmEubGluZUl0ZW1JZCkmJihjW2FdPTErKGNbYV18fDApKX0pO3JldHVybiBjfTthLmsuYS5henN4KCJhZEtpbGxlZCIsZnVuY3Rpb24oYyl7YyYmIWMuZXAmJmMuYXV0byYmYy5hdXRvLm1vdXNlRXZ0SWQmJmEuay5hLnN4YXooIm1vdXNlRXZlbnRPbkFkIix7aWQ6Yy5hdXRvLm1vdXNlRXZ0SWR9KX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoZCl7aWYoZC52ZXJzaW9uPT1hLmF3LmEpcmV0dXJuITA7dmFyIGM9YS5hdy5hKyItYmV0YSI9PT1kLnZlcnNpb24sYj1hLmF3LmE9PT1kLnZlcnNpb24rIi1iZXRhIjtpZigoIm1vYXRmcmFtZSI9PT1kLnR5cGV8fCJhZGRUaGlzIj09PWQudHlwZSkmJihjfHxiKSlyZXR1cm4hMH1hLmF3PXt9O2EuYXcuYT0iMS4yIjthLmF3LnByZWZpeD0iTVNGQVBJIjthLmF3LmI9e307YS5hdy5jPXt9O3ZhciBkPWEuYy5heC5hLGY9YS5jLmF6O2EuYXcuZD0vKFthLXpdKykjKFthLXowLTkuLV0rKSMoWzAtOV0rKSMoW2EtejAtOV0rKSMoWzAtOV0rKSMoLispL2k7YS5hdy5lPS9AKFthLXowLTldKylAQCguKikvaTthLmF3LmY9ZnVuY3Rpb24oZil7aWYoZil7dmFyIGM9YS5hdy5nKGYpO2MubGlzdGVuaW5nfHwoci5kY3N4JiZyLmRjc3gueW5kcyhmLCJtZXNzYWdlIiwibWVzc2FnZS0iK2QsIk1FLSIrZCksYy5saXN0ZW5pbmc9ITAsci5zd2RlLmF6c3goImFsbEFkc0tpbGxlZCIsZnVuY3Rpb24oKXthLmF3LmgoZil9LHtvbmNlOiEwfSkpO3Iuc3dkZS5henN4KCJtZXNzYWdlLSIrZCxhLmF3LmkpO2Euay5hLmF6c3goInZpZXc6dGljayIsZnVuY3Rpb24oKXtyLmRjc3gmJiFjLmxpc3RlbmluZyYmKHIuZGNzeC55bmRzKGYsIm1lc3NhZ2UiLCJtZXNzYWdlLSIrZCwiTUUtIitkKSxjLmxpc3RlbmluZz0hMCl9KX19O2EuYXcuZz1mdW5jdGlvbihmKXt2YXIgYz0iTW9hdCNQTUwjIithLmMuYXMrIiMiK2EuYXcuYTtmW2NdfHwoZltjXT17aWQ6ZCxsaXN0ZW5pbmc6ITF9KTtyZXR1cm4gZltjXX07YS5hdy5oPWZ1bmN0aW9uKGYpe3ZhciBjPWYmJmEuYXcuZyhmKTthLmwuZChmLCJtZXNzYWdlIixhLmF3LmkpO3IuZGNzeCYmci5kY3N4LmVuZ24oe2xpc3RlbmVyTmFtZToiTUUtIitkfSk7ci5zd2RlLnN4YXooIm1lc3NhZ2UtIitkLHtjYWxsYmFjazphLmF3Lml9KTtjJiYoYy5saXN0ZW5pbmc9ITEpfTthLmF3Lmo9ZnVuY3Rpb24oZCl7cmV0dXJuIGEuYXcucHJlZml4KyIjIitkKyIjIn07YS5hdy5rPWZ1bmN0aW9uKGQpe3ZhciBjPWQubWF0Y2goYS5hdy5kKTtkPSExO2MmJjc9PWMubGVuZ3RoJiYoZD17cHJlZml4OmNbMV0sdmVyc2lvbjpjWzJdLHVpZDpjWzNdLHR5cGU6Y1s0XSxyZXF1ZXN0OmNbNV0sZGF0YTpjWzZdfSwoYz1kLmRhdGEubWF0Y2goYS5hdy5lKSkmJjM9PWMubGVuZ3RoJiYoZC5jbWQ9Y1sxXSxkLmFyZz1jWzJdKSxkLnZlcnNpb24mJi0xIT09YS5hLmluZGV4T2YoZC52ZXJzaW9uLCItYmV0YSIpJiYoZC5pc0JldGE9ITApKTtyZXR1cm4gZH07YS5hdy5pPWZ1bmN0aW9uKGQpe2lmKCEoZCYmZC5vcmlnaW4mJmQuZGF0YSYmInN0cmluZyI9PT10eXBlb2YgZC5kYXRhKSlyZXR1cm4hMTt2YXIgYz1hLmF3LmsoZC5kYXRhKSxiPWMmJmMudWlkPT1mLnRvU3RyaW5nKCk7aWYoYyYmIWImJmsoYykmJihkLm1zZ0RhdGE9YyxjLnJlcXVlc3QgaW4gYS5hdy5jJiYoZC50cmlnZ2VyQ2FsbGJhY2s9ZnVuY3Rpb24oKXthLmF3LmNbYy5yZXF1ZXN0XSYmKGEuYXcuY1tjLnJlcXVlc3RdKGQpLCJhZGRUaGlzIiE9PWMudHlwZSYmKGEuYXcuY1tjLnJlcXVlc3RdPW51bGwsZGVsZXRlIGEuYXcuY1tjLnJlcXVlc3RdKSl9KSxhLmF3LmJbYy50eXBlXSkpZm9yKHZhciBiPTAsZT1hLmF3LmJbYy50eXBlXS5sZW5ndGg7YjxlO2IrKylhLmF3LmJbYy50eXBlXVtiXShkKX07YS5hdy5sPWZ1bmN0aW9uKGQsYyl7YS5hdy5iW2RdPVtjXX07YS5hdy5tPWZ1bmN0aW9uKGQsYyxiLGUpeyJvYmplY3QiPT10eXBlb2YgYyYmKGM9YS5hLmJ5KGMpKTtlPWV8fHcuZmxvb3IoMWUxMCp3LnJhbmRvbSgpKTsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGEuYXcuY1tlXT1iKTtkPWEuYXcuaihhLmF3LmEpK2YrIiMiK2QrIiMiK2UrIiMiK2M7cmV0dXJue3JlcXVlc3Q6ZSxtc2c6ZH19O2EuYXcubj1mdW5jdGlvbihkLGMsYixlLGYpeyJvYmplY3QiPT10eXBlb2YgYiYmKGI9YS5hLmJ5KGIpKTtyZXR1cm4gYS5hdy5tKGQsIkAiK2MrIkBAIitiLGUsZil9O2EuYXcubz1mdW5jdGlvbihkLGMsYil7dHJ5e2lmKCFkfHwhZHx8IWQuc291cmNlKXJldHVybiExO2Quc291cmNlLnBvc3RNZXNzYWdlKGEuYXcubShkLm1zZ0RhdGEudHlwZSxjLGIsZC5tc2dEYXRhLnJlcXVlc3QpLm1zZywiKiIpfWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfTthLmF3LnA9ZnVuY3Rpb24oZCxjLGIpe3RyeXt2YXIgZT1hLmcuaShjfHx3aW5kb3cudG9wKTtpZighZSlyZXR1cm4gYS5sLmYoZnVuY3Rpb24oKXthLmF3LnAoZCxjLGIpfSwyMDApO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKWImJmVbZl09PXdpbmRvd3x8ZVtmXS5wb3N0TWVzc2FnZShkLCIqIil9Y2F0Y2goayl7fX07YS5rLmEuYXpzeCgibW9kdWxlc1JlYWR5IixhLmEuZGYoW3dpbmRvd10sYS5hdy5mKSx7b25jZTohMH0pO2Euay5hLmF6c3goInN0b3BQb3N0TWVzc2FnZUxpc3RlbmVycyIsYS5hLmRmKFt3aW5kb3ddLGEuYXcuaCkse29uY2U6ITB9KX0pKHUpOyhmdW5jdGlvbihhKXthLmFsPXt9O2EuYWwuYj17fTthLmFsLmIuYT0iQ0YiO2EuYWwuYi5iPSJDTkYiO2EuYWwuYi5jPSJDTlMiO2EuYWwuYT17fTthLmFsLmEuYj0hMTthLmFsLmEuYz1bXTthLmFsLmM9e307YS5hbC5kPXt9O3ZhciBrPSExO2EuYWwuYS5hPWZ1bmN0aW9uKCl7dmFyIGQ9YS5hbC5lKCk7YS5hbC5hLmJ8fGEuYy5jfHwoZD1hLmF3Lm4oIm1vYXRmcmFtZSIsImNoZWNrIixkLGZ1bmN0aW9uKGQpe2Q9YS5hLmJ6KGQubXNnRGF0YS5kYXRhKTt2YXIgZz0ic3RyaW5nIj09PXR5cGVvZiBhLmMuZztkJiYic3RyaW5nIj09PXR5cGVvZiBkLmZ1bGxVcmwmJiJudW1iZXIiPT09dHlwZW9mIGQudXJsU3JjJiYhZyYmYS5hLmFrKGQuZnVsbFVybCkmJiFhLmMuYmImJihhLmMuZihkLnVybFNyYyksYS5jLmc9ZC5jbGVhblVybCxhLmMuZXU9ZC5mdWxsVXJsLGEuYy5iYT1kLmZ1bGxVcmwsYS5jLmJiPSEwKTtkJiZkLmF2YWlsYWJsZSYmIWEuYWwuYS5iJiYoYS5jLmNiPSEwLGEuYWwuYS5iPSEwLGQ9Ik1vYXRGcmFtZSNnZW9tIyIrKG5ldyBBKS5nZXRUaW1lKCksYS5sLmcoYS5hbC5hLmQsbnVsbCwyMDAsZCksYS5hbC5hLmMucHVzaChkKSxhLmsuYS56YXhzKCJNb2F0ZnJhbWU6UmVhZHkiLGQpKX0pLGEuYXcucChkLm1zZywhMSwhMCkpfTthLmFsLmY9ZnVuY3Rpb24oKXthLmF3LmwoIm1vYXRmcmFtZSIsYS5hbC5nKTthLmF3LmwoImFkZFRoaXMiLGEuYWwuZyk7YS5hdy5wKGEuYXcubSgibW9hdGZyYW1lIiwicGluZyIpLm1zZywhMSwhMCl9O2EuYWwuaD1mdW5jdGlvbihkKXt2YXIgZj1hLmFsLmEuZTtpZighZilyZXR1cm4hMTt2YXIgZz1hLnouaShkLmFhKSxjPWEuei5uKGcucmVjdCxmLmVsLGYuZXQpLGI9YS56Lm4oZy52aXNpYmxlUmVjdCxmLmVsLGYuZXQpLGI9YS56Lm0oYix7bGVmdDpmLnZsLHJpZ2h0OmYudnIsdG9wOmYudnQsYm90dG9tOmYudmJ9KSxnPShiLnJpZ2h0LWIubGVmdCkqKGIuYm90dG9tLWIudG9wKS9nLmFyZWEsZT0hMTtmJiYibnVtYmVyIj09PXR5cGVvZiBmLnB2JiYhaXNOYU4oZi5wdikmJihhLmEuZHIoZyxmLnB2LC4wMSkmJiJzZnJhbWUiPT09YS53LmIoZC56cikmJihlPSEwKSxnPXcubWluKGcsZi5wdikpO2YubXx8KGU9ITApO2UmJmEuay5hLnpheHMoInJlY3RzQXZhaWxhYmxlIixkLnpyLGMsYik7ZiYmImJvb2xlYW4iPT09dHlwZW9mIGYuaWEmJihhLmMuY2M9Zi5pYSk7ZiYmIm51bWJlciI9PT10eXBlb2YgZi5tJiYhaXNOYU4oZi5tKSYmKGEuYy5jZD1mLm0pO3JldHVybiBnfTthLmFsLmk9ZnVuY3Rpb24oZCl7cmV0dXJuInVuZGVmaW5lZCIhPT10eXBlb2YgZCYmYS5hbC5kJiZhLmFsLmRbZF0/KGEuYWwuZFtkXT1udWxsLCEwKTohMX07YS5hbC5qPWZ1bmN0aW9uKCl7dmFyIGQ9YS5hdy5tKCJtb2F0ZnJhbWUiLCJraWxsIixudWxsKTthLmF3LnAoZC5tc2csITEsITApfTthLmFsLmU9ZnVuY3Rpb24oKXt2YXIgZD1hLmMueSxmPWEuYy56O3JldHVybiBkJiZmP3t3aWR0aDpkLGhlaWdodDpmfTohMX07YS5hbC5rPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYy5jfTthLmFsLmw9ZnVuY3Rpb24oZCl7dmFyIGY9ITE7YS5hLmZvckVhY2goYS5hbC5iLGZ1bmN0aW9uKGEpe2lmKGE9PWQpcmV0dXJuIGY9ITAsITF9KTtyZXR1cm4gZn07YS5hbC5nPWZ1bmN0aW9uKGQpe3ZhciBmPWQubXNnRGF0YS5jbWR8fGQubXNnRGF0YS5kYXRhO2lmKGYpaWYoZC50cmlnZ2VyQ2FsbGJhY2spZC50cmlnZ2VyQ2FsbGJhY2soZCk7ZWxzZSBpZihhLmFsLmNbZl0pYS5hbC5jW2ZdKGQpO2Vsc2UgYS5hbC5sKGYpfHxhLmF3Lm8oZCxhLmFsLmIuYil9O2EuYWwubT1mdW5jdGlvbihkKXt2YXIgZj17fSxnPWQubXNnRGF0YS5hcmcmJmEuYS5ieihkLm1zZ0RhdGEuYXJnKTtpZihhLmFsLm4od2luZG93LGQuc291cmNlLGQubXNnRGF0YS51aWQsZykmJmEuYWwuaygpKXtpZihmLmF2YWlsYWJsZT0hMCxhLmMuYmImJihnPWEuYy5iYSkmJmEuYy5iYiYmYS5hLmFrKGcpKXt2YXIgYz1hLmMuZXR8fGEuYS5hbSgpO2EuYy5ldD1jO2YuY2xlYW5Vcmw9YztmLmZ1bGxVcmw9ZztmLnVybFNyYz0xfX1lbHNlIGYuYXZhaWxhYmxlPSExO2EuYXcubyhkLGYpfTthLmFsLm89ZnVuY3Rpb24oZCxmKXtpZighZHx8IWYpcmV0dXJuITE7Zm9yKHZhciBnPWEuZy5jKHdpbmRvdykucG9wKCksYz1hLmcuayhkLDEwKSxiPSExLGU9ITEsaD1udWxsLGs9bnVsbCxwLHQ9Yy5sZW5ndGgtMTswPD10O3QtLSlpZihjW3RdPT1nJiYoYj0hMCksYiYmIWEuZy5qKGNbdF0pKXtrPWNbdF07YnJlYWt9YiYmayYmKChoPWsmJmsucGFyZW50JiZrLnBhcmVudC5kb2N1bWVudCkmJihwPWEuZy5mKGgsaykpLHAmJihnPXAub2Zmc2V0V2lkdGgsYz1wLm9mZnNldEhlaWdodCxnPT1mLndpZHRoJiZjPT1mLmhlaWdodD9lPSEwOihnKj1jLGM9Zi53aWR0aCpmLmhlaWdodCxlPS45ODw9dy5taW4oZyxjKS93Lm1heChnLGMpKSkpO3JldHVybntpc05lc3RlZDplLGlmcmFtZTpwLGlmcmFtZVBhcmVudERvYzpofX07YS5hbC5wPWZ1bmN0aW9uKGQpe3JldHVybiBkJiZkLnBhcmVudCYmYS5nLmYoZC5wYXJlbnQuZG9jdW1lbnQsZCl9O2EuYWwucT1mdW5jdGlvbihkKXsoZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBkJiZhLmFsLmQmJmEuYWwuZFtkXSkmJiJib29sZWFuIj09dHlwZW9mIGQuaXNXaXRoaW5SZWFjaCYmKGQuaXNOZXN0ZWQmJiFkLmlmcmFtZVBhcmVudERvYyYmKGQuaXNXaXRoaW5SZWFjaD0hMSksZC5pc05lc3RlZHx8ZC53aW4mJiFhLmcuZChkLndpbil8fChkLmlzV2l0aGluUmVhY2g9ITEpKTtyZXR1cm4gZH07YS5hbC5uPWZ1bmN0aW9uKGQsZixnLGMpe3ZhciBiLGUsaD17aXNOZXN0ZWQ6ITEsaWZyYW1lOm51bGwsaWZyYW1lUGFyZW50RG9jOm51bGx9O2lmKChiPWEuYWwucShnKSkmJmIuaXNXaXRoaW5SZWFjaClyZXR1cm4hMDtlPWEuZy5tKGQsZiwhMCk7YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBiLmlzV2l0aGluUmVhY2g/Yi5pc1dpdGhpblJlYWNoPWU6KGU/Zj1hLmFsLnAoZik6KGg9YS5hbC5vKGYsYyksKGY9aC5pZnJhbWUpJiYoZT0hMCkpLGI9e2RpbWVuc2lvbnM6YyxpZnJhbWU6ZixpZnJhbWVQYXJlbnREb2M6aC5pZnJhbWVQYXJlbnREb2MsaXNOZXN0ZWQ6aC5pc05lc3RlZCxpc1dpdGhpblJlYWNoOmUsd2luOmR9LGEuYWwuZFtnXT1iKTtyZXR1cm4gYi5pc1dpdGhpblJlYWNofTthLmFsLnI9ZnVuY3Rpb24oYSxmLGcsYyxiKXtpZighYXx8IWYpcmV0dXJuITE7YT17dzphLndpZHRoLGg6YS5oZWlnaHQsZWw6YS5sZWZ0LGV0OmEudG9wLGVyOmEucmlnaHQsZWI6YS5ib3R0b20sdmw6Zi5sZWZ0LHZ0OmYudG9wLHZyOmYucmlnaHQsdmI6Zi5ib3R0b219OyJib29sZWFuIj09PXR5cGVvZiBjJiYoYS5pYT1jKTsibnVtYmVyIiE9PXR5cGVvZiBnfHxpc05hTihnKXx8KGEubT1nKTsibnVtYmVyIiE9PXR5cGVvZiBifHxpc05hTihiKXx8KGEucHY9MTxiP2IvMTAwOmIpO3JldHVybiBhfTthLmFsLnM9ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/KGQ9YS56LmkoZCkpP2EuYWwucihkLmN1bXVsUmVjdCxkLnZpc2libGVSZWN0LDAsITEpOiExOiExfTthLmFsLmEuZD1mdW5jdGlvbigpe2lmKCFrKXtrPSEwO3ZhciBkPWEuYXcubSgibW9hdGZyYW1lIiwiZ2VvbSIsZnVuY3Rpb24oZCl7az0hMTthLmFsLmwoZC5tc2dEYXRhLmRhdGEpfHwoYS5hbC5hLmU9YS5hLmJ6KGQubXNnRGF0YS5kYXRhKSl9KTthLmF3LnAoZC5tc2csITEsITApfX07YS5hbC5jLnBpbmc9ZnVuY3Rpb24oZCl7ZCYmZC5zb3VyY2U9PT13aW5kb3d8fGEuYS5lZigpJiZkLm1zZ0RhdGEuaXNCZXRhfHwhYS5jLmMmJmEuYy5kaSgpJiZhLmFsLmEuYSgpfTthLmFsLmMuY2hlY2s9ZnVuY3Rpb24oZCl7aWYoIWEuYS5lZSgpfHxkLm1zZ0RhdGEuaXNCZXRhKXt2YXIgZj0hMDthLmMuY2UoKSYmKGY9ITEpO2YmJmEuYWwubShkKX19O2EuYWwuYy5nZW9tPWZ1bmN0aW9uKGQpe2lmKCFhLmEuZWUoKXx8ZC5tc2dEYXRhLmlzQmV0YSlpZihhLmFsLm4od2luZG93LGQuc291cmNlLGQubXNnRGF0YS51aWQpJiZhLmFsLmsoKSl7dmFyIGY9YS5hbC5kJiZhLmFsLmRbZC5tc2dEYXRhLnVpZF0mJmEuYWwuZFtkLm1zZ0RhdGEudWlkXS5pZnJhbWU7aWYoZiYmKGY9YS5hbC5zKGYpKSl7YS5hdy5vKGQsZik7cmV0dXJufWEuYXcubyhkLGEuYWwuYi5hKX1lbHNlIGEuYXcubyhkLGEuYWwuYi5jKX07YS5hbC5jLmtpbGw9ZnVuY3Rpb24oZCl7YS5hbC5pKGQubXNnRGF0YS51aWQpfX0pKHUpOyhmdW5jdGlvbihhKXthLmFzPXt9O2EuYXMuYj01ZTM7YS5hcy5jPWZ1bmN0aW9uKGspe2lmKCFhLmMuYylyZXR1cm4hMTtrLmFjdGl2ZXRpbWU9e307ay5hY3RpdmV0aW1lLmNvdW50ZXJzPXt9O2EuYXMuZChrKTthLmsuYS5henN4KCJhZEtpbGxlZCIsYS5hcy5lLHtjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGsuenI9PWEuenJ9LG9uY2U6ITB9KTthLmFzLmYoayl9O2EuYXMuZj1mdW5jdGlvbihrKXtpZihrLmFjdGl2ZXRpbWUpe3ZhciBkPWEudy5vKGsuenIpO2lmKGsuYWN0aXZldGltZS5vbkluVmlld1RpbWVDb3VudClmb3IodmFyIGYgaW4gZClkW2ZdLnJlbW92ZUxpc3RlbmVyJiZkW2ZdLnJlbW92ZUxpc3RlbmVyKGsuYWN0aXZldGltZSk7ZWxzZSBrLmFjdGl2ZXRpbWUub25JblZpZXdUaW1lQ291bnQ9YS5hLmRmKFtrXSxhLmFzLmcpOyhkPWEudy5rKGsuenIsITApKSYmZC5hZGRMaXN0ZW5lcihrLmFjdGl2ZXRpbWUpfX07YS5hcy5kPWZ1bmN0aW9uKGspe2suYWN0aXZldGltZS5tb3VzZVN1YklkPXIuc3dkZS5henN4KCJtb3VzZUV2ZW50IixhLmEuZGYoW2tdLGEuYXMuaCkpO2suYWN0aXZldGltZS5tb3VzZUxvY2FsU3ViSWQ9YS5rLmEuYXpzeCgibW91c2VFdmVudCIsYS5hLmRmKFtrXSxhLmFzLmgpKTtrLmFjdGl2ZXRpbWUua2V5Ym9hcmRTdWJJZD1yLnN3ZGUuYXpzeCgia2V5Ym9hcmRFdmVudCIsYS5hLmRmKFtrXSxhLmFzLmkpKTtrLmFjdGl2ZXRpbWUuZm9jdXNTdWJJZD1yLnN3ZGUuYXpzeCgiZm9jdXNTdGF0ZUNoYW5nZSIsYS5hLmRmKFtrXSxhLmFzLmopKX07YS5hcy5lPWZ1bmN0aW9uKGspe2lmKGsuYWN0aXZldGltZSYmKHIuc3dkZS5zeGF6KCJtb3VzZUV2ZW50Iix7aWQ6ay5hY3RpdmV0aW1lLm1vdXNlU3ViSWR9KSxhLmsuYS5zeGF6KCJtb3VzZUV2ZW50Iix7aWQ6ay5hY3RpdmV0aW1lLm1vdXNlTG9jYWxTdWJJZH0pLHIuc3dkZS5zeGF6KCJrZXlib2FyZEV2ZW50Iix7aWQ6ay5hY3RpdmV0aW1lLmtleWJvYXJkU3ViSWR9KSxyLnN3ZGUuc3hheigiZm9jdXNTdGF0ZUNoYW5nZSIse2lkOmsuYWN0aXZldGltZS5mb2N1c1N1YklkfSksay5hY3RpdmV0aW1lJiZrLmFjdGl2ZXRpbWUuY291bnRlcnMmJiJvYmplY3QiPT09dHlwZW9mIGsuYWN0aXZldGltZS5jb3VudGVycykpZm9yKHZhciBkIGluIGsuYWN0aXZldGltZS5jb3VudGVycylkZWxldGUgay5hY3RpdmV0aW1lLmNvdW50ZXJzW2RdfTthLmFzLms9ZnVuY3Rpb24oayxkKXthLmFzLmwoaywhMCl9O2EuYXMuaD1mdW5jdGlvbihrLGQpe2EuYXMubChrLCEwKX07YS5hcy5pPWZ1bmN0aW9uKGssZCl7YS5hcy5sKGssITApfTthLmFzLmo9ZnVuY3Rpb24oayxkKXtkJiZhLmFzLmwoaywhMCl9O2EuYXMubD1mdW5jdGlvbihrLGQpe3ZhciBmPShuZXcgQSkuZ2V0VGltZSgpLGY9ay5hY3RpdmV0aW1lLmFjdGl2ZVRTJiZmLWsuYWN0aXZldGltZS5hY3RpdmVUU3x8MDtkJiYoMWUzPGZ8fCFrLmFjdGl2ZXRpbWUuYWN0aXZlKSYmKGsuYWN0aXZldGltZS5jaGVja0lEJiZhLmEuYShrLmFjdGl2ZXRpbWUuY2hlY2tJRCksay5hY3RpdmV0aW1lLmFjdGl2ZVRTPShuZXcgQSkuZ2V0VGltZSgpLGsuYWN0aXZldGltZS5jaGVja0lEPWEubC5mKGEuYS5kZihba10sYS5hcy5tKSxhLmFzLmIpKTtrLmFjdGl2ZXRpbWUuYWN0aXZlPWR9O2EuYXMubT1mdW5jdGlvbihrKXtpZihrLmFjdGl2ZXRpbWUuYWN0aXZlKXt2YXIgZD0obmV3IEEpLmdldFRpbWUoKS1rLmFjdGl2ZXRpbWUuYWN0aXZlVFM8YS5hcy5iO2EuYXMubChrLGQpfX07YS5hcy5nPWZ1bmN0aW9uKGssZCxmLGcsYyl7Zj1hLmF2LmMoay5hY3RpdmV0aW1lLmNvdW50ZXJzLGMpO2M9YS53Lmcoay56cixjKTtjPShrPWsuYWN0aXZldGltZS5hY3RpdmUpJiZjJiZjLnZpc2libGUmJmMudmlzaWJsZSgpO2c9Zi5nZXQoImxhc3RBY3RpdmVWaXMiLCExKTshZi5nZXQoIndhc0V2ZXJBY3RpdmVBbmRGb2N1c2VkIikmJmsmJmYuc2V0KCJ3YXNFdmVyQWN0aXZlQW5kRm9jdXNlZCIsMSk7ZyYmYz9mLmluY3JlbWVudCgiYWN0aXZlSW52aWV3VGltZSIsdy5tYXgoZCwwKSk6KGd8fGMpJiZmLmluY3JlbWVudCgiYWN0aXZlSW52aWV3VGltZSIsdy5tYXgody5yb3VuZCguNSpkKSwwKSk7Zi5zZXQoImxhc3RBY3RpdmVWaXMiLGMpfTthLmFzLmE9ZnVuY3Rpb24oayxkKXtpZighYS5kLmMoKSl7ZC5yZj1hLmMuZXY/MTowO3ZhciBmO2Y9YS5jLmV2O2lmKCFhLmMuYylyZXR1cm4gZj1mfHxhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKXx8ayYmay5jb3VudGVycyYmay5jb3VudGVycy5zdHJpY3REd2VsbCYmay5jb3VudGVycy5zdHJpY3REd2VsbC50Q3VyJiYwPGsuY291bnRlcnMuc3RyaWN0RHdlbGwudEN1cixkLnJlPWY/MTowLGQ7aWYoIWsuYWN0aXZldGltZSlyZXR1cm4gZDt2YXIgZz1hLncuYihrLnpyKSxnPWEuYXYuYyhrLmFjdGl2ZXRpbWUuY291bnRlcnMsZyk7Zj1mfHxnLmdldCgid2FzRXZlckFjdGl2ZUFuZEZvY3VzZWQiKTtkLnJlPWY/MTowO2cmJjA8Zy5nZXQoImFjdGl2ZUludmlld1RpbWUiKSYmKGQuZnQ9Zy5nZXQoImFjdGl2ZUludmlld1RpbWUiKSxkLmZ2PWcuZ2V0KCJsYXN0QWN0aXZlSW52aWV3VGltZSIpLGQuZnc9Zy5nZXQoImFjdGl2ZUludmlld1RpbWVGaXJzdERlbHRhIixnLmdldCgiYWN0aXZlSW52aWV3VGltZSIpKSxnLnNldCgibGFzdEFjdGl2ZUludmlld1RpbWUiLGcuZ2V0KCJhY3RpdmVJbnZpZXdUaW1lIikpKTtyZXR1cm4gZH19O2Euay5hLmF6c3goInZpZXdDb3VudGVyU3RhcnRlZCIsYS5hcy5mKTthLmsuYS5henN4KCJzdGFydEFkVHJhY2tpbmciLGEuYXMuYyl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhjKXtjLmZ1bmN0aW9uSW5Qcm9ncmVzcz0hMTtyZXR1cm4gMDxjLnBlbmRpbmdGdW5jdGlvbnMubGVuZ3RoPyhjPWMucGVuZGluZ0Z1bmN0aW9ucy5zaGlmdCgpLGEuYS5kZihjLGEuYXguY2FsbCxhLmF4KSgpLCEwKTohMX1mdW5jdGlvbiBkKCl7dHJ5e2E9d2luZG93Ll9fYiwoMCx3aW5kb3cuX193KSgiSU5ORVJfRlVOQ1RJT04iKSx3aW5kb3cuX193PXZvaWQgMCx3aW5kb3cuX19iPXZvaWQgMH1jYXRjaChkKXt2YXIgYz1kLm5hbWUrIiBpbiBjbG9zdXJlIChtb2F0LmN1c3RvbUlmcmFtZSk6ICIrZC5tZXNzYWdlKyIsIHN0YWNrPSIrZC5zdGFjazt0cnl7dmFyIGI9InVuZGVmaW5lZCIhPT10eXBlb2Ygb21pZE5hdGl2ZSYmKCJ1bmRlZmluZWQiPT09dHlwZW9mIEltYWdlfHxJbWFnZSYmSW1hZ2UuX01vYXRQcm94eU9mKSxlPWI/IiI6ZG9jdW1lbnQucmVmZXJyZXIsZj0idW5kZWZpbmVkIiE9PXR5cGVvZiBhJiZhLmMmJmEuYy5uP2EuYy5uOiIiLGc9Imh0dHBzOi8vcHgubW9hdGFkcy5jb20vcGl4ZWwuZ2lmP2U9MjQmZD1kYXRhJTNBZGF0YSUzQWRhdGElM0FkYXRhJmk9Iitlc2NhcGUoIlJFVVRFUlNfSEVBREVSMSIpKyImYWM9MSZrPSIrZXNjYXBlKGMpKyImYXI9Iitlc2NhcGUoIjI5YWQ1OWQtY2xlYW4iKSsiJml3PSIrZXNjYXBlKCIzMWQ2OTY1IikrIiZicT0iK2VzY2FwZShmKSsiJmo9Iitlc2NhcGUoZSkrIiZjcz0iKyhuZXcgQSkuZ2V0VGltZSgpO2I/b21pZE5hdGl2ZS5zZW5kVXJsKGcpOm5ldyBJbWFnZSgxLDEpLnNyYz1nfWNhdGNoKGspe319fWZ1bmN0aW9uIGYoYyl7aWYoIWMpcmV0dXJuITE7dmFyIGI9Yy5pZnJhbWUsZT1iLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsZj1jLmlubmVyRnVuY3Rpb24sZz1jLmlubmVyRnVuY3Rpb25DYk5hbWUscD1jLnByZXNlcnZlRG9tOyExIT09YS5jLmVkKCk/KHA9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxwLmlubmVySFRNTD1kLnRvU3RyaW5nKCkucmVwbGFjZSgnIklOTkVSX0ZVTkNUSU9OIicsZiksZS5ib2R5LmFwcGVuZENoaWxkKHApKTooZj0iPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjxzY3JpcHQ+IitkLnRvU3RyaW5nKCkucmVwbGFjZSgnIklOTkVSX0ZVTkNUSU9OIicsZikrIjxcL3NjcmlwdD4iLHB8fChmKz0iPHNjcmlwdD5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5jbG9zZSgpOyB9LCAxKTs8XC9zY3JpcHQ+IiksZS53cml0ZShmKyI8L2JvZHk+PC9odG1sPiIpKTtiLmNvbnRlbnRXaW5kb3cuX19iPWMuTW9hdDtiLmNvbnRlbnRXaW5kb3cuX193PWMud3JhcHBlcjtiLmNvbnRlbnRXaW5kb3dbZC50b1N0cmluZygpLm1hdGNoKC9mdW5jdGlvbiAoXHcrKVwoXCkvKVsxXV0oKTtnJiZhLmMuYXhbZ10mJihhLmMuYXhbZ109bnVsbCk7aWYoIWsoYy5mcmFtZURhdGEpKWE6aWYoZT1jLnNldElmcmFtZURvbWFpbixjPWMucHJlc2VydmVEb20sYil7dmFyIHQ7aWYoIWUpdHJ5e3Q9Yi5jb250ZW50V2luZG93LmRvY3VtZW50fWNhdGNoKHEpe2JyZWFrIGF9Zz0hMT09PWEuYy5lZCgpO2M/ZT9iLnNyYz0iamF2YXNjcmlwdDpkb2N1bWVudC5jbG9zZSgpOyI6dC5jbG9zZSgpOmU/Yi5zcmM9Zz8iamF2YXNjcmlwdDpkb2N1bWVudC5vcGVuKCk7IGRvY3VtZW50LmNsb3NlKCk7IjonamF2YXNjcmlwdDpkb2N1bWVudC5oZWFkICYmIChkb2N1bWVudC5oZWFkLmlubmVySFRNTD0iIik7IGRvY3VtZW50LmJvZHkgJiYgKGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSIiKTsnOmc/KHQub3BlbigpLHQuY2xvc2UoKSk6KHQuaGVhZCYmKHQuaGVhZC5pbm5lckhUTUw9IiIpLHQuYm9keSYmKHQuYm9keS5pbm5lckhUTUw9IiIpKX19ZnVuY3Rpb24gZyhhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXJldHVybiIiO3ZhciBiPWEuY2hhckF0KDApOyInIiE9PWImJiciJyE9PWImJihhPSInIithKyInIik7cmV0dXJuIGF9YS5heD17fTthLmF4LmE9ZnVuY3Rpb24oYyxiLGQsZil7aWYoIWMpcmV0dXJuITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLHA9Ynx8YS5hLmRpKCk7aWYoIWcpcmV0dXJuITE7YS5hLmRuKGcsZik7dmFyIHQ7ZD8oZD1hLmEuY20oZCksdD1mdW5jdGlvbigpe2EuYS5jbChnLGQpfSk6KGQ9YS5jLmUuZG9jdW1lbnQuYm9keSx0PWZ1bmN0aW9uKCl7ZC5pbnNlcnRCZWZvcmUoZyxkLmluc2VydEJlZm9yZVswXXx8bnVsbCl9KTt2YXIgcT17aWQ6cCxpZnJhbWU6ZyxmdW5jdGlvbkluUHJvZ3Jlc3M6ITEscGVuZGluZ0Z1bmN0aW9uczpbXSxwYXJlbnQ6ZCxsb2FkZWQ6ITF9O2cub25sb2FkPWZ1bmN0aW9uKCl7Zy5jb250ZW50V2luZG93JiZnLmNvbnRlbnREb2N1bWVudCYmIXEubG9hZGVkJiYocS5sb2FkZWQ9ITAsayhxKSl9O3QoKTtxLmxvYWRlZD1xLmxvYWRlZHx8Zy5jb250ZW50RG9jdW1lbnQmJiJjb21wbGV0ZSI9PT1nLmNvbnRlbnREb2N1bWVudC5yZWFkeVN0YXRlO2MuY3VzdG9tSWZyYW1lc3x8KGMuY3VzdG9tSWZyYW1lcz17fSk7Yy5jdXN0b21JZnJhbWVzW3BdPXE7cS5sb2FkZWQmJmsocSk7YS5rLmEuYXpzeCgiYWRLaWxsZWQiLGZ1bmN0aW9uKGIpe3ZhciBjPWIuY3VzdG9tSWZyYW1lcyxkO2ZvcihkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmYS5heC5iKGIsY1tkXS5pZCl9LHtjb25kaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGMuenI9PWEuenJ9LG9uY2U6ITB9KTtyZXR1cm4gcH1jYXRjaChyKXt9cmV0dXJuITF9O2EuYXguYj1mdW5jdGlvbihhLGIsZCl7dmFyIGY9YS5jdXN0b21JZnJhbWVzW2JdO2Q9ZiYmZi5pZnJhbWU7aWYoIWZ8fCFkKXJldHVybiExO2Y9Zi5wYXJlbnQ7aWYoIWYpcmV0dXJuITE7dHJ5e2YucmVtb3ZlQ2hpbGQoZCl9Y2F0Y2goZyl7fWEuY3VzdG9tSWZyYW1lc1tiXT1udWxsO2RlbGV0ZSBhLmN1c3RvbUlmcmFtZXNbYl07cmV0dXJuITB9O2EuYXguY2FsbD1mdW5jdGlvbihjLGIsZCxoLGsscCl7aWYoIWN8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpcmV0dXJuITE7dmFyIHQ9YyYmYy5jdXN0b21JZnJhbWVzJiZjLmN1c3RvbUlmcmFtZXNbYl07aWYoIXR8fCFkKXJldHVybiExO2g9aCYmInN0cmluZyIhPT10eXBlb2YgaD9oLnRvU3RyaW5nKCk6ZyhoKTtkJiYic3RyaW5nIiE9PXR5cGVvZiBkJiYoZD1hLmEuZGwoZCxoKSk7ayYmImZ1bmN0aW9uIj09PXR5cGVvZiBrfHwoaz1mdW5jdGlvbigpe30pO2lmKHQuZnVuY3Rpb25JblByb2dyZXNzfHwhdC5sb2FkZWQpcmV0dXJuIHQucGVuZGluZ0Z1bmN0aW9ucy5wdXNoKFtjLGIsZCxoLGsscF0pLCExO2M9dC5pZnJhbWU7dC5mdW5jdGlvbkluUHJvZ3Jlc3M9ITA7Yj0hMTt0cnl7aWYoIXQuaWZyYW1lLmNvbnRlbnREb2N1bWVudCl0aHJvdyBFcnJvcigpfWNhdGNoKHIpe2I9ITB9ZD1hLmwubChhLmEuZGYoW3tpZnJhbWU6YyxmcmFtZURhdGE6dCxNb2F0OmEsd3JhcHBlcjpmdW5jdGlvbihhKXtrKGEpfSxpbm5lckZ1bmN0aW9uOmQsaW5uZXJGdW5jdGlvbkNiTmFtZTpxLHNldElmcmFtZURvbWFpbjpiLHByZXNlcnZlRG9tOnB9XSxmKSk7aWYoYil7dmFyIHE7ZG97cT0iTW9hdCNpcWNiIit3LmZsb29yKDFlNCp3LnJhbmRvbSgpKX13aGlsZShhLmMuYXhbcV0pO2EuYy5lW2EuYy5heV1bcV09ZDtjLnNyYz0namF2YXNjcmlwdDpkb2N1bWVudC5vcGVuKCk7IGRvY3VtZW50LmRvbWFpbj0iJytkb2N1bWVudC5kb21haW4rJyI7IHdpbmRvdy5wYXJlbnRbIicrYS5jLmF5KyciXVsiJytxKyciXSgpOyd9ZWxzZSBkKCl9fSkodSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXt3aW5kb3cuX3FzPWE7KGE9d2luZG93Ll9fYikmJmEuYS5jbigiaHR0cHM6Ly96Lm1vYXRhZHMuY29tL3B4Mi9jbGllbnQuanMiLGRvY3VtZW50LmJvZHkpfXUuYXk9e307dS5heS5hPWZ1bmN0aW9uKGspe2lmKGspe3ZhciBkPTA9PT13LmZsb29yKDFlMyp3LnJhbmRvbSgpKTtrLnB4Mj17aW5TYW1wbGU6ITEsc3VjY2VzczohMSxmaXJlZFBpeGVsOiExfTtpZihkJiYoay5weDIuaW5TYW1wbGU9ITAsZD11LmF4LmEoaywiaXZ0IikpKXt0cnl7dmFyIGY9ay5jdXN0b21JZnJhbWVzJiZrLmN1c3RvbUlmcmFtZXNbZF0mJmsuY3VzdG9tSWZyYW1lc1tkXS5pZnJhbWU7ZiYmKGYuY29udGVudFdpbmRvdy5fX1BYMl9fPWsucHgyKX1jYXRjaChnKXt9Zj11LmYucigpO2Y9dS55LmIoMzYsay5hbyxmLCExLCEwKTtmLnFzLmk9dS5hLmR5KCJSRVVURVJTX0hFQURFUjEiLCJQWDIiKTtmPXUueS5qKGYucXMpO3UuYXguY2FsbChrLGQsYSxmLG51bGwsITApO2sucHgyLnN1Y2Nlc3M9ITB9fX19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhjKXt2YXIgZD17b3o6ITB9O2lmKCFhLmMuYW0oKS5pc0luQXBwfHxhLmMuY3EoKSlkLnN1PSEwLGQub2Y9ITA7aWYoIWJbY10pcmV0dXJuITE7Zm9yKHZhciBlIGluIGJbY10paWYoZFtlXSYmYltjXS5oYXNPd25Qcm9wZXJ0eShlKSYmIWJbY11bZV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZChiKXthLmFpLmUoYik7YS5haS5mKGIpO2EuYWkuZyhiKTthLmFpLmgoYik7dmFyIGM9ayhiLnpyKTshYi5oYXNBZExvYWRlZGZpcmVkJiZjP2U9ITA6IWUmJmMmJihjPXtlOjl9LGMucT1iLmFxWzldKyssYS55LmEoYixjKSxlPSEwKX1mdW5jdGlvbiBmKGEpe3JldHVybntzdDohMSxzdTohMSxvZjohMSxvejohMX19dmFyIGc9MCxjLGI9e307YS5haT17fTthLmFpLmM9ZnVuY3Rpb24oYSl7cmV0dXJuITF9O2EuYWkuZD1mdW5jdGlvbigpe3ZhciBiPShuZXcgQSkuZ2V0VGltZSgpLGM9Yi1nO2lmKGcmJiEoMWUzPmMpKXtnPWI7Zm9yKHZhciBlIGluIEIpQi5oYXNPd25Qcm9wZXJ0eShlKSYmZChCW2VdKTthLmsuYS56YXhzKCJoaWRkZW5BZHM6dXBkYXRlZCIpfX07dmFyIGU9ITE7YS5haS5lPWZ1bmN0aW9uKGMpe2JbYy56cl18fChiW2MuenJdPWYoYykpO2lmKCEwIT09YltjLnpyXS5zdCl7dmFyIGQ9YS53LmsoYy56cik7ZD8oYy5pc0N1cnJlbnRseVN0YWNrZWQ9YS56LnIoYyksITE9PT1iW2MuenJdLnN0JiYoYltjLnpyXS5zdD0hMT09PWQuYWRTdGFydGVkT25TY3JlZW4oKXx8ITE9PT1jLmlzQ3VycmVudGx5U3RhY2tlZCkpOmJbYy56cl0uc3Q9ITB9fTthLmFpLmY9ZnVuY3Rpb24oYyl7dmFyIGQ9YixlPWMuenI7ZFtlXT1iW2VdfHxmKGMpO3ZhciBnPWRbZV0uc3U7aWYoIWcpe3ZhciBrPWMuV0lORE9XfHx3aW5kb3csZz1jLkFEX1JFQ1R8fGEuei5rKGMuYWEsayxjLl9jYWxjVmlkZW9CYXNlZE9uQ29udGFpbmVyKSxrPWEuYy5yKGspLGc9Yy5pc0luSWZyYW1lP2cmJmsmJiEoZy5sZWZ0Pj1rLndpZHRofHwwPj1nLnJpZ2h0fHxnLnRvcD49ay5oZWlnaHR8fDA+PWcuYm90dG9tKTohMDtkW2VdLnN1PWd9fTthLmFpLmc9ZnVuY3Rpb24oYyl7dmFyIGQ9YixlPWMuenI7ZFtlXT1iW2VdfHxmKGMpO3ZhciBnPWRbZV0ub2Y7Z3x8KGc9YS5jLnIoYy5XSU5ET1cpLGc9Yy5pc0luSWZyYW1lP2cmJiEoNT49Zy53aWR0aHx8NT49Zy5oZWlnaHQpOiEwLGRbZV0ub2Y9Zyl9O2EuYWkuaD1mdW5jdGlvbihjKXt2YXIgZD1iW2MuenJdO2JbYy56cl09YltjLnpyXXx8ZihjKTtpZihjLmFhKXt2YXIgZT0wPGEuYS5kZShjKTtjLmlzQ3VycmVudGx5VHJhbnNwYXJlbnQ9IWU7ZC5vej1kLm96fHxlO3JldHVybiBlfXJldHVybiBkLm96fTthLmFpLmI9ZnVuY3Rpb24oYSl7dmFyIGM9e30sZCxlO2ZvcihlIGluIGJbYV0pYlthXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGQ9YlthXVtlXSxjW2VdPWQ/MTowKTtyZXR1cm4gY307YS5haS5hPWZ1bmN0aW9uKGIpe3JldHVybiBhLmMuZWEoKT8hMTohayhiKX07YS5rLmEuYXpzeCgiYWRMb2FkZWQiLGZ1bmN0aW9uKGEpe2EuaGFzQWRMb2FkZWRmaXJlZD0hMH0pO2Euay5hLmF6c3goInN0YXJ0QWRUcmFja2luZyIsZnVuY3Rpb24oYil7ZChiKTtnPShuZXcgQSkuZ2V0VGltZSgpO2N8fChjPShuZXcgQSkuZ2V0VGltZSgpKyJoYSIsYS5rLmEuYXpzeCgidmlldzp0aWNrIixmdW5jdGlvbigpe2EuYWkuZCgpfSx7aWQ6Y30pKX0pO2Euay5hLmF6c3goImFkRW50ZXJzVmlldyIsZnVuY3Rpb24oYil7YS5haS5lKGIpfSx7b25jZTohMH0pO2Euay5hLmF6c3goImFkS2lsbGVkIixmdW5jdGlvbihhKXthJiYhYS5lcCYmKGRlbGV0ZSBhLmVsZW1lbnRzRnJvbVBvaW50Q2FjaGUsZGVsZXRlIGJbYS56cl0pfSl9KSh1KTsoZnVuY3Rpb24oYSl7YS5hbj17fTt2YXIgayxkO2EuYW4uZz1mdW5jdGlvbihmKXtpZihkKWYoKTtlbHNlIGlmKGsuZ29vZ2xldGFnJiZrLmdvb2dsZXRhZy5hcGlSZWFkeSYmay5nb29nbGV0YWcucHViYWRzKCkpZD1rLmdvb2dsZXRhZy5wdWJhZHMoKSxmKCk7ZWxzZXtrLmdvb2dsZXRhZz1rLmdvb2dsZXRhZ3x8e307ay5nb29nbGV0YWcuY21kPWsuZ29vZ2xldGFnLmNtZHx8W107dmFyIGc9YS5sLmwoZiksYz1mdW5jdGlvbigpe3ZhciBhPWsuZ29vZ2xldGFnOyhkPWEmJmEuYXBpUmVhZHkmJmEucHViYWRzKCkpJiZnKCl9O2Euay5hLmF6c3goImFkS2lsbGVkIixmdW5jdGlvbigpe3ZhciBiPWsuZ29vZ2xldGFnO2lmKGImJmEuYVsiZG8iXShiLmFwaVJlYWR5KSYmYi5jbWQmJmEuYS5mKGIuY21kKSl7dmFyIGQ9Yi5jbWQuaW5kZXhPZihjKTstMSE9PWQmJmIuY21kLnNwbGljZShkLDEpfX0pO2suZ29vZ2xldGFnLmNtZC5wdXNoKGMpfX07YS5hbi5sPWZ1bmN0aW9uKCl7aWYoZCYmImZ1bmN0aW9uIiE9PXR5cGVvZiBkLmdldFNsb3RzKXJldHVybiExO3RyeXtyZXR1cm4gZC5nZXRTbG90cygpfWNhdGNoKGEpe3JldHVybltdfX07YS5hbi5hPWZ1bmN0aW9uKCl7aWYoZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBkLmdldFNsb3RJZE1hcClyZXR1cm4gZC5nZXRTbG90SWRNYXAoKX07YS5hbi5tPWZ1bmN0aW9uKGEpe3JldHVybiBkLmdldFRhcmdldGluZyhhKX07YS5hbi5uPWZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBkLmdldFRhcmdldGluZ0tleXN8fCJmdW5jdGlvbiIhPT10eXBlb2YgZC5nZXRUYXJnZXRpbmcpcmV0dXJuITE7dmFyIGY9ZC5nZXRUYXJnZXRpbmdLZXlzKCksZz17fTthLmEuZm9yRWFjaChmLGZ1bmN0aW9uKGEpe2dbYV09ZC5nZXRUYXJnZXRpbmcoYSl9KTtyZXR1cm4gZ307YS5hbi5vPWZ1bmN0aW9uKGEsZyl7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBkLnNldFRhcmdldGluZylyZXR1cm4hMTtkLnNldFRhcmdldGluZyhhLGcpO3JldHVybiEwfTthLmFuLnA9ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBkLmNsZWFyVGFyZ2V0aW5nKXJldHVybiExO2QuY2xlYXJUYXJnZXRpbmcoYSl9O2EuYW4ucT1mdW5jdGlvbihhKXtpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0VGFyZ2V0aW5nS2V5cylyZXR1cm4gYS5nZXRUYXJnZXRpbmdLZXlzKCl9O2EuYW4ucj1mdW5jdGlvbihhLGQpe3JldHVybiBhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0VGFyZ2V0aW5nJiZkP2EuZ2V0VGFyZ2V0aW5nKGQpOiExfTthLmFuLnM9ZnVuY3Rpb24oZCl7dmFyIGc9e30sYz1hLmFuLnEoZCk7YS5hLmYoYykmJmEuYS5mb3JFYWNoKGMsZnVuY3Rpb24oYil7Z1tiXT1hLmFuLnIoZCxiKX0pO3JldHVybiBnfTthLmFuLnQ9ZnVuY3Rpb24oZCl7aWYoZCl7ZD1hLmFuLnMoZCk7dmFyIGc9YS5hbi5uKCk7YS5hLmZvckVhY2goZCxmdW5jdGlvbihhLGIpe2dbYl09YX0pO3JldHVybiBnfX07YS5hbi5qPWZ1bmN0aW9uKGEsZCxjKXtpZighKGEmJmQmJmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5zZXRUYXJnZXRpbmcpKXJldHVybiExO2Euc2V0VGFyZ2V0aW5nKGQsYyl9O2EuYW4udT1mdW5jdGlvbihhLGQpe2lmKCFhfHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuY2xlYXJUYXJnZXRpbmcpcmV0dXJuITE7YS5jbGVhclRhcmdldGluZyhkKX07YS5hbi52PWZ1bmN0aW9uKGYsZyl7aWYoZiYmZyYmZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBkLmFkZEV2ZW50TGlzdGVuZXIpe3ZhciBjPWEubC5sKGcpO2QuYWRkRXZlbnRMaXN0ZW5lcihmLGMpfX07YS5hbi5kPWZ1bmN0aW9uKGEpe2lmKGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRTbG90RWxlbWVudElkKXJldHVybiBhLmdldFNsb3RFbGVtZW50SWQoKX07YS5hbi5mPWZ1bmN0aW9uKGEpe2lmKGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRTbG90SWQmJihhPWEuZ2V0U2xvdElkKCkpJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0SWQpcmV0dXJuIGE9YS5nZXRJZCgpLGsuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdvb2dsZV9hZHNfaWZyYW1lXyIrYSl9O2EuYW4uYz1mdW5jdGlvbihhKXtpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0QWRVbml0UGF0aClyZXR1cm4gYS5nZXRBZFVuaXRQYXRoKCl9O2EuYW4uZT1mdW5jdGlvbihkKXtpZihkPWEuYW4uYyhkKSl7ZD1kJiZkLnNwbGl0KCIvIik7dmFyIGc9W107YS5hLmZvckVhY2goZCxmdW5jdGlvbihhKXswPGEubGVuZ3RoJiZnLnB1c2goYSl9KTtyZXR1cm4gZ319O2EuYW4uaD1mdW5jdGlvbihkKXt2YXIgZz1bXTtkJiYiZnVuY3Rpb24iPT09dHlwZW9mIGQuZ2V0U2l6ZXMmJmEuYS5mb3JFYWNoKGQuZ2V0U2l6ZXMoKSxmdW5jdGlvbihhKXsiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0V2lkdGgmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRIZWlnaHQmJmcucHVzaChbYS5nZXRXaWR0aCgpLGEuZ2V0SGVpZ2h0KCldKX0pO3JldHVybiBnfTthLmFuLnc9ZnVuY3Rpb24oKXt2YXIgYT1rJiZrLmdvb2dsZXRhZyYmay5nb29nbGV0YWcuc2l6ZU1hcHBpbmc7aWYoYSlyZXR1cm4gYSgpfTthLmFuLmI9ZnVuY3Rpb24oKXtpZihkKXt2YXIgZixnPWRvY3VtZW50LmJvZHk7YS5hLmZvckVhY2goMyxmdW5jdGlvbigpe2Y9ZztnPWEuZy5iKGcpO2lmKCFnKXJldHVybiExfSk7dmFyIGM9YS5hbi54KGYpO2lmKCJzdHJpbmciPT09dHlwZW9mIGMpe3ZhciBiPWQuZ2V0U2xvdElkTWFwKCksZTtmb3IoZSBpbiBiKWlmKGUmJiJzdHJpbmciPT09dHlwZW9mIGUmJmU9PT1jKXJldHVybiBiW2VdfX19O2EuYW4ueD1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5pZCYmLTE8YS5pZC5pbmRleE9mKCJnb29nbGVfYWRzX2lmcmFtZSIpP2EuaWQucmVwbGFjZSgvZ29vZ2xlX2Fkc19pZnJhbWVfPy8sIiIpOm51bGx9O2EuYW4uaT1mdW5jdGlvbigpe3JldHVybiBrfTthLmFuLms9ZnVuY3Rpb24oYSxnKXtpZihkJiYiZnVuY3Rpb24iIT09dHlwZW9mIGQucmVmcmVzaClyZXR1cm4hMTtkLnJlZnJlc2goYSxnKX07KGZ1bmN0aW9uKCl7az13aW5kb3c7YS5hbi5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX0pKCl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaygpe2lmKCFxJiZ0IT09aC5MT0FESU5HKXtxPSEwO2EuYXouYS5hbGxEYXRhPShuZXcgQSkuZ2V0VGltZSgpO3ZhciBiPXdpbmRvdy5tb2F0WWllbGRSZWFkeTsiZnVuY3Rpb24iPT09dHlwZW9mIGImJmEubC5sKGIpKCl9fWZ1bmN0aW9uIGQoYil7dmFyIGM7Yz1mKGIpP3AuYzpwLmI7YS5hbi5nKGZ1bmN0aW9uKCl7YS5hbi5vKGwuZCxjKTthLmFuLm8obC5lLGMpfSl9ZnVuY3Rpb24gZihhKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBhJiYhMSE9PWEuX3BiZH1mdW5jdGlvbiBnKCl7ZnVuY3Rpb24gYihhKXtnJiZjb25zb2xlLmxvZygiPj4+TU9BVCBZSUVMRCBJTlRFTExJR0VOQ0UvIithKX1mdW5jdGlvbiBjKGIsZCl7cmV0dXJuIGEuYS5jaihmdW5jdGlvbihjKXtyZXR1cm4oYz1hLmFuLnIoYixjKSkmJmMubGVuZ3RoJiYxPD1jLmxlbmd0aD9jWzBdOiIifSxkKS5qb2luKCJ8Iil9ZnVuY3Rpb24gZChnKXt2YXIgaCxrLG07aWYoIXQpcmV0dXJuIGIoInNldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBObyBNb2F0IEFQSSByZXNwb25zZSBmb3Igc2xvdCBsZXZlbCBkYXRhLCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuIiksYS5hbi5qKGcsbC5kLHAuZCksYS5hbi5qKGcsbC5lLHAuZCksITE7aWYoIWYodCkpcmV0dXJuIGIoInNldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBObyBoaXN0b3JpY2FsIHNsb3QgZGF0YSBhdmFpbGFibGUsIG5vdCBzZXR0aW5nIHRhcmdldGluZy4iKSxhLmFuLmooZyxsLmQscC5lKSxhLmFuLmooZyxsLmUscC5lKSwhMTtpZighZ3x8ImZ1bmN0aW9uIiE9PXR5cGVvZiBnLmdldFNsb3RFbGVtZW50SWQpcmV0dXJuIGIoInNldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBTbG90IGlzIG1pc3NpbmcsIG5vdCBzZXR0aW5nIHRhcmdldGluZy4iKSwhMTtoPWcuZ2V0U2xvdEVsZW1lbnRJZCgpO2lmKGEuYS5mKCJkaXZfaWQiKSltPWMoZywiZGl2X2lkIik7ZWxzZXtrPWEuYW4ucihnLCJkaXZfaWQiKTtpZighaylyZXR1cm4gYigic2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IHNsb3RJZCAiK2grIjsgRmFpbGVkIHRvIGdldCBkaXZfaWQgdGFyZ2V0aW5nIGFycmF5LCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuIiksITE7bT1rWzBdO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIG0pcmV0dXJuIGIoInNldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBzbG90SWQgIitoKyI7IE5vIHRhcmdldGluZyBkYXRhIHNldCBmb3IgZGl2X2lkLCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuIiksITF9az10W21dJiZ0W21dW2VdO2lmKCFrKXJldHVybiBiKCJzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogc2xvdElkICIraCsiOyBObyBoaXN0b3JpY2FsIGRhdGEgZm91bmQgZm9yIGRpdl9pZCBvZiAiK20rIiwgbm90IHNldHRpbmcgdGFyZ2V0aW5nLiIpLGEuYW4uaihnLGwuZCxwLmYpLGEuYW4uaihnLGwuZSxwLmYpLCExO2Zvcih2YXIgcSBpbiBrKWlmKGEuYS5jeShrLHEpKXt2YXIgcj1rW3FdO2lmKGEuYS5kYihyKSl7Yigic2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IHNsb3RJZCAiK2grIjsgU2V0dGluZyAiK3ErIiB2YWx1ZSBvZiAiK3IrIi4iKTttPXBhcnNlSW50KHIpO3I9ci50b1N0cmluZygpO2lmKCJudW1iZXIiPT09dHlwZW9mIG0mJjA9PT1tJTEwJiYxMDxtJiYxMDA+PW0pZm9yKHI9W3JdLG09bS8xMC0xOzA8bTttLS0pci5wdXNoKCgxMCptKS50b1N0cmluZygpKTthLmFuLmooZyxxLHIpfX19dmFyIGUsZz0hMSxoLGsscSx0O2U9YS5jLmRiPyJNb2JpbGUiOiJEZXNrdG9wIjt0aGlzLnNsb3REYXRhQXZhaWxhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIGYodCk/ISF0OiExfTt0aGlzLnBhZ2VEYXRhQXZhaWxhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O3RoaXMuc2FmZXR5RGF0YUF2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiExfTt0aGlzLmVuYWJsZUxvZ2dpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gZz0hMH07dGhpcy5kaXNhYmxlTG9nZ2luZz1mdW5jdGlvbigpe2c9ITE7cmV0dXJuITB9O3RoaXMuc2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q9ZnVuY3Rpb24oYil7Yj1hLmEuZGYoW2JdLGQpO2EuYW4uZyhiKX07dGhpcy5zZXRNb2F0VGFyZ2V0aW5nRm9yQWxsU2xvdHM9ZnVuY3Rpb24oKXthLmFuLmcoZnVuY3Rpb24oKXt2YXIgYz1hLmFuLmwoKTtpZighYylyZXR1cm4gYigic2V0TW9hdFRhcmdldGluZ0ZvckFsbFNsb3RzOiBGYWlsZWQgdG8gZ2V0IHNsb3RzIGZyb20gR1BULCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuIiksITE7YS5hLmZvckVhY2goYyxmdW5jdGlvbihhKXtkKGEpfSx0aGlzKX0pfTt0aGlzLmdldE1vYXRUYXJnZXRpbmdGb3JTbG90PWZ1bmN0aW9uKGQpe3ZhciBmLGc7c3dpdGNoKHR5cGVvZiBkKXtjYXNlInN0cmluZyI6dmFyIG09YS5hbi5sKCk7aWYoIWEuYS5mKG0pKXtiKCJnZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogTm8gdmFsaWQgc2xvdCBpZGVudGlmaWVyIHByb3ZpZGVkLCBleGl0aW5nLiIpO3JldHVybn1hLmEuZm9yRWFjaChtLGZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRTbG90RWxlbWVudElkJiZhLmdldFNsb3RFbGVtZW50SWQoKT09PWQpcmV0dXJuIGc9YSwhMX0pO2JyZWFrO2Nhc2Uib2JqZWN0IjppZigiZnVuY3Rpb24iIT09dHlwZW9mIGQuZ2V0U2xvdEVsZW1lbnRJZCl7YigiZ2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IE5vIHZhbGlkIHNsb3QgaWRlbnRpZmllciBwcm92aWRlZCwgZXhpdGluZy4iKTtyZXR1cm59Zz1kO2cuZ2V0U2xvdEVsZW1lbnRJZCgpO2JyZWFrO2RlZmF1bHQ6YigiZ2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IE5vIHZhbGlkIHNsb3QgaWRlbnRpZmllciBwcm92aWRlZCwgZXhpdGluZy4iKTtyZXR1cm59Im9iamVjdCI9PT10eXBlb2YgZyYmImZ1bmN0aW9uIj09PXR5cGVvZiBnLmdldFRhcmdldGluZz9hLmEuZigiZGl2X2lkIik/Zj1jKGcsImRpdl9pZCIpOihtPWEuYW4ucihnLCJkaXZfaWQiKSkmJm0ubGVuZ3RoJiYxPD1tLmxlbmd0aCYmKGY9bVswXSk6YigiZ2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IEZhaWxlZCB0byBnZXQgc2xvdCB0YXJnZXRpbmcsIEdQVCBzbG90IG9iamVjdCBpcyBpbnZhbGlkLiIpOyJzdHJpbmciIT09dHlwZW9mIGYmJihmPSIiKTtmPXQmJnRbZl0mJnRbZl1bZV18fHt9O2ZbbC5iXT1oO2ZbbC5jXT1rO2ZbbC5hXT1xO3JldHVybiBmfTt0aGlzLmdldE1vYXRUYXJnZXRpbmdGb3JQYWdlPWZ1bmN0aW9uKCl7dmFyIGE9e307YVtsLmJdPWg7YVtsLmNdPWs7YVtsLmFdPXE7cmV0dXJuIGF9O3RoaXMuX19BPWZ1bmN0aW9uKGEsYil7aD1hO2s9Yn07dGhpcy5fX0I9ZnVuY3Rpb24oYSl7cT1hfTt0aGlzLl9fQz1mdW5jdGlvbihhKXt0PWF9fWEuYXo9e307dmFyIGM9dy5mbG9vcih3LnJhbmRvbSgpKncucG93KDEwLDEyKSksYj1hLmEuYW8oKSxlPWEuYS5hbSgpO2EuYXouYT17d3JhcHBlcjp3aW5kb3cubW9hdEhlYWRlckluaXRUaW1lfHxhLmMuYmosYXBpUmVhZHk6bnVsbCxuYWRvRGF0YTpudWxsLGFsbERhdGE6bnVsbH07YS5hei5iPXtyZW5kZXJlZDowLHNsb3RUYXJnZXRpbmdMb2FkZWQ6MCxzbG90VGFyZ2V0aW5nU2V0OjAscGFnZURhdGFUYXJnZXRpbmdTZXQ6MCxzYWZldHlUYXJnZXRpbmdTZXQ6MCxlbXB0eVNsb3Q6MH07dmFyIGg9e0xPQURJTkc6IjAiLExPQURFRDoiMSJ9LGw9e2E6Im1fZGF0YSIsYjoibV9zYWZldHkiLGM6Im1fY2F0ZWdvcmllcyIsZDoibV9tdiIsZToibV9ndiJ9LHA9YS5jLmVtLHQ9aC5MT0FESU5HLHE9ITE7YS5hei5jPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhLGMpe3ZhciBkPSJzYWZlIj09PWM/Im1vYXRfc2FmZSI6Im1vYXRfdW5zYWZlIjthJiYtMSE9PWEuaW5kZXhPZigibW9hdF91bnN1cmUiKT8oYS5zcGxpY2UoYS5pbmRleE9mKCJtb2F0X3Vuc3VyZSIpLDEpLGEucHVzaChkKSk6MD09PWEubGVuZ3RoJiZhLnB1c2goZCk7cmV0dXJuIGF9ZnVuY3Rpb24gYyhiKXtpZighYnx8IWEuYS5mKGIpKXJldHVybiBiO3ZhciBkPSJndl9hZHVsdCBndl9hcm1zIGd2X2NyaW1lIGd2X2RlYXRoX2luanVyeSBndl9kb3dubG9hZCBndl9kcnVncyBndl9oYXRlc3BlZWNoIGd2X21pbGl0YXJ5IGd2X29ic2Nlbml0eSBndl90ZXJyb3Jpc20gZ3ZfdG9iYWNjbyBtb2F0X3NhZmUgbW9hdF91bnNhZmUgbW9hdF9zZW5zaXRpdmUiLnNwbGl0KCIgIik7cmV0dXJuIGEuYS5maWx0ZXIoYixmdW5jdGlvbihhKXtyZXR1cm4gYSYmLTEhPT1kLmluZGV4T2YoYSl9KX12YXIgZT1uZXcgZzt3aW5kb3cubW9hdFByZWJpZEFwaT1lO2soKTthLmF6LmEuYXBpUmVhZHk9KG5ldyBBKS5nZXRUaW1lKCk7YS5hay5jKCJuYWRvLWFsbCIsZnVuY3Rpb24oZil7dmFyIGcscCxxO2lmKCJvYmplY3QiIT09dHlwZW9mIGYpcmV0dXJuITE7cT0iMCI7ZiYmIm4iaW4gZiYmKHE9IjEiKTthLmFuLmcoZnVuY3Rpb24oKXthLmFuLm8obC5hLHEpfSk7ZS5wYWdlRGF0YUF2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiEwfTtlLl9fQihxKTt2YXIgcj1hLmEuZHEobmV3IFJlZ0V4cCgiLipjYWxsYmFjaz0iK2YuY2FsbGJhY2srIi4qIikpOyhyPWEuYS5kcChyKSkmJnIucmVzcG9uc2VFbmQmJmYuaCYmKGEuYXouYS5uYWRvUmVzcG9uc2VFbmQ9ci5yZXNwb25zZUVuZCxhLmF6LmEubmFkb1Jlc3BvbnNlRXhlY3V0aW9uPXcucm91bmQoZi5oKSk7Zz1hLmEuYXcoZik7Zi5jJiZhLmEuZihmLmMpJiYocD1mLmMpO2cmJmEuYW4uZyhmdW5jdGlvbigpe2EuYW4ubyhsLmIsZyl9KTtwJiYocD1jKHApLHA9YihwLGcpLGEuYW4uZyhmdW5jdGlvbigpe2EuYW4ubyhsLmMscCl9KSk7ZS5zYWZldHlEYXRhQXZhaWxhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuITB9O2UuX19BKGcscCk7Zj1mLnlpO2QoZik7ZS5fX0MoZik7YS5hei5hLm5hZG9EYXRhPShuZXcgQSkuZ2V0VGltZSgpO3Q9aC5MT0FERUQ7aygpfSl9O2EuYXouZD1mdW5jdGlvbigpe3ZhciBiPWEuYS5kZihbInNsb3RSZW5kZXJFbmRlZCIsZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYiYmInVuZGVmaW5lZCIhPT10eXBlb2YgYi5zbG90KXt2YXIgYz13aW5kb3cubW9hdFByZWJpZEFwaSxkPWIuc2xvdDtpZighYylyZXR1cm4hMTt2YXIgZT17c2xvdFRhcmdldGluZ0xvYWRlZDohMSxzbG90VGFyZ2V0aW5nU2V0OiExLHBhZ2VEYXRhVGFyZ2V0aW5nU2V0OiExLHNhZmV0eVRhcmdldGluZ1NldDohMSxlbXB0eVNsb3Q6ITF9O2Uuc2xvdFRhcmdldGluZ0xvYWRlZD1jLnNsb3REYXRhQXZhaWxhYmxlKCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYS5hbi5yKGQsbC5kKVswXSYmKGUuc2xvdFRhcmdldGluZ1NldD0hMCk7Yi5pc0VtcHR5JiYoZS5lbXB0eVNsb3Q9ITApOyJ1bmRlZmluZWQiIT09dHlwZW9mIGEuYW4ubShsLmEpWzBdJiYoZS5wYWdlRGF0YVRhcmdldGluZ1NldD0hMCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYS5hbi5tKGwuYilbMF0mJihlLnNhZmV0eVRhcmdldGluZ1NldD0hMCk7YS5hei5iLnJlbmRlcmVkKys7YS5hLmZvckVhY2goZSxmdW5jdGlvbihiLGMpeyEwPT09YiYmYS5hei5iW2NdKyt9KX19XSxhLmFuLnYpO2EuYW4uZyhiKX07YS5hei5lPWZ1bmN0aW9uKGQsZixnKXtnPXt9O2cuZT1kO2cudD1hLmMuYmo7Zy5kZT1jO2cuZD0iUkVVVEVSU19IRUFERVIxOiIrKGEuYy5kYj8iTW9iaWxlIjoiRGVza3RvcCIpKyI6LTotIjtnLmk9IllJRUxEX0lOVEVMTElHRU5DRV9JTlRFUk5BTDEiO2cuc2dzPTU7Zy5hcj0iMjlhZDU5ZC1jbGVhbiI7Zy5pdz0iMzFkNjk2NSI7NDM9PT1kJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBmJiYoZD1mLmdldFNsb3RFbGVtZW50SWQoKSxnLnpNb2F0RGZwU2xvdElkPWR8fCItIik7Zy56TW9hdFJlbmRlcmVkPWEuYXouYi5yZW5kZXJlZDtnLnpNb2F0U2xvdFRhcmdldGluZ0xvYWRlZD1hLmF6LmIuc2xvdFRhcmdldGluZ0xvYWRlZDtnLnpNb2F0U2xvdFRhcmdldGluZ1NldD1hLmF6LmIuc2xvdFRhcmdldGluZ1NldDtnLnpNb2F0UGFnZURhdGFUYXJnZXRpbmdTZXQ9YS5hei5iLnBhZ2VEYXRhVGFyZ2V0aW5nU2V0O2cuek1vYXRTYWZldHlUYXJnZXRpbmdTZXQ9YS5hei5iLnNhZmV0eVRhcmdldGluZ1NldDtnLnpNb2F0RW1wdHlTbG90PWEuYXouYi5lbXB0eVNsb3Q7Zj1hLmF6LmEud3JhcHBlcjt2YXIgaD1hLmF6LmEubmFkb0RhdGE7ZD1hLmF6LmEuYWxsRGF0YTtnLnpNb2F0TmFkb0RhdGFMb2FkVGltZT1oJiZoLWZ8fCJOb3QgTG9hZGVkIjtnLnpNb2F0QWxsRGF0YUxvYWRUaW1lPWQmJmQtZnx8Ik5vdCBMb2FkZWQiO2EuYXouYS5uYWRvUmVzcG9uc2VFbmQmJmEuYXouYS5uYWRvUmVzcG9uc2VFeGVjdXRpb24mJihnLnpNb2F0Tkw9YS5hei5hLm5hZG9SZXNwb25zZUV4ZWN1dGlvbi1hLmF6LmEubmFkb1Jlc3BvbnNlRW5kKTtnLmJvPWI7Zy5iZD1lO2cuYWM9MTtnLmJxPWEuYy5uO2cuZj1OdW1iZXIoIWthKTsoZj13aW5kb3cubW9hdFByZWJpZEFwaSkmJiJmdW5jdGlvbiI9PT10eXBlb2YgZi5zbG90RGF0YUF2YWlsYWJsZSYmKGcuem49Zi5zbG90RGF0YUF2YWlsYWJsZSgpPzE6MCk7ZD1kJiZkLWEuYy5iajthLmEuZGIoZCkmJihnWyJpZiJdPWQpO2Q9YS5hLmN1KGcsITApO2QrPSImbmE9IithLmEuY3coZCxnLmkpO3IueWgueWkoZCsiJmNzPTAiLFcsbnVsbCwhMCl9OyhmdW5jdGlvbigpe2EuYW4uZyhmdW5jdGlvbigpe2EuYS5mb3JFYWNoKGwsZnVuY3Rpb24oYixjKXthLmFuLm8oYixwLmEpfSl9KX0pKCk7dmFyIHU9YS5mLnIoITApO3UudXJsPWEuYy5iYTt1LnBjb2RlPSJyZXV0ZXJzaGVhZGVyMTk0ODgzNTUyMDI0Ijt1PWEuYS5jdSh1LCEwKTthLmFrLmEoIm5hZG8tYWxsIiwiTW9hdE5hZG9BbGxKc29ucFJlcXVlc3QiLCJodHRwczovL21iLm1vYXRhZHMuY29tL3lpL3YyPyIrdSl9KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhjLGIpe3ZhciBkPWMuc2xvdCxmPSJmdW5jdGlvbiI9PT10eXBlb2YgZC5nZXRBZFVuaXRQYXRoJiZkLmdldEFkVW5pdFBhdGgoKSxnPWEuYXAuYyhhLmEuY2MoKSxiKTtnfHwoZz17fSxnLl9BRF9GT1JNQVQ9YixhLmFwLmYoZykpO2cudHJhY2tlZEZyb21EZnBIZWFkZXJUYWc9ITA7Zy5kZnBBZElkPWQuZ2V0U2xvdEVsZW1lbnRJZCgpO2cuc2xvdE1hcHBpbmdJZD0iZnVuY3Rpb24iPT09dHlwZW9mIGQuZ2V0U2xvdElkJiZkLmdldFNsb3RJZCgpLmdldElkKCk7Zy5tb2F0Q2xpZW50TGV2ZWwxPWMuYWR2ZXJ0aXNlcklkfHwiIjtnLm1vYXRDbGllbnRMZXZlbDI9Yy5jYW1wYWlnbklkfHwiIjtnLm1vYXRDbGllbnRMZXZlbDM9Yy5saW5lSXRlbUlkfHxjLnNvdXJjZUFnbm9zdGljTGluZUl0ZW1JZHx8IiI7Zy5tb2F0Q2xpZW50TGV2ZWw0PWMuY3JlYXRpdmVJZHx8Yy5zb3VyY2VBZ25vc3RpY0NyZWF0aXZlSWR8fCIiO2EuYS5mb3JFYWNoKFsibW9hdENsaWVudExldmVsMSIsIm1vYXRDbGllbnRMZXZlbDIiLCJtb2F0Q2xpZW50TGV2ZWwzIiwibW9hdENsaWVudExldmVsNCJdLGZ1bmN0aW9uKGIpe2EuYS5kYihnW2JdKSYmKGdbYl09Z1tiXS50b1N0cmluZygpKX0pO2cuZGZwSGVhZGVyU2xvdHN8fChnLmRmcEhlYWRlclNsb3RzPXt9KTt2YXIgaz1bInR5cGUiLCJkaXZfaWQiXTtrJiYwPGsubGVuZ3RoJiZhLmEuZm9yRWFjaChrLGZ1bmN0aW9uKGIpe3ZhciBjPWEuYW4ucihkLGIpO2MmJmEuYS5mKGMpJiYwPGMubGVuZ3RoP2cuZGZwSGVhZGVyU2xvdHNbInpNb2F0IitiXT1jOmcuZGZwSGVhZGVyU2xvdHNbInpNb2F0IitiXT0iLSJ9KTsic3RyaW5nIj09PXR5cGVvZiBmJiYoaz0iLyI9PWZbMF0/MjoxLGY9Zi5zcGxpdCgiLyIpLnNsaWNlKGspLGs9ZltmLmxlbmd0aC0xXSxnLm1vYXRDbGllbnRTbGljZXIxPWZbMF18fCIiLGcubW9hdENsaWVudFNsaWNlcjI9a3x8IiIsYS5hLmZvckVhY2goZixmdW5jdGlvbihhLGIpe2dbInpNb2F0QWRVbml0IisoYisxKV09YX0pKTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7dmFyIGQ9YSYmYVtiXTtyZXR1cm4gZCYmZC50b1N0cmluZz9kLnRvU3RyaW5nKCk6IiJ9ZnVuY3Rpb24gZihjLGIsZSl7Yz1jfHx7fTtjPVt7d2hpdGVsaXN0VmFsdWVzOlsiODIwMDU3NDU2NTc2Mjg3NCIsIjIwMDY1NjMyIl0saWQ6ZChjLCJhZHZlcnRpc2VySWQiKSx6bW9hdDoiek1vYXRERlBBZElkcyJ9LHtpZDpkKGMsInNvdXJjZUFnbm9zdGljTGluZUl0ZW1JZCIpLHptb2F0OiJ6TW9hdERGUExpbmVJdGVtSWRzIn0se2lkOmQoYywiY2FtcGFpZ25JZCIpLHptb2F0OiJ6TW9hdERGUE9yZGVySWRzIn1dO2lmKGEuYS5zb21lKGMsZnVuY3Rpb24oYyl7aWYoIWMuaWQpcmV0dXJuITE7dmFyIGQ9YltjLnptb2F0XSYmYltjLnptb2F0XS5zcGxpdCgiOiIpfHxbXTtjLndoaXRlbGlzdFZhbHVlcyYmYy53aGl0ZWxpc3RWYWx1ZXMubGVuZ3RoJiYoZD1kLmNvbmNhdChjLndoaXRlbGlzdFZhbHVlcykpO3JldHVybiBhLmEuYXgoZCxjLmlkKX0pfHwiaHRtbDUiPT09Yi5fQURfRk9STUFUKXJldHVybiEwfWZ1bmN0aW9uIGcoYyl7dmFyIGI9Yy5zbG90O2lmKGImJiFjLmlzRW1wdHkpe3ZhciBkPSJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRIdG1sJiZiLmdldEh0bWwoKTtkPWQmJiJzdHJpbmciPT09dHlwZW9mIGQ/MDw9ZC5zZWFyY2goL2Jhbm5lcl9odG1sX2lucGFnZV9yZW5kZXJpbmdfbGliLipcLmpzLyk6ITE7ZD1rKGMsZD8iaHRtbDUiOiJhZHgiKTtpZihmKGMsZCxiKSYmKGEueS5iKDE3LGQpLGM9KGM9YS5hbi5kKGIpKSYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYykpKXt2YXIgYj0oYj1jLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpKSYmYi5jb250ZW50V2luZG93LGc7dHJ5e2c9IWEuZy5kKGIpJiZiLmRvY3VtZW50JiZiLmRvY3VtZW50LmJvZHkmJmIuZG9jdW1lbnQuYm9keS5jaGlsZHJlbiYmMDxiLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4ubGVuZ3RoJiZiLmRvY3VtZW50LmJvZHl9Y2F0Y2gobCl7fWd8fChnPWMpO2Eudi5jKGcsZCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxiKX19fWEuYW09e307YS5hbS5iPWZ1bmN0aW9uKCl7YS5hbi5nKGZ1bmN0aW9uKCl7YS5hbi52KCJzbG90UmVuZGVyRW5kZWQiLGcpfSl9O2EuYW0uYT1mdW5jdGlvbihjKXt2YXIgYj1hLmEuZGYoW2NdLGZ1bmN0aW9uKGIpe2EuYWMuZyhiKX0pO2EubC5jKGMuV0lORE9XLCJ1bmxvYWQiLGIsImRmcGhlYWQtdW5sb2FkIil9O2Euay5hLmF6c3goImFkS2lsbGVkIixmdW5jdGlvbihjKXtjJiYhYy5lcCYmYS5sLmQoYy5XSU5ET1csInVubG9hZCIsbnVsbCwiZGZwaGVhZC11bmxvYWQiKX0pfSkodSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGsoYyl7YyYmKGEuYy5heC5ifHwoYS5jLmF4LmI9ITAsci5kY3N4JiZyLmRjc3gueW5kcyh3aW5kb3csImRldmljZW9yaWVudGF0aW9uIiwiZGV2aWNlb3JpZW50YXRpb24tIithLmMuYXguYSwiZGV2aWNlb3JpZW50YXRpb25GbiIrYS5jLmF4LmEpKSxofHwoaD0hMCxyLnN3ZGUuYXpzeCgiZGV2aWNlb3JpZW50YXRpb24tIithLmMuYXguYSxmKSksYi5oYXNPd25Qcm9wZXJ0eShjLnpyKXx8KGJbYy56cl09bmV3IGcpKX1mdW5jdGlvbiBkKGEpe2EmJmRlbGV0ZSBiW2EuenJdfWZ1bmN0aW9uIGYoYSl7dmFyIGM9QS5ub3coKSxkPSExOzIwMDxjLWUmJihlPWMsZD0hMCk7Zm9yKHZhciBmIGluIEIpQi5oYXNPd25Qcm9wZXJ0eShmKSYmYi5oYXNPd25Qcm9wZXJ0eShmKSYmKGM9YltmXSwxNTAwPmMuZXZlbnRzQ291bnQmJihjLmV2ZW50c0NvdW50Kz0xLGQmJmMuaGFuZGxlT3JpZW50YXRpb25FdmVudChhKSkpfWZ1bmN0aW9uIGcoKXt0aGlzLnZhbGlkRXZlbnRzSGFuZGxlZENvdW50PXRoaXMuZXZlbnRzSGFuZGxlZENvdW50PXRoaXMuZXZlbnRzQ291bnQ9MDt0aGlzLmFscGhhPW5ldyBjKDAsMzYwKTt0aGlzLmJldGE9bmV3IGMoLTE4MCwxODApO3RoaXMuZ2FtbWE9bmV3IGMoLTkwLDkwKX1mdW5jdGlvbiBjKGEsYil7dGhpcy5taW5FeHBlY3RlZFZhbD1hO3RoaXMubWF4RXhwZWN0ZWRWYWw9Yjt0aGlzLm5vcm1hbGl6ZWRNYXg9dy5hYnModGhpcy5taW5FeHBlY3RlZFZhbCkrdGhpcy5tYXhFeHBlY3RlZFZhbDt0aGlzLnJhbmdlUmlnaHQ9dGhpcy5yYW5nZUxlZnQ9dGhpcy5vcmlnaW49bnVsbH1hLmFyPXt9O3ZhciBiPXt9LGU9MCxoPSExO2cucHJvdG90eXBlLmlzVmFsaWRFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4hYS5hbHBoYSYmMCE9PWEuYWxwaGF8fCFhLmJldGEmJjAhPT1hLmJldGF8fCFhLmJldGEmJjAhPT1hLmJldGF8fDA9PT1hLmFscGhhJiYwPT09YS5iZXRhJiYwPT1hLmdhbW1hPyExOiEwfTtnLnByb3RvdHlwZS5oYW5kbGVPcmllbnRhdGlvbkV2ZW50PWZ1bmN0aW9uKGEpe3RoaXMuZXZlbnRzSGFuZGxlZENvdW50Kz0xO3RoaXMuaXNWYWxpZEV2ZW50KGEpJiYodGhpcy52YWxpZEV2ZW50c0hhbmRsZWRDb3VudCs9MSx0aGlzLmFscGhhLmFkZFZhbHVlKGEuYWxwaGEpLHRoaXMuYmV0YS5hZGRWYWx1ZShhLmJldGEpLHRoaXMuZ2FtbWEuYWRkVmFsdWUoYS5nYW1tYSkpfTtjLnByb3RvdHlwZS5pc091dHNpZGVSYW5nZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yYW5nZUxlZnQ+dGhpcy5yYW5nZVJpZ2h0P3RoaXMucmFuZ2VMZWZ0PmEmJmE+dGhpcy5yYW5nZVJpZ2h0OmE8dGhpcy5yYW5nZUxlZnR8fGE+dGhpcy5yYW5nZVJpZ2h0fTtjLnByb3RvdHlwZS5leHRlbmRSYW5nZT1mdW5jdGlvbihhKXt0aGlzLmlzT3V0c2lkZVJhbmdlKGEpJiYoKGE8dGhpcy5yYW5nZUxlZnQ/dGhpcy5yYW5nZUxlZnQtYTp0aGlzLnJhbmdlTGVmdCt0aGlzLm5vcm1hbGl6ZWRNYXgtYSk8PShhPnRoaXMucmFuZ2VSaWdodD9hLXRoaXMucmFuZ2VSaWdodDp0aGlzLm5vcm1hbGl6ZWRNYXgtdGhpcy5yYW5nZVJpZ2h0K2EpP3RoaXMucmFuZ2VMZWZ0PWE6dGhpcy5yYW5nZVJpZ2h0PWEpfTtjLnByb3RvdHlwZS5hZGRWYWx1ZT1mdW5jdGlvbihhKXt2YXIgYj1hK3cuYWJzKHRoaXMubWluRXhwZWN0ZWRWYWwpO251bGw9PT10aGlzLm9yaWdpbj8odGhpcy5vcmlnaW49YS50b0ZpeGVkKDMpLHRoaXMucmFuZ2VSaWdodD10aGlzLnJhbmdlTGVmdD1iKTp0aGlzLmV4dGVuZFJhbmdlKGIpfTtjLnByb3RvdHlwZS5nZXRSYW5nZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5vcmlnaW4/LTE6dGhpcy5yYW5nZVJpZ2h0Pj10aGlzLnJhbmdlTGVmdD8odGhpcy5yYW5nZVJpZ2h0LXRoaXMucmFuZ2VMZWZ0KS50b0ZpeGVkKDMpOih0aGlzLm5vcm1hbGl6ZWRNYXgtdGhpcy5yYW5nZUxlZnQrdGhpcy5yYW5nZVJpZ2h0KS50b0ZpeGVkKDMpfTthLmFyLmE9ZnVuY3Rpb24oYSl7dmFyIGM9e307YlthXSYmKGE9YlthXSxjPXtvZTpbYS5ldmVudHNDb3VudCxhLmV2ZW50c0hhbmRsZWRDb3VudCxhLnZhbGlkRXZlbnRzSGFuZGxlZENvdW50LGEuYWxwaGEub3JpZ2luP2EuYWxwaGEub3JpZ2luOiJudWxsIixhLmFscGhhLmdldFJhbmdlTGVuZ3RoKCksYS5iZXRhLm9yaWdpbj9hLmJldGEub3JpZ2luOiJudWxsIixhLmJldGEuZ2V0UmFuZ2VMZW5ndGgoKSxhLmdhbW1hLm9yaWdpbj9hLmdhbW1hLm9yaWdpbjoibnVsbCIsYS5nYW1tYS5nZXRSYW5nZUxlbmd0aCgpXS5qb2luKCI6Iil9KTtyZXR1cm4gY307YS5jLmUuRGV2aWNlT3JpZW50YXRpb25FdmVudCYmKGEuay5hLmF6c3goImFkSW5pdGlhbGl6ZWQiLGspLGEuay5hLmF6c3goImFkS2lsbGVkIixkKSxhLmsuYS5henN4KCJhbGxMb2NhbEFkc0tpbGxlZCIsZnVuY3Rpb24oKXtyJiZyLmRjc3gmJnIuZGNzeC5lbmduJiZyLmRjc3guZW5nbih7bGlzdGVuZXJOYW1lOiJkZXZpY2VvcmllbnRhdGlvbkZuIithLmMuYXguYX0pO3Iuc3dkZS5zeGF6KCJkZXZpY2VvcmllbnRhdGlvbi0iK2EuYy5heC5hLHtjYWxsYmFjazpmfSk7Yj17fTtoPWEuYy5heC5iPSExfSkpfSkodSk7KGZ1bmN0aW9uKGEpe2EuYmE9e307YS5iYS5hPSExO2EuYmEuYj1mdW5jdGlvbihrKXtrJiZrLnpNb2F0RU5WJiYieCI9PT1rLnpNb2F0RU5WJiYoYS5iYS5hPSEwKX19KSh1KTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaygpe2EubC5sKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yi5zcmM9Imh0dHBzOi8vei5tb2F0YWRzLmNvbS9oZDA5ODI0MDkyL2lmcmFtZS5odG1sI2hlYWRlcj0xIjtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Iuc3R5bGUud2lkdGg9IjBweCI7Yi5zdHlsZS5oZWlnaHQ9IjBweCI7Yi53aWR0aD0iMCI7Yi5oZWlnaHQ9IjAiO2Iuc2V0QXR0cmlidXRlKCJuYW1lIiwicmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNF9NT0FUX0lGUkFNRSIpO2EuYS5jbChiLHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpfSkoKX1mdW5jdGlvbiBkKGIpe2lmKGImJiJzdHJpbmciPT09dHlwZW9mIGIpe3ZhciBjPWEuZi5hKFsxOSw0LDE4LDE5LDUzXSk7LTEhPT0iUkVVVEVSU19IRUFERVIxIi5pbmRleE9mKGMpJiYoYj1hLmEuZHkoYixjKSk7cmV0dXJuIGJ9fWZ1bmN0aW9uIGYoZil7aWYoZiYmZi5tc2dEYXRhJiYic3RyaW5nIj09PXR5cGVvZiBmLm1zZ0RhdGEuZGF0YSl7dmFyIGc9Zi5tc2dEYXRhLmRhdGEuc3BsaXQoIkBAQCIpO2lmKDI9PT1nLmxlbmd0aCl7dmFyIGc9e2NsYXNzTmFtZTpkZWNvZGVVUklDb21wb25lbnQoZ1swXSksc3JjOmRlY29kZVVSSUNvbXBvbmVudChnWzFdKSxwYXJlbnROb2RlOntpbm5lckhUTUw6IiJ9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3MiPT09YT90aGlzLmNsYXNzTmFtZTp0aGlzW2FdfHwiIn0sdHJhY2tlZEZyb21TbG90VGFnOiEwfSxrPWEuYXAuYyhnLCJmZWF0aGVyIil8fHt9O2suc2xpPWQoay5zbGkpO2suX0FEX0ZPUk1BVD0iZmVhdGhlciI7YS5iYS5iKGspO2lmKGEuYmEuYSlhLmJhLmE9ITE7ZWxzZXthLnkuYigxNyxrKTt2YXIgdD1iKGYuc291cmNlKTthLmwuayhmdW5jdGlvbigpe3ZhciBiO2I6aWYodClmb3IodmFyIGQ9dC5sZW5ndGgtMTswPD1kO2QtLSl7dmFyIGY9dFtkXTtpZihmIT09Zi50b3Ape3ZhciBnPWEuZy5iKG51bGwsZik7aWYoZyl7aWYoYS5hLmJ0KGcpKXtiPWc7Y29udGludWV9YnJlYWt9Zz1jKGYpO2lmKGEuYS5idChnKSl7Yj1nO2JyZWFrIGJ9YnJlYWt9fWVsc2UgYj12b2lkIDA7Yj8oay5hZEZpbmRpbmdNZXRob2Q9Im1vYXQgc2xvdCB0YWciLGsudHJhY2tlZEZyb21TbG90VGFnPSEwLGUodCxrKSxhLmQuZihiLGIubm9kZU5hbWUsITEsdm9pZCAwLGssbnVsbCksYj0hMCk6Yj0hMTtyZXR1cm4gYn0sYS52LmgsYS52LnYsZnVuY3Rpb24oKXthLnkuYigxMSxrKX0pfX19fWZ1bmN0aW9uIGcoYyxmKXtmPWZ8fHt9O2lmKGMmJmMuc3JjJiYic3RyaW5nIj09PXR5cGVvZiBjLm5vZGVOYW1lKXtjLnRyYWNrZWRGcm9tU2xvdFRhZz0hMDt2YXIgZz1hLmFwLmMoYywiZmVhdGhlciIpfHx7fTtnLnRyYWNrZWRGcm9tU2xvdFRhZz0hMDtnLl9BRF9GT1JNQVQ9ImZlYXRoZXIiO2YuYWx0S2V5JiYoZy5hbHRLZXk9Zi5hbHRLZXkpO2cuc2xpPWQoZi5zbGkpO2cudXNlU2xvdElrZXk9Zi51c2VTbG90SWtleTt2YXIgaz1hLmEuYmUoYyksaz1iKGspO2UoayxnKTthLmJhLmIoZyk7aWYoYS5iYS5hKWEuYmEuYT0hMTtlbHNle2EueS5iKDE3LGcpO3ZhciBrPWEuYS5iaChjKSxxPWEuYS5iZShjKTthLnYuYyhrLGcsbnVsbCxudWxsLG51bGwscSl9fX1mdW5jdGlvbiBjKGIpe3ZhciBjO3RyeXtjPWIucGFyZW50LmRvY3VtZW50fWNhdGNoKGQpe3JldHVybiBudWxsfXJldHVybiBhLmcuZihjLGIpfWZ1bmN0aW9uIGIoYil7aWYoIWIpcmV0dXJuITE7dmFyIGM9YS5nLmsoYiwyNSk7Yy51bnNoaWZ0KGIpO3JldHVybiBjfWZ1bmN0aW9uIGUoYixkKXtpZighYnx8IWEuYS5mKGIpKXJldHVybiExO2Zvcih2YXIgZT1iLmxlbmd0aC0xOzA8PWU7ZS0tKXt2YXIgZj1iW2VdO2lmKGYudG9wIT09ZiYmKGY9YS5nLmIobnVsbCxmKXx8YyhmKSxmPWEuYW4ueChmKSwic3RyaW5nIj09PXR5cGVvZiBmKSlyZXR1cm4gZCYmKGQuc2xvdE1hcHBpbmdJZD1mKSxmfXJldHVybiExfWEuYmI9e307YS5iYi5hPWZ1bmN0aW9uKCl7aygpO2EuYXcubCgic2NyaXB0Zm91bmRyZXV0ZXJzaGVhZGVyMTk0ODgzNTUyMDI0IixhLmwubChmKSk7d2luZG93Ll9fbW9hdFNsb3RUYWdMb2FkZWRyZXV0ZXJzaGVhZGVyMTk0ODgzNTUyMDI0PWEubC5sKGcpfX0pKHUpOyhmdW5jdGlvbihhKXthLmFxPXt9O2EuYXEuYT1mdW5jdGlvbigpe3ZhciBrPWEuZy5hKCksZD1bIi0iLCItIiwiLSIsIi0iLCItIl07aWYoIWt8fCFrLnBlcmZvcm1hbmNlKXJldHVybiExO3ZhciBmPWsucGVyZm9ybWFuY2U7aWYoIWZ8fCJmdW5jdGlvbiIhPT10eXBlb2YgZi5nZXRFbnRyaWVzQnlUeXBlKXJldHVybiExO2RbMF09az09PXdpbmRvdy50b3A/MTowO2Zvcih2YXIgZz1mLmdldEVudHJpZXNCeVR5cGUoInBhaW50IiksYz0wO2M8Zy5sZW5ndGg7YysrKWs9Z1tjXSwiZmlyc3QtcGFpbnQiPT09ay5uYW1lJiYoZFsxXT13LnJvdW5kKGsuc3RhcnRUaW1lKSksImZpcnN0LWNvbnRlbnRmdWwtcGFpbnQiPT09ay5uYW1lJiYoZFsyXT13LnJvdW5kKGsuc3RhcnRUaW1lKSk7Zj1mLmdldEVudHJpZXNCeVR5cGUoIm5hdmlnYXRpb24iKTswPGYubGVuZ3RoJiYoaz1mWzBdLCJkdXJhdGlvbiJpbiBrJiYoZFszXT13LnJvdW5kKGsuZHVyYXRpb24pKSwiZG9tSW50ZXJhY3RpdmUiaW4gayYmKGRbNF09dy5yb3VuZChrLmRvbUludGVyYWN0aXZlKSkpO3JldHVybiBkLmpvaW4oIjoiKX19KSh1KTt1LmsuYS56YXhzKCJtb2R1bGVzUmVhZHkiLHIpO3ZhciBFYT11LmZvY3VzLnBhZ2VJc1Zpc2libGUoKTt1LmMuZXY9MT09d2luZG93Lmhpc3RvcnkubGVuZ3RoJiYhRWEmJih1LmMuYyYmIiIhPWRvY3VtZW50LnJlZmVycmVyfHwhdS5jLmMpO3UuYy5qfHx1LmMuYWx8fHUuYy5kdygpOyh1LmMuaiYmdS5jLmVnKCl8fCJkdW1teS51cmwiPT09dS5hLmFvKCkpJiZ1LmMuZHcoKTt2YXIgRD0ibW9hdEZvdW5kUkVVVEVSU19IRUFERVIxIixNPSJfX21vYXRfX1JFVVRFUlNfSEVBREVSMSI7dS5jLmFtKCkuaXNJbkFwcHx8dS5hbC5mKCk7dmFyIEw9dS5hLmNjKCk7Vz0iaHR0cHM6Ly9weC5tb2F0YWRzLmNvbSI7dS5hdS5hKHdhKTt2YXIgRmE9ZnVuY3Rpb24oKXtyLnpzJiZyLmRjc3gmJihyLmRjc3guZW5nbih7bGlzdGVuZXJOYW1lOiJ1bmxvYWRGbiIrdS5jLmF4LmF9KSxyLmRjc3guZW5nbih7bGlzdGVuZXJOYW1lOiJiZWZvcmV1bmxvYWRGbiIrdS5jLmF4LmF9KSk7amF8fChqYT0hMCx1LmQuYigpKX07dS5hLmFvKCk7dS5hei5lKDE3KTt1LnAuaSh1LmMuYXguYSx1LmMuYXopO3Uuay5hLmF6c3goInRyYWNraW5nUmVhZHkiLHZhLHtvbmNlOiEwfSk7dS5rLmEuemF4cygidHJhY2tpbmdSZWFkeSIpfSkoRGF0ZSxNYXRoKX1jYXRjaChBKXt2YXIgY3Q9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93WyJNb2F0I0VUUyJdfHwod2luZG93WyJNb2F0I0VUUyJdPWN0KTt3aW5kb3dbIk1vYXQjRU1DIl18fCh3aW5kb3dbIk1vYXQjRU1DIl09MCk7dmFyIGV0PWN0LXdpbmRvd1siTW9hdCNFVFMiXSxob3VyRWxhcHNlZD0zNmU1PD1ldCxtc2c9QS5uYW1lKyIgaW4gY2xvc3VyZSAoZ2xvYmFsKTogIitBLm1lc3NhZ2UrIiwgc3RhY2s9IitBLnN0YWNrO2lmKCFob3VyRWxhcHNlZCYmMTA+d2luZG93WyJNb2F0I0VNQyJdKXt3aW5kb3dbIk1vYXQjRU1DIl0rKzt0cnl7dmFyIHBpeGVsRG9tYWluPSJweC5tb2F0YWRzLmNvbSIsaXNEb21sZXNzPSJ1bmRlZmluZWQiIT09dHlwZW9mIG9taWROYXRpdmUmJigidW5kZWZpbmVkIj09PXR5cGVvZiBJbWFnZXx8SW1hZ2UmJkltYWdlLl9Nb2F0UHJveHlPZiksZG9jdW1lbnRSZWZlcnJlcj1pc0RvbWxlc3M/IiI6ZG9jdW1lbnQucmVmZXJyZXIsaXNCZXRhPSExLHZpZXdIYXNoPSJ1bmRlZmluZWQiPT09dHlwZW9mIEFEX1ZJRVdfSEFTSD9pc0JldGE/IlJFVVRFUlNfSEVBREVSMV9CRVRBIjoiUkVVVEVSU19IRUFERVIxIjpBRF9WSUVXX0hBU0gsdGFnVHlwZT0idW5kZWZpbmVkIiE9PXR5cGVvZiBNb2F0JiZNb2F0LmMmJk1vYXQuYy5uP01vYXQuYy5uOiIiLHB4U3JjPSJodHRwczovLyIrcGl4ZWxEb21haW4rIi9waXhlbC5naWY/ZT0yNCZkPWRhdGElM0FkYXRhJTNBZGF0YSUzQWRhdGEmaT0iK2VzY2FwZSh2aWV3SGFzaCkrIiZhYz0xJms9Iitlc2NhcGUobXNnKSsiJmFyPSIrZXNjYXBlKCIyOWFkNTlkLWNsZWFuIikrIiZpdz0iK2VzY2FwZSgiMzFkNjk2NSIpKyImYnE9Iitlc2NhcGUodGFnVHlwZSkrIiZqPSIrZXNjYXBlKGRvY3VtZW50UmVmZXJyZXIpKyImY3M9IisobmV3IERhdGUpLmdldFRpbWUoKTtpZihpc0RvbWxlc3Mpb21pZE5hdGl2ZS5zZW5kVXJsKHB4U3JjKTtlbHNle3ZhciBtb2F0X3B4PW5ldyBJbWFnZSgxLDEpO21vYXRfcHguc3JjPXB4U3JjfX1jYXRjaCh3KXt9fWVsc2UgaWYoaG91ckVsYXBzZWQpe3dpbmRvd1siTW9hdCNFTUMiXT0xO3dpbmRvd1siTW9hdCNFVFMiXT1jdDt0cnl7cGl4ZWxEb21haW49InB4Lm1vYXRhZHMuY29tIixkb2N1bWVudFJlZmVycmVyPShpc0RvbWxlc3M9InVuZGVmaW5lZCIhPT10eXBlb2Ygb21pZE5hdGl2ZSYmKCJ1bmRlZmluZWQiPT09dHlwZW9mIEltYWdlfHxJbWFnZSYmSW1hZ2UuX01vYXRQcm94eU9mKSk/IiI6ZG9jdW1lbnQucmVmZXJyZXIsaXNCZXRhPSExLHZpZXdIYXNoPSJ1bmRlZmluZWQiPT09dHlwZW9mIEFEX1ZJRVdfSEFTSD9pc0JldGE/IlJFVVRFUlNfSEVBREVSMV9CRVRBIjoiUkVVVEVSU19IRUFERVIxIjpBRF9WSUVXX0hBU0gsdGFnVHlwZT0idW5kZWZpbmVkIiE9PXR5cGVvZiBNb2F0JiZNb2F0LmMmJk1vYXQuYy5uP01vYXQuYy5uOiIiLHB4U3JjPSJodHRwczovLyIrcGl4ZWxEb21haW4rIi9waXhlbC5naWY/ZT0yNCZkPWRhdGElM0FkYXRhJTNBZGF0YSUzQWRhdGEmaT0iK2VzY2FwZSh2aWV3SGFzaCkrIiZhYz0xJms9Iitlc2NhcGUobXNnKSsiJmFyPSIrZXNjYXBlKCIyOWFkNTlkLWNsZWFuIikrIiZpdz0iK2VzY2FwZSgiMzFkNjk2NSIpKyImYnE9Iitlc2NhcGUodGFnVHlwZSkrIiZqPSIrZXNjYXBlKGRvY3VtZW50UmVmZXJyZXIpKyImY3M9IisobmV3IERhdGUpLmdldFRpbWUoKSxpc0RvbWxlc3M/b21pZE5hdGl2ZS5zZW5kVXJsKHB4U3JjKToobW9hdF9weD1uZXcgSW1hZ2UoMSwxKSxtb2F0X3B4LnNyYz1weFNyYyl9Y2F0Y2godyl7fX19fSkoKX0K"}] \ No newline at end of file diff --git a/filter_lists/default.json b/filter_lists/default.json index 2ddc4a25..a716daaa 100644 --- a/filter_lists/default.json +++ b/filter_lists/default.json @@ -110,5 +110,12 @@ "title": "Brave Android-Specific Rules", "format": "Standard", "support_url": "https://github.com/brave/adblock-lists" + }, + { + "uuid": "b0433353-1144-473c-8e25-19fb035024b7", + "url": "https://raw.githubusercontent.com/brave/adblock-lists/master/brave-lists/brave-sugarcoat.txt", + "title": "SugarCoat Rules", + "format": "Standard", + "support_url": "https://github.com/brave-experiments/sugarcoat-pipeline" } ] diff --git a/generateMetadataJsonFromScriptResources.js b/generateMetadataJsonFromScriptResources.js new file mode 100644 index 00000000..e6748632 --- /dev/null +++ b/generateMetadataJsonFromScriptResources.js @@ -0,0 +1,20 @@ +const fs = require("fs"); +const path = require("path"); + +const metadataJsonFile = "metadata.json"; +const resourcesDir = "resources"; + +console.debug(`Creating ${metadataJsonFile}...`); +const resources = fs.readdirSync(resourcesDir); +const metadataList = resources.map((file) => { + return { + name: path.basename(file, ".js"), + aliases: [], + kind: { mime: "application/javascript" }, + resourcePath: path.basename(file), + }; +}); + +console.debug(`Writing ${metadataJsonFile}... `); +// Pretty print out +fs.writeFileSync(metadataJsonFile, JSON.stringify(metadataList, null, 4)); diff --git a/metadata.json b/metadata.json index 0d4f101c..40e082d5 100644 --- a/metadata.json +++ b/metadata.json @@ -1,2 +1,66 @@ [ -] + { + "name": "sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min.js" + }, + { + "name": "sugarcoat-analytics-a14946c73def6bdaa93155f58435a82e.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-analytics-a14946c73def6bdaa93155f58435a82e.min.js" + }, + { + "name": "sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js" + }, + { + "name": "sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min.js" + }, + { + "name": "sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min.js" + }, + { + "name": "sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min-7754fade75bed02e4097bf3d7fff178c.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min-7754fade75bed02e4097bf3d7fff178c.min.js" + }, + { + "name": "sugarcoat-launch-ENbb9d0de7cc374dc99259df2c4b823cef.min-2eb9609b74432d652877d41a51a8d2ba.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-launch-ENbb9d0de7cc374dc99259df2c4b823cef.min-2eb9609b74432d652877d41a51a8d2ba.min.js" + }, + { + "name": "sugarcoat-moatheader-7754008b0da848856cddb20094976335.min", + "aliases": [], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-moatheader-7754008b0da848856cddb20094976335.min.js" + } +] \ No newline at end of file diff --git a/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min.js b/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min.js new file mode 100644 index 00000000..31d9b648 --- /dev/null +++ b/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min-b2d095f00aca850075d265f4a81c8fb7.min.js @@ -0,0 +1 @@ +var fdx_initSCVars,fdx_debug,fdx_setCookie,fdx_getCookie,fdx_campaign,fdx_gup,fdx_fireSDotT,fdx_fireSDotTL,fdx_spSrch,logLinkView,fdx_logLinkView,setLinkView,fdx_setLinkView,fdx_getLinkView,fdx_linkFormat,fdx_trackMapping,fdx_logDownload,logPageView,fdx_logPageView,logPurchase,fdx_logPurchase,fdx_logPurchaseMAGS,isObject,fdx_logPurchase_PageLevel,fdx_logPurchaseMAGR,fdx_logPurchaseWREG,processData,fdx_convertToStr,fdx_logChat,s_doPlugins,fdx_initPlugins,AppMeasurement_Module_Integrate,AppMeasurement_Module_AudienceManagement,AppMeasurement_Module_ActivityMap,AppMeasurement,s_gi,s_pgicq,fdx_runSCode,fdx_initSCode,fdx_createCustomEvent,fdx_dispatchCustomEvent,fdx_fireCustomEvent,MAGSEvarMapping;{const $___mock_c7caec501dca2387={};(exports=>{"use strict";let isSealed=false;class Storage{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}}get length(){return Object.keys(this).length}key(index){const keys=Object.keys(this);if(index<0||index>=keys.length){return null}return keys[index]}getItem(key){return Object.prototype.hasOwnProperty.call(this,key)?this[key]:null}setItem(key,value){this[key]=String(value)}removeItem(key){delete this[key]}clear(){const keys=Object.keys(this);for(const key of keys){delete this[key]}}}exports.Storage={configurable:true,enumerable:true,value:Storage,writable:true};const localStorage=new Storage;exports.localStorage={configurable:true,enumerable:true,get(){return localStorage}};const sessionStorage=new Storage;exports.sessionStorage={configurable:true,enumerable:true,get(){return sessionStorage}};isSealed=true})($___mock_c7caec501dca2387);const $___mock_f8e9a6d6172a3144={};(exports=>{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_f8e9a6d6172a3144);(function(){fdx_initSCVars=$___var_10ff31349d6e6ecc;({}).constructor.defineProperty(fdx_initSCVars,"name",{configurable:true,enumerable:false,value:"fdx_initSCVars",writable:false});fdx_debug=$___var_736976d373e99987;({}).constructor.defineProperty(fdx_debug,"name",{configurable:true,enumerable:false,value:"fdx_debug",writable:false});fdx_setCookie=$___var_c8185a8c04ff5cc5;({}).constructor.defineProperty(fdx_setCookie,"name",{configurable:true,enumerable:false,value:"fdx_setCookie",writable:false});fdx_getCookie=$___var_4b36f2e57ae588b3;({}).constructor.defineProperty(fdx_getCookie,"name",{configurable:true,enumerable:false,value:"fdx_getCookie",writable:false});fdx_campaign=$___var_3e58ad61bf25697b;({}).constructor.defineProperty(fdx_campaign,"name",{configurable:true,enumerable:false,value:"fdx_campaign",writable:false});fdx_gup=$___var_816f4d070af00078;({}).constructor.defineProperty(fdx_gup,"name",{configurable:true,enumerable:false,value:"fdx_gup",writable:false});fdx_fireSDotT=$___var_0e30bdafb57c5e6c;({}).constructor.defineProperty(fdx_fireSDotT,"name",{configurable:true,enumerable:false,value:"fdx_fireSDotT",writable:false});fdx_fireSDotTL=$___var_0828c18ac3e1a798;({}).constructor.defineProperty(fdx_fireSDotTL,"name",{configurable:true,enumerable:false,value:"fdx_fireSDotTL",writable:false});fdx_spSrch=$___var_5387c06d0e2d7fa6;({}).constructor.defineProperty(fdx_spSrch,"name",{configurable:true,enumerable:false,value:"fdx_spSrch",writable:false});logLinkView=$___var_3e31cbb76ddcac60;({}).constructor.defineProperty(logLinkView,"name",{configurable:true,enumerable:false,value:"logLinkView",writable:false});fdx_logLinkView=$___var_bbdf365d789959b7;({}).constructor.defineProperty(fdx_logLinkView,"name",{configurable:true,enumerable:false,value:"fdx_logLinkView",writable:false});setLinkView=$___var_317cc34c4c6190d2;({}).constructor.defineProperty(setLinkView,"name",{configurable:true,enumerable:false,value:"setLinkView",writable:false});fdx_setLinkView=$___var_09ad9b275d610c1b;({}).constructor.defineProperty(fdx_setLinkView,"name",{configurable:true,enumerable:false,value:"fdx_setLinkView",writable:false});fdx_getLinkView=$___var_708f39af21cb33b7;({}).constructor.defineProperty(fdx_getLinkView,"name",{configurable:true,enumerable:false,value:"fdx_getLinkView",writable:false});fdx_linkFormat=$___var_d9daf397848e68a7;({}).constructor.defineProperty(fdx_linkFormat,"name",{configurable:true,enumerable:false,value:"fdx_linkFormat",writable:false});fdx_trackMapping=$___var_299c55932ad0a9de;({}).constructor.defineProperty(fdx_trackMapping,"name",{configurable:true,enumerable:false,value:"fdx_trackMapping",writable:false});fdx_logDownload=$___var_b98d4fcd2e1f4acc;({}).constructor.defineProperty(fdx_logDownload,"name",{configurable:true,enumerable:false,value:"fdx_logDownload",writable:false});logPageView=$___var_9da55740d3cd3d0d;({}).constructor.defineProperty(logPageView,"name",{configurable:true,enumerable:false,value:"logPageView",writable:false});fdx_logPageView=$___var_1bfbbaa58509fa95;({}).constructor.defineProperty(fdx_logPageView,"name",{configurable:true,enumerable:false,value:"fdx_logPageView",writable:false});logPurchase=$___var_59931a2e1ee9b507;({}).constructor.defineProperty(logPurchase,"name",{configurable:true,enumerable:false,value:"logPurchase",writable:false});fdx_logPurchase=$___var_a88dca13581b76c9;({}).constructor.defineProperty(fdx_logPurchase,"name",{configurable:true,enumerable:false,value:"fdx_logPurchase",writable:false});fdx_logPurchaseMAGS=$___var_85ce99bb18290254;({}).constructor.defineProperty(fdx_logPurchaseMAGS,"name",{configurable:true,enumerable:false,value:"fdx_logPurchaseMAGS",writable:false});isObject=$___var_b4c74d1df2a59429;({}).constructor.defineProperty(isObject,"name",{configurable:true,enumerable:false,value:"isObject",writable:false});fdx_logPurchase_PageLevel=$___var_91f1f803d91688f8;({}).constructor.defineProperty(fdx_logPurchase_PageLevel,"name",{configurable:true,enumerable:false,value:"fdx_logPurchase_PageLevel",writable:false});fdx_logPurchaseMAGR=$___var_b5e3cf34acf13f3c;({}).constructor.defineProperty(fdx_logPurchaseMAGR,"name",{configurable:true,enumerable:false,value:"fdx_logPurchaseMAGR",writable:false});fdx_logPurchaseWREG=$___var_992870d603806817;({}).constructor.defineProperty(fdx_logPurchaseWREG,"name",{configurable:true,enumerable:false,value:"fdx_logPurchaseWREG",writable:false});processData=$___var_643c99472783f4a2;({}).constructor.defineProperty(processData,"name",{configurable:true,enumerable:false,value:"processData",writable:false});fdx_convertToStr=$___var_29acb6ddea69c410;({}).constructor.defineProperty(fdx_convertToStr,"name",{configurable:true,enumerable:false,value:"fdx_convertToStr",writable:false});fdx_logChat=$___var_8ce62da133895ce9;({}).constructor.defineProperty(fdx_logChat,"name",{configurable:true,enumerable:false,value:"fdx_logChat",writable:false});s_doPlugins=$___var_2a8ff80ee0f3ce54;({}).constructor.defineProperty(s_doPlugins,"name",{configurable:true,enumerable:false,value:"s_doPlugins",writable:false});fdx_initPlugins=$___var_747f7ac24cff9e59;({}).constructor.defineProperty(fdx_initPlugins,"name",{configurable:true,enumerable:false,value:"fdx_initPlugins",writable:false});AppMeasurement_Module_Integrate=$___var_845956a58f0481d8;({}).constructor.defineProperty(AppMeasurement_Module_Integrate,"name",{configurable:true,enumerable:false,value:"AppMeasurement_Module_Integrate",writable:false});AppMeasurement_Module_AudienceManagement=$___var_fdcb2b5ff88cdd96;({}).constructor.defineProperty(AppMeasurement_Module_AudienceManagement,"name",{configurable:true,enumerable:false,value:"AppMeasurement_Module_AudienceManagement",writable:false});AppMeasurement_Module_ActivityMap=$___var_13822a43eeddafac;({}).constructor.defineProperty(AppMeasurement_Module_ActivityMap,"name",{configurable:true,enumerable:false,value:"AppMeasurement_Module_ActivityMap",writable:false});AppMeasurement=$___var_2df800538439b811;({}).constructor.defineProperty(AppMeasurement,"name",{configurable:true,enumerable:false,value:"AppMeasurement",writable:false});s_gi=$___var_1411bce9e2bc6b85;({}).constructor.defineProperty(s_gi,"name",{configurable:true,enumerable:false,value:"s_gi",writable:false});s_pgicq=$___var_385189dc7e558eb0;({}).constructor.defineProperty(s_pgicq,"name",{configurable:true,enumerable:false,value:"s_pgicq",writable:false});fdx_runSCode=$___var_8bf1ab7ed297b2c8;({}).constructor.defineProperty(fdx_runSCode,"name",{configurable:true,enumerable:false,value:"fdx_runSCode",writable:false});fdx_initSCode=$___var_9b2a4c2f76e73a16;({}).constructor.defineProperty(fdx_initSCode,"name",{configurable:true,enumerable:false,value:"fdx_initSCode",writable:false});function $___var_10ff31349d6e6ecc(){window.sc_code_ver="3.0.40",window.sc_code_ver_date="06152021.01",window.s_version="AM.2.22.0",window.s_account="fedexglbldev","undefined"==typeof _fdx&&_satellite.getVar("_fdxUtil"),window.wwwHost=_fdx.pcfUtil(),"www.fedex.com"==wwwHost&&(s_account=_satellite.getVar("sAccount")),window.s=s_gi(s_account),s.pageLoadComplete=!1,s.trackDownloadLinks=!0,s.trackExternalLinks=!0,s.trackInlineStats=!0,s.linkDownloadFileTypes="exe,zip,wav,mp3,mp4,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx,png",s.linkLeaveQueryString=!1,s.linkTrackVars="None",s.linkTrackEvents="None",s.usePlugins=!0,s.linkInternalFilters="javascript:,fedex.com,iamfedex.com,fedexads.designcdt.com,kinkosdev.com,kinkostest.com,senseaware.com,fedexsameday.com,fedex.p.delivery.net,fedex.co.jp,psg.kinkos.com,fedexcares.com,bongous.com",window.nltrk=""}function $___var_736976d373e99987(e,t,n){t=void 0!==t?"["+t+"] ":"",n=void 0!==n?"["+n+"] ":"",window.console&&console.log?console.log(t+n+e):window.opera&&opera.postError&&opera.postError(t+n+e);try{var i=void 0!==fdx_getCookie("fdx_debug")?fdx_getCookie("fdx_debug").split(","):[],r=_fdx.getTestLevel(),a=(new Date).getTime()+"|"+t+n+e+"|"+r+"|"+("undefined"!=typeof s&&s.pageName?s.pageName:document.location.href);i.push(a.replace(/,/g,"##")),fdx_setCookie("fdx_debug",i,1,"/",".fedex.com")}catch(o){}}function $___var_c8185a8c04ff5cc5(e,t,n,i,r){try{if(null!==t){var a=escape(t);if(""!==n){var s=new Date;s.setDate(s.getDate()+n),a+=null===n?"":"; expires="+s.toUTCString()}a+=null!=i?"; path="+i:"",a+=null!=r?"; domain="+r:"",document.cookie=e+"="+a}}catch(o){fdx_debug(o,"CIM","fdx_setCookie")}}function $___var_4b36f2e57ae588b3(e){try{for(var t,n={},i=document.cookie.split("; "),r=0;r=t&&(r+=i[a]+";");return r}function n(e,t,n){var i,r,a,s,o=this,c=new Date,l=0,u="s_pers",d="s_sess",p=0,f=0;if(c.setTime(c.getTime()-6e4),o.c_rr(e)&&o.c_wr(e,"",c),e=o.Util.urlEncode(e),-1<(a=(i=o.c_rspers()).indexOf(" "+e+"="))&&(i=i.substring(0,a)+i.substring(i.indexOf(";",a)+1),p=1),-1<(a=(r=o.c_rr(d)).indexOf(" "+e+"="))&&(r=r.substring(0,a)+r.substring(r.indexOf(";",a)+1),f=1),c=new Date,n?n.getTime()>c.getTime()&&(i+=" "+e+"="+o.Util.urlEncode(t)+"|"+n.getTime()+";",p=1):(r+=" "+e+"="+o.Util.urlEncode(t)+";",f=1),r=r.replace(/%00/g,""),i=i.replace(/%00/g,""),f&&o.c_wr(d,r,0),p){for(s=i;s&&-1!=s.indexOf(";");){var g=parseInt(s.substring(s.indexOf("|")+1,s.indexOf(";")));s=s.substring(s.indexOf(";")+1),l=ln.p_cbct&&(n.p_cbct++,n.p_checkInterval[i]=setInterval("s.p_callBack("+e+", "+i+", '"+t+"')",interval))},s.p_callBack=function(e,t){var n=this;"undefined"==typeof n.visitorNamespace&&(n.visitorNamespace=s_account);var i="";1e&&(clearInterval(n.p_checkInterval[t]),"undefined"!=typeof window[r]&&(window[r].src="https://www.fedex.com/images/ascend/shared/headers/corp_logo.gif?sc_response_failure")),!1)},s.lookuplookup=function(e){var t,n,r,a,s,o,c,l,u=this,d=0,p=e?e.length:0,f=new Array,g=new Array;for(i=0;i-1){s.vpr(p,cr);v=1;}else if(gs>-1){v=0;s.vpr(tv,'SearchCenter Visitors');}if(!s.c_w(c,cr,t)){s.c_w(c,cr,0);}if(!s.c_r(c)){v=0;}return v>=1;"),s.vpr=new Function("vs","v","if(typeof(v)!='undefined' && vs){var s=this; eval('s.'+vs+'=\"'+v+'\"')}"),s.getActionDepth=new Function("c","var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(!s.c_r(c)){v=1}if(s.c_r(c)){v=s.c_r(c);v++}if(!s.c_w(c,v,t)){s.c_w(c,v,0)}return v;"),s.getVisitNum=new Function("tp","c","c2","var s=this,e=new Date,cval,cvisit,ct=e.getTime(),d;if(!tp){tp='m';}if(tp=='m'||tp=='w'||tp=='d'){eo=s.endof(tp),y=eo.getTime();e.setTime(y);}else {d=tp*86400000;e.setTime(ct+d);}if(!c){c='s_vnum';}if(!c2){c2='s_invisit';}cval=s.c_r(c);if(cval){var i=cval.indexOf('&vn='),str=cval.substring(i+4,cval.length),k;}cvisit=s.c_r(c2);if(cvisit){if(str){e.setTime(ct+1800000);s.c_w(c2,'true',e);return str;}else {return 'unknown visit number';}}else {if(str){str++;k=cval.substring(0,i);e.setTime(k);s.c_w(c,k+'&vn='+str,e);e.setTime(ct+1800000);s.c_w(c2,'true',e);return str;}else {s.c_w(c,e.getTime()+'&vn=1',e);e.setTime(ct+1800000);s.c_w(c2,'true',e);return 1;}}"),s.dimo=new Function("m","y","var d=new Date(y,m+1,0);return d.getDate();"),s.endof=new Function("x","var t=new Date;t.setHours(0);t.setMinutes(0);t.setSeconds(0);if(x=='m'){d=s.dimo(t.getMonth(),t.getFullYear())-t.getDate()+1;}else if(x=='w'){d=7-t.getDay();}else {d=1;}t.setDate(t.getDate()+d);return t;"),s.getVisitStart=new Function("c","var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(s.c_r(c)){v=0}if(!s.c_w(c,1,t)){s.c_w(c,1,0)}if(!s.c_r(c)){v=0}return v;"),s.crossVisitParticipation=new Function("v","cn","ex","ct","dl","ev","dv","var s=this,ce;if(typeof(dv)==='undefined')dv=0;if(s.events&&ev){var ay=s.split(ev,',');var ea=s.split(s.events,',');for(var u=0;u0&&arry[arry.length-1][0]==v)arry[arry.length-1]=[v,new Date().getTime()];else arry[arry.length]=[v,new Date().getTime()];var start=arry.length-ct<0?0:arry.length-ct;var td=new Date();for(var x=start;x-1){q=u.substring(i+1);v=s.pt(q,'&','p_gvfne',k)}return v"),s.p_gvfne=new Function("t","k","if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'True':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return v;}return ''"),s.pt=new Function("x","d","f","a","var s=this,t=x,z=0,y,r;while(t){y=t.indexOf(d);y=y<0?t.length:y;t=t.substring(0,y);r=s[f](t,a);if(r)return r;z+=y+d.length;t=x.substring(z,x.length);t=zspr&&cd30){mint='30'}if(thish>=12){ap='PM';thish=thish-12};if (thish==0){thish=12};if(thisd==6||thisd==0){dt='Weekend'};var timestring=thish+':'+mint+ap;var daystring=dow;var endstring=dt;if(t=='h'){return timestring}if(t=='d'){return daystring};if(t=='w'){return endstring}}};"),s.setupLinkTrack=new Function("vl","c","e","var s=this;var cv=s.c_r(c);if(vl){var vla=vl.split(',');}if(cv!=''){var cva=s.split(cv,'^^');if(cva[1]!=''){for(x in vla){s[vla[x]]=cva[x];if(e){s.events=s.apl(s.events,e,',',2);}}}}s.c_w(c,'',0);if(typeof s.linkObject!='undefined'&&s.hbx_lt!='manual'){s.lta=[];if(typeof s.linkObject!=null){slo=s.linkObject;if(s.linkObject!=0){if(s.linkObject.getAttribute('name')!=null){var b=s.linkObject.getAttribute('name');if(b.indexOf('&lpos=')>-1){s.lta[3]=b.match('&lpos=([^&]*)')[1];}if(b.indexOf('&lid=')>-1){s.lta[1]=b.match('&lid=([^&]*)')[1];}}}if(typeof s.lta[1]=='undefined'){if(s.linkName!=0){s.lta[1]=s.linkName;}else if(s.linkObject!=0){if(s.linkObject.innerHTML.indexOf('-1){s.lta[1]=s.linkObject.innerHTML.match('src=\"([^\"]*)')[1];}else{s.lta[1]=s.linkObject.innerHTML;}}else if(s.linkURL){s.lta[1]=s.linkURL;}else{s.lta[1]=null;}}if(s.lta[1]!=null){if(typeof s.pageName!='undefined')s.lta[0]=s.pageName;s.lta[2]=s.pageName+' | '+s.lta[1];}}if(s.linkType!=0){for(var x=0;x]+(>|$)/g,"")).replace(/^\s+|\s+$/g,"")},s.split=new Function("l","d","var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x++]=l.substring(0,i);l=l.substring(i+d.length);}return a"),s.apl=new Function("L","v","d","u","var s=this,m=0;if(!L)L='';if(u){var i,n,a=s.split(L,d);for(i=0;i');if(g.indexOf(D[0])!=-1){s.contextData['a.socialcontentprovider']=D[1];}}"),s.socPlatList="facebook.com>Facebook|twitter.com>Twitter|t.co/>Twitter|youtube.com>Youtube|clipmarks.com>Clipmarks|dailymotion.com>Dailymotion|delicious.com>Delicious|digg.com>Digg|diigo.com>Diigo|flickr.com>Flickr|flixster.com>Flixster|fotolog.com>Fotolog|friendfeed.com>FriendFeed|google.com/buzz>Google Buzz|buzz.googleapis.com>Google Buzz|plus.google.com>Google+|hulu.com>Hulu|identi.ca>identi.ca|ilike.com>iLike|intensedebate.com>IntenseDebate|myspace.com>MySpace|newsgator.com>Newsgator|photobucket.com>Photobucket|plurk.com>Plurk|slideshare.net>SlideShare|smugmug.com>SmugMug|stumbleupon.com>StumbleUpon|tumblr.com>Tumblr|vimeo.com>Vimeo|wordpress.com>WordPress|xanga.com>Xanga|metacafe.com>Metacafe|pinterest.com>Pinterest",s.socialAuthors=new Function("","var s=this,g;g=s.referrer?s.referrer:document.referrer;if(g.indexOf('http://t.co/')===0||g.indexOf('https://t.co/')===0||g.indexOf('pinterest.com/pin')!==-1||g.indexOf('tumblr.com')!==-1||g.indexOf('youtube.com')!==-1){s.Integrate.add('SocialAuthor');s.Integrate.SocialAuthor.get('http://sa-services.social.omniture.com/author/name?var=[VAR]&callback=s.socialAuthorSearch&rs='+encodeURIComponent(s.account)+'&q='+encodeURIComponent(g));s.Integrate.SocialAuthor.delay();s.Integrate.SocialAuthor.setVars=function(s,p){s.contextData['a.socialauthor']=s.user;}}"),s.socialAuthorSearch=new Function("obj","var s=this;if(typeof obj==='undefined'||typeof obj.author==='undefined'){s.user='Not Found';}else{s.user=obj.author;}s.Integrate.SocialAuthor.ready();"),s.__ccucr||(s.c_rr=s.c_r,s.__ccucr=!0,s.c_rspers=t,s.c_r=e),s.__ccucw||(s.c_wr=s.c_w,s.__ccucw=!0,s.c_w=n),s.p_fo=new Function("n","var s=this;if(!s.__fo){s.__fo=new Object;}if(!s.__fo[n]){s.__fo[n]=new Object;return 1;}else {return 0;}"),s.repl=new Function("x","o","n","var i=x.indexOf(o),l=n.length;while(x&&i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.indexOf(o,i+l)}return x"),s.clickPast=new Function("scp","ct_ev","cp_ev","cpc","var s=this,scp,ct_ev,cp_ev,cpc,ev,tct;if(s.p_fo(ct_ev)==1){if(!cpc){cpc='s_cpc';}ev=s.events?s.events+',':'';if(scp){s.events=ev+ct_ev;s.c_w(cpc,1,0);}else{if(s.c_r(cpc)>=1){s.events=ev+cp_ev;s.c_w(cpc,0,0);}}}"),s.manageQueryParam=new Function("p","w","e","u","var s=this,x,y,i,qs,qp,qv,f,b;u=u?u:(s.pageURL?s.pageURL:''+window.location);x=u.indexOf('?');qs=x>-1?u.substring(x,u.length):'';u=x>-1?u.substring(0,x):u;x=qs.indexOf('?'+p+'=');if(x>-1){y=qs.indexOf('&');f='';if(y>-1){qp=qs.substring(x+1,y);b=qs.substring(y+1,qs.length);}else{qp=qs.substring(1,qs.length);b='';}}else{x=qs.indexOf('&'+p+'=');if(x>-1){f=qs.substring(1,x);b=qs.substring(x+1,qs.length);y=b.indexOf('&');if(y>-1){qp=b.substring(0,y);b=b.substring(y,b.length);}else{qp=b;b='';}}}if(e&&qp){y=qp.indexOf('=');qv=y>-1?qp.substring(y+1,qp.length):'';var eui=0;while(qv.indexOf('%25')>-1){qv=unescape(qv);eui++;if(eui==10)break;}qv=s.replace(qv,'+',' ');qv=escape(qv);qv=s.replace(qv,'%25','%');qv=s.replace(qv,'%7C','|');qv=s.replace(qv,'%7c','|');qp=qp.substring(0,y+1)+qv;}if(w&&qp){if(f)qs='?'+qp+'&'+f+b;else if(b)qs='?'+qp+'&'+b;else qs='?'+qp}else if(f)qs='?'+f+'&'+qp+b;else if(b)qs='?'+qp+'&'+b;else if(qp)qs='?'+qp;return u+qs;"),s.handlePPVevents=new Function("","var W=window,s=W.s_name&&typeof W[s_name]=='object'?W[s_name]:0;if(!s||!s.getPPVid)return;var B=document.body,E=document.documentElement,D=window.document;d=Math.max(B.scrollHeight,E.scrollHeight,B.offsetHeight,E.offsetHeight,B.clientHeight,E.clientHeight),v=window.innerHeight||E.clientHeight||B.clientHeight,t=window.pageYOffset||D.documentElement.scrollTop||D.body.scrollTop,h=t+v,p=Math.min(Math.round(h/d*100),100),c=s.c_r('s_ppv'),a=c.indexOf(',')>-1?c.split(',',4):[],l=a.length,n=l>0?a[0]:escape(s.getPPVid),P=l>1?parseInt(a[1]):0,f=l>2?parseInt(a[2]):p,H=l>3?parseInt(a[3]):0,cn=p>0?n+','+(p>P?p:P)+','+f+','+(h>H?h:H):'';s.c_w('s_ppv',cn)"),s.getPercentPageViewed=new Function("n","if(typeof this.linkType!='undefined')return'';var s=this,w=window,F=false,e=window.addEventListener||window.attachEvent||'';i=3,v=s.c_r('s_ppv'),a=v.indexOf(',')>-1?v.split(',',4):[];if(a.length<4){while(i>0)a[i--]=ip&&(p=e)})):0t){f.K.unshift(e),setTimeout(f.delayReady,parseInt(f.maxDelay/2));break}f.La=1,f[e.m].apply(f,e.a),f.La=0}},f.setAccount=f.sa=function(e){var t,n;if(!f.fa("setAccount",arguments))if(f.account=e,f.allAccounts)for(t=f.allAccounts.concat(e.split(",")),f.allAccounts=[],t.sort(),n=0;nf.N&&f.Wa(f.i),f.ra(500);else{var e=f.Fb();0f.N&&f.Wa(f.i),f.da(),f.ra(500)},t.onreadystatechange=function(){4==t.readyState&&(200==t.status?t.R():t.ha())},f.Ua=f.A(),1===n)t.send(e);else if(2===n)i=e.indexOf("?"),n=e.substring(0,i),i=(i=e.substring(i+1)).replace(/&callback=[a-zA-Z0-9_.\[\]]+/,""),t.open("POST",n,!0),t.withCredentials=!0,t.send(i);else if(t.src=e,3===n){if(f.Sa)try{i.removeChild(f.Sa)}catch(r){}i.firstChild?i.insertBefore(t,i.firstChild):i.appendChild(t),f.Sa=f.v}t.D=setTimeout(function(){t.D&&(t.complete?t.R():(f.trackOffline&&t.abort&&t.abort(),t.ha()))},5e3),f.Ib=e,f.v=p["s_i_"+f.replace(f.account,",","_")]=t,(f.useForcedLinkTracking&&f.J||f.bodyClickFunction)&&(f.forcedLinkTrackingTimeout||(f.forcedLinkTrackingTimeout=250),f.ea=setTimeout(f.da,f.forcedLinkTrackingTimeout))},f.nb=function(e){var t=!1;return navigator.sendBeacon&&(f.pb(e)?t=!0:f.useBeacon&&(t=!0)),f.yb(e)&&(t=!1),t},f.pb=function(e){return!!(e&&0f.N))try{p.localStorage.removeItem(f.na()),f.Ta=f.A()}catch(e){}},f.Wa=function(e){if(f.pa()){f.Ya();try{p.localStorage.setItem(f.na(),p.JSON.stringify(e)),f.N=f.A()}catch(t){}}},f.Ya=function(){if(f.trackOffline)for((!f.offlineLimit||f.offlineLimit<=0)&&(f.offlineLimit=10);f.i.length>f.offlineLimit;)f.Ma()},f.forceOffline=function(){f.oa=!0},f.forceOnline=function(){f.oa=!1},f.na=function(){return f.offlineFilename+"-"+f.visitorNamespace+f.account},f.A=function(){return(new Date).getTime()},f.Qa=function(e){return 0!=(e=e.toLowerCase()).indexOf("#")&&0!=e.indexOf("about:")&&0!=e.indexOf("opera:")&&0!=e.indexOf("javascript:")},f.setTagContainer=function(e){var t,n,i;for(f.ac=e,t=0;t'}");if((n=e.getInstance(t,{idSyncContainerID:a}))!==Object(n)||"function"!=typeof n.isAllowed||"function"!=typeof n.getMarketingCloudVisitorID||"function"!=typeof n.getCustomerIDs||"function"!=typeof n.isOptedOut||"function"!=typeof n.publishDestinations)throw this.releaseType="invalid instance",i="Invalid Visitor instance.",n===Object(n)&&"function"!=typeof n.publishDestinations&&(i+=" In particular, visitorInstance.publishDestinations is not a function. This is needed to fire URL destinations in DIL v8.0+ and should be present in Visitor v3.3.0+ ."),new Error(i);if(this.VisitorAPI=e,!n.isAllowed())return this.releaseType="VisitorAPI is not allowed to write cookies",void this.releaseRequests();this.instance=n,this.waitForMidToReleaseRequests()}catch(e){if(!D)throw new Error("Error in processing Visitor API, which is a hard dependency for DIL v8.0+: "+e.message);this.releaseRequests()}},waitForMidToReleaseRequests:function(){var t=this;this.instance&&(this.instance.getMarketingCloudVisitorID(function(e){t.mid=e,t.releaseType="VisitorAPI",t.releaseRequests()},!0),(!U.exists||!U.isIabContext&&U.isApproved()||U.isIabContext&&z.hasGoSignal())&&setTimeout(function(){"VisitorAPI"!==t.releaseType&&(t.releaseType="timeout",t.releaseRequests())},this.getLoadTimeout()))},releaseRequests:function(){this.calledBack=!0,P.registerRequest()},getMarketingCloudVisitorID:function(){return this.instance?this.instance.getMarketingCloudVisitorID():null},getMIDQueryString:function(){var e=N.isPopulatedString,t=this.getMarketingCloudVisitorID();return e(this.mid)&&this.mid===t||(this.mid=t),e(this.mid)?"d_mid="+this.mid+"&":""},getCustomerIDs:function(){return this.instance?this.instance.getCustomerIDs():null},getCustomerIDsQueryString:function(e){if(e!==Object(e))return"";var t,n,i,r,a="",s=[],o=[];for(t in e)e.hasOwnProperty(t)&&(n=e[o[0]=t])===Object(n)&&(o[1]=n.id||"",o[2]=n.authState||0,s.push(o),o=[]);if(r=s.length)for(i=0;i 1"):void 0},getPublishDestinationsVersion:function(){if(null!==this.publishDestinationsVersion)return this.publishDestinationsVersion;var e=P.adms.instance,n=-1;return e.publishDestinations(null,null,function(e){if(e===Object(e)){var t=e.error;"subdomain is not a populated string."===t?n=1:"Invalid parameters passed."===t&&(n=2)}}),this.publishDestinationsVersion=n}},j={traits:function(e){return N.isValidPdata(e)&&(A.sids instanceof Array||(A.sids=[]),F.extendArray(A.sids,e)),this},pixels:function(e){return N.isValidPdata(e)&&(A.pdata instanceof Array||(A.pdata=[]),F.extendArray(A.pdata,e)),this},logs:function(e){return N.isValidLogdata(e)&&(A.logdata!==Object(A.logdata)&&(A.logdata={}),F.extendObject(A.logdata,e)),this},customQueryParams:function(e){return N.isEmptyObject(e)||F.extendObject(A,e,P.reservedKeys),this},signals:function(e,t){var n,i=e;if(!N.isEmptyObject(i)){if(t&&"string"==typeof t)for(n in i={},e)e.hasOwnProperty(n)&&(i[t+n]=e[n]);F.extendObject(A,i,P.reservedKeys)}return this},declaredId:function(e){return P.declaredId.setDeclaredId(e,"request"),this},result:function(e){return"function"==typeof e&&(A.callback=e),this},afterResult:function(e){return"function"==typeof e&&(A.postCallbackFn=e),this},useImageRequest:function(){return A.useImageRequest=!0,this},clearData:function(){return A={},this},submit:function(e){return A.isDefaultRequest=!!e,q.submitRequest(A),A={},this},getPartner:function(){return m},getContainerNSID:function(){return a},getEventLog:function(){return I},getState:function(){var e={},t={};return F.extendObject(e,P,{registerRequest:!0}),F.extendObject(t,R,{requestToProcess:!0,process:!0,sendMessages:!0}),{initConfig:n,pendingRequest:A,otherRequestInfo:e,destinationPublishingInfo:t,log:I}},idSync:function(){throw new Error("Please use the `idSyncByURL` method of the Experience Cloud ID Service (Visitor) instance")},aamIdSync:function(){throw new Error("Please use the `idSyncByDataSource` method of the Experience Cloud ID Service (Visitor) instance")},passData:function(e){return N.isEmptyObject(e)?"Error: json is empty or not an object":(q.defaultCallback(e),e)},getPlatformParams:function(){return P.platformParams},getEventCallConfigParams:function(){var e,t=P,n=t.modStatsParams,i=t.platformParams;if(!n){for(e in n={},i)i.hasOwnProperty(e)&&!t.nonModStatsParams[e]&&(n[e.replace(/^d_/,"")]=i[e]);!0===f?n.coop_safe=1:!1===f&&(n.coop_unsafe=1),t.modStatsParams=n}return n},setAsCoopSafe:function(){return f=!0,this},setAsCoopUnsafe:function(){return f=!1,this},getEventCallIabSignals:function(e){var t;return e!==Object(e)?"Error: config is not an object":"function"!=typeof e.callback?"Error: config.callback is not a function":(t=parseInt(e.timeout,10),isNaN(t)&&(t=null),void z.getQueryStringObject(e.callback,t))}},q={corsMetadata:(E="none","undefined"!=typeof XMLHttpRequest&&XMLHttpRequest===Object(XMLHttpRequest)&&"withCredentials"in new XMLHttpRequest&&(E="XMLHttpRequest"),{corsType:E}),getCORSInstance:function(){return"none"===this.corsMetadata.corsType?null:new window[this.corsMetadata.corsType]},submitRequest:function(e){return P.registerRequest(q.createQueuedRequest(e)),!0},createQueuedRequest:function(e){var t,n,i,r,a,s=e.callback,o="img",c=e.isDefaultRequest;if(delete e.isDefaultRequest,!N.isEmptyObject(l))for(i in l)if(l.hasOwnProperty(i)){if(null==(r=l[i])||""===r)continue;if(i in e&&!(r in e)&&!(r in P.reservedKeys)){if(null==(a=e[i])||""===a)continue;e[r]=a}}return N.isValidPdata(e.sids)||(e.sids=[]),N.isValidPdata(e.pdata)||(e.pdata=[]),N.isValidLogdata(e.logdata)||(e.logdata={}),e.logdataArray=F.convertObjectToKeyValuePairs(e.logdata,"=",!0),e.logdataArray.push("_ts="+(new Date).getTime()),"function"!=typeof s&&(s=this.defaultCallback),t=this.makeRequestSrcData(e),(n=this.getCORSInstance())&&!0!==e.useImageRequest&&(o="cors"),{tag:o,src:t.src,corsSrc:t.corsSrc,callbackFn:s,postCallbackFn:e.postCallbackFn,useImageRequest:!!e.useImageRequest,requestData:e,corsInstance:n,corsPostData:t.corsPostData,isDefaultRequest:c}},defaultCallback:function(e,t){var n,i,r,a,s,o,c,l,u;if(_&&(n=e.stuff)&&n instanceof Array&&(i=n.length))for(r=0;r{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_cf3e2641a6a057de);(function(){(function(){var n=this||self,p=function(a,b){a=a.split(".");var c=n;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var q={},r=function(){q.TAGGING=q.TAGGING||[];q.TAGGING[1]=!0};var t=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},v=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var x=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var y=window,z=document,A=function(a,b){z.addEventListener?z.addEventListener(a,b,!1):z.attachEvent&&z.attachEvent("on"+a,b)};var B=/:[0-9]+$/,C=function(a,b,c){a=a.split("&");for(var d=0;dd?a.href:a.href.substr(0,d));a=d;break;case"protocol":a=f;break;case"host":a=a.hostname.replace(B,"").toLowerCase();c&&(d=/^www\d*\./.exec(a))&&d[0]&&(a=a.substr(d[0].length));break;case"port":a=String(Number(a.port)||("http"==f?80:"https"==f?443:""));break;case"path":a.pathname||a.hostname||r();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(d=d||[],c=a[a.length-1],Array.prototype.indexOf)d=d.indexOf(c),d="number"==typeof d?d:-1;else{for(e=0;e>4);64!=g&&(c+=String.fromCharCode(f<<4&240|g>>2),64!=h&&(c+=String.fromCharCode(g<<6&192|h)))}}var L;var N=function(){var a=ba,b=ca,c=M(),d=function(g){a(g.target||g.srcElement||{})},e=function(g){b(g.target||g.srcElement||{})};if(!c.init){A("mousedown",d);A("keyup",d);A("submit",e);var f=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);f.call(this)};c.init=!0}},O=function(a,b,c,d,e){a={callback:a,domains:b,fragment:2===c,placement:c,forms:d,sameHost:e};M().decorators.push(a)},P=function(a,b,c){for(var d=M().decorators,e={},f=0;f>2;l=(l&3)<<4|u>>4;u=(u&15)<<2|w>>6;w&=63;m||(w=64,k||(u=64));g.push(I[fa],I[l],I[u],I[w])}f.call(e,g.join(""))}}a=b.join("*");return["1",R(a),a].join("*")},R=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1e3)-(void 0===b?0:b),a].join("*");if(!(b=L)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}L=b;b=4294967295;for(c=0;c>>8^L[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ia=function(a){return function(b){var c=G(y.location.href),d=c.search.replace("?","");var e=C(d,"_gl",!0);b.query=T(e||"")||{};e=F(c,"fragment");var f=e.match(Q("_gl"));b.fragment=T(f&&f[3]||"")||{};a&&ha(c,d,e)}};function U(a,b){if(a=Q(a).exec(b)){var c=a[2],d=a[4];b=a[1];d&&(b=b+c+d)}return b}var ha=function(a,b,c){function d(f,g){f=U("_gl",f);f.length&&(f=g+f);return f}if(y.history&&y.history.replaceState){var e=Q("_gl");if(e.test(b)||e.test(c))a=F(a,"path"),b=d(b,"?"),c=d(c,"#"),y.history.replaceState({},void 0,""+a+b+c)}},T=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=da.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var f=e[2],g=e[3];a:{for(e=0;e>21:b}return b}var $c=function(a){this.C=a||[]};$c.prototype.set=function(a){this.C[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<\/script>'))):(c=M.createElement("script"),c.type="text/javascript",c.async=!0,c.src=ff.createScriptURL(a),d&&(c.onload=d),e&&(c.onerror=e),b&&(c.id=b),g&&c.setAttribute("nonce",g),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a))}},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;eg.length||!c&&3!==g.length)a&&(a.na=!0);else if(Number(g[1])){d[b[e].ja]?a&&(a.pa=!0):d[b[e].ja]=[];var ca={version:g[0],timestamp:1e3*Number(g[1]),qa:g[2]};c&&3=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length)},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){const $___old_beb71a1d35c235ab={}.constructor.getOwnPropertyDescriptor(window,"XMLHttpRequest");try{if($___old_beb71a1d35c235ab)({}).constructor.defineProperty(window,"XMLHttpRequest",$___mock_cf3e2641a6a057de.XMLHttpRequest);return function(){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d&&"text/plain"===g.getResponseHeader("Content-Type"))try{Ea(d,g.responseText,c)}catch(ca){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0}.apply(this,arguments)}finally{if($___old_beb71a1d35c235ab)({}).constructor.defineProperty(window,"XMLHttpRequest",$___old_beb71a1d35c235ab)}},Ea=function(a,b,c){if(1>b.length)ge("xhr","ver","0"),c();else if(3=100*R(a,Ka))throw"abort"}function Ma(a){if(G(P(a,Na)))throw"abort"}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort"}function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});!1===a.get(xe)&&b.push("npa=1");b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d||bd(!1)+"")+"/collect";switch(P(a,ad)){case"d":e=c||(d||bd(!1)+"")+"/j/collect";b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e.first_hit||(e.first_hit=(new Date).getTime());e=P(a,Na);delete h(e).pending_experiments;a.set(Ia,ua,!0)}function Hc(a){qc().expId&&a.set(Nc,qc().expId);qc().expVar&&a.set(Oc,qc().expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&((b=a.get(m))&&(d=b+"!"+d),a.set(m,d,!0))}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort"}function yd(a){var b=O.gaDevIds||[];if(ka(b)){var c=a.get("&did");qa(c)&&0=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)}var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0a.length)J(12);else{for(var d=[],e=0;e=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;de?"?":"&")+a+b.substring(e);b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;carguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(me[b]||[],c),c[Va]=b,this.model.set(c,void 0,!0),this.filters.D(this.model),this.model.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var td=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1e3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),(c=uc(a))&&a.data.set(I,c));a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)&&(c={},d=(M?df(c):{})[P(a,Na)],le(c),d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp/1e3),a.data.set(ce,c.qa)));a.get(je)&&!a.get(Se)&&(c={},d=(M?df(c,"_gac_gb",!0):{})[P(a,Na)],ef(c),d&&0!=d.length&&(c=d[0],d=c.qa,c.labels&&c.labels.length&&(d+="."+c.labels.join(".")),a.data.set(Te,c.timestamp/1e3),a.data.set(Se,d)))}if(a.get(Hd)){c=be("_ga",!!a.get(cc));var g=be("_gl",!!a.get(cc));d=De.get(a.get(cc));e=d._ga;g&&0=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);c=a.set;var k;if((e=(e=O.navigator)?e.plugins:null)&&e.length)for(l=0;la.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}},cf=function(a,b){return a&&0<=a.indexOf("/")?a:(b||bd(!1))+"/plugins/ua/"+a};var Z={ga:function(){Z.fa=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.fa.concat(b);for(Z.fa=[];0c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+"/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);X("passthrough",b,b.$,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};var gf=N.N,hf=O[gb];hf&&hf.r?gf():z(gf);z(function(){Z.D(["provide","render",ua])})})(window)})()} diff --git a/resources/sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js b/resources/sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js new file mode 100644 index 00000000..908b122e --- /dev/null +++ b/resources/sugarcoat-analytics.a113b136ebdce01cf16d-7f8d3e5b8a25cb57ea68a3cdbc78a58b.min.js @@ -0,0 +1 @@ +{const $___mock_3bd5d1df87bff05a={};(exports=>{"use strict";let isSealed=false;class Storage{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}}get length(){return Object.keys(this).length}key(index){const keys=Object.keys(this);if(index<0||index>=keys.length){return null}return keys[index]}getItem(key){return Object.prototype.hasOwnProperty.call(this,key)?this[key]:null}setItem(key,value){this[key]=String(value)}removeItem(key){delete this[key]}clear(){const keys=Object.keys(this);for(const key of keys){delete this[key]}}}exports.Storage={configurable:true,enumerable:true,value:Storage,writable:true};const localStorage=new Storage;exports.localStorage={configurable:true,enumerable:true,get(){return localStorage}};const sessionStorage=new Storage;exports.sessionStorage={configurable:true,enumerable:true,get(){return sessionStorage}};isSealed=true})($___mock_3bd5d1df87bff05a);const $___mock_cf3e2641a6a057de={};(exports=>{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_cf3e2641a6a057de);(function(){!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,t,o){for(var c,a,i,u=0,p=[];u-1&&n(191)}})})()} diff --git a/resources/sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min.js b/resources/sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min.js new file mode 100644 index 00000000..0ee5db02 --- /dev/null +++ b/resources/sugarcoat-cmp2-a52bcd9059a7d75c4d5b8f66db49a380.min.js @@ -0,0 +1 @@ +{const $___mock_41dd0ab5f50f8198={};(exports=>{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_41dd0ab5f50f8198);const $___mock_c6e61d92b949e349={};(exports=>{"use strict";let isSealed=false;class Storage{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}}get length(){return Object.keys(this).length}key(index){const keys=Object.keys(this);if(index<0||index>=keys.length){return null}return keys[index]}getItem(key){return Object.prototype.hasOwnProperty.call(this,key)?this[key]:null}setItem(key,value){this[key]=String(value)}removeItem(key){delete this[key]}clear(){const keys=Object.keys(this);for(const key of keys){delete this[key]}}}exports.Storage={configurable:true,enumerable:true,value:Storage,writable:true};const localStorage=new Storage;exports.localStorage={configurable:true,enumerable:true,get(){return localStorage}};const sessionStorage=new Storage;exports.sessionStorage={configurable:true,enumerable:true,get(){return sessionStorage}};isSealed=true})($___mock_c6e61d92b949e349);(function(){!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=196)}([function(e,t,n){e.exports=n(99)},,,,,function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(111)),r(n(112)),r(n(113)),r(n(114))},function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(54)),r(n(115)),r(n(55)),r(n(56)),r(n(116)),r(n(117)),r(n(38)),r(n(57)),r(n(118)),r(n(119))},function(e,t,n){"use strict";var r=n(71),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function s(e){return"undefined"===typeof e}function a(e){return null!==e&&"object"===typeof e}function c(e){return"[object Function]"===o.call(e)}function u(e,t){if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(){}return e.prototype.clone=function(){var e=this,t=new this.constructor;return Object.keys(this).forEach(function(n){var r=e.deepClone(e[n]);void 0!==r&&(t[n]=r)}),t},e.prototype.deepClone=function(e){var t,n,o=typeof e;if("number"===o||"string"===o||"boolean"===o)return e;if(null!==e&&"object"===o){if("function"==typeof e.clone)return e.clone();if(e instanceof Date)return new Date(e.getTime());if(void 0!==e[Symbol.iterator]){var i=[];try{for(var s=r(e),a=s.next();!a.done;a=s.next()){var c=a.value;i.push(this.deepClone(c))}}catch(e){t={error:e}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}return e instanceof Array?i:new e.constructor(i)}var u={};for(var p in e)e.hasOwnProperty(p)&&(u[p]=this.deepClone(e[p]));return u}},e}();t.Cloneable=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=function(){function e(){}return e.encode=function(e,t){var n;if("string"==typeof e&&(e=parseInt(e,10)),(n=e.toString(2)).length>t||e<0)throw new r.EncodingError(e+" too large to encode into "+t);return n.length0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0){var i=n;t.CACHE.has(i)?(r.populate(t.CACHE.get(i)),r.readyPromise=Promise.resolve()):(o+=t.versionedFilename.replace("[VERSION]",i+""),r.readyPromise=r.fetchJson(o))}else t.CACHE.has(t.LATEST_CACHE_KEY)?(r.populate(t.CACHE.get(t.LATEST_CACHE_KEY)),r.readyPromise=Promise.resolve()):(r.isLatest=!0,r.readyPromise=r.fetchJson(o+t.latestFilename))}return r}return r(t,e),Object.defineProperty(t,"baseUrl",{get:function(){return this.baseUrl_},set:function(e){if(/^https?:\/\/vendorlist\.consensu\.org\//.test(e))throw new a.GVLError("Invalid baseUrl! You may not pull directly from vendorlist.consensu.org and must provide your own cache");e.length>0&&"/"!==e[e.length-1]&&(e+="/"),this.baseUrl_=e},enumerable:!0,configurable:!0}),t.emptyLanguageCache=function(e){var n=!1;return void 0===e&&t.LANGUAGE_CACHE.size>0?(t.LANGUAGE_CACHE=new Map,n=!0):"string"==typeof e&&this.consentLanguages.has(e.toUpperCase())&&(t.LANGUAGE_CACHE.delete(e.toUpperCase()),n=!0),n},t.emptyCache=function(e){var n=!1;return Number.isInteger(e)&&e>=0?(t.CACHE.delete(e),n=!0):void 0===e&&(t.CACHE=new Map,n=!0),n},t.prototype.cacheLanguage=function(){t.LANGUAGE_CACHE.has(this.lang_)||t.LANGUAGE_CACHE.set(this.lang_,{purposes:this.purposes,specialPurposes:this.specialPurposes,features:this.features,specialFeatures:this.specialFeatures,stacks:this.stacks})},t.prototype.fetchJson=function(e){return o(this,void 0,void 0,function(){var t,n;return i(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),t=this.populate,[4,c.Json.fetch(e)];case 1:return t.apply(this,[r.sent()]),[3,3];case 2:throw n=r.sent(),new a.GVLError(n.message);case 3:return[2]}})})},t.prototype.getJson=function(){return JSON.parse(JSON.stringify({gvlSpecificationVersion:this.gvlSpecificationVersion,vendorListVersion:this.vendorListVersion,tcfPolicyVersion:this.tcfPolicyVersion,lastUpdated:this.lastUpdated,purposes:this.purposes,specialPurposes:this.specialPurposes,features:this.features,specialFeatures:this.specialFeatures,stacks:this.stacks,vendors:this.fullVendorList}))},t.prototype.changeLanguage=function(e){return o(this,void 0,void 0,function(){var n,r,o,s,c;return i(this,function(i){switch(i.label){case 0:if(n=e.toUpperCase(),!t.consentLanguages.has(n))return[3,6];if(n===this.lang_)return[3,5];if(this.lang_=n,!t.LANGUAGE_CACHE.has(n))return[3,1];for(o in r=t.LANGUAGE_CACHE.get(n))r.hasOwnProperty(o)&&(this[o]=r[o]);return[3,5];case 1:s=t.baseUrl+t.languageFilename.replace("[LANG]",e),i.label=2;case 2:return i.trys.push([2,4,,5]),[4,this.fetchJson(s)];case 3:return i.sent(),this.cacheLanguage(),[3,5];case 4:throw c=i.sent(),new a.GVLError("unable to load language: "+c.message);case 5:return[3,7];case 6:throw new a.GVLError("unsupported language "+e);case 7:return[2]}})})},Object.defineProperty(t.prototype,"language",{get:function(){return this.lang_},enumerable:!0,configurable:!0}),t.prototype.isVendorList=function(e){return void 0!==e&&void 0!==e.vendors},t.prototype.populate=function(e){this.purposes=e.purposes,this.specialPurposes=e.specialPurposes,this.features=e.features,this.specialFeatures=e.specialFeatures,this.stacks=e.stacks,this.isVendorList(e)&&(this.gvlSpecificationVersion=e.gvlSpecificationVersion,this.tcfPolicyVersion=e.tcfPolicyVersion,this.vendorListVersion=e.vendorListVersion,this.lastUpdated=e.lastUpdated,"string"==typeof this.lastUpdated&&(this.lastUpdated=new Date(this.lastUpdated)),this.vendors_=e.vendors,this.fullVendorList=e.vendors,this.mapVendors(),this.isReady_=!0,this.isLatest&&t.CACHE.set(t.LATEST_CACHE_KEY,this.getJson()),t.CACHE.has(this.vendorListVersion)||t.CACHE.set(this.vendorListVersion,this.getJson())),this.cacheLanguage()},t.prototype.mapVendors=function(e){var t=this;this.byPurposeVendorMap={},this.bySpecialPurposeVendorMap={},this.byFeatureVendorMap={},this.bySpecialFeatureVendorMap={},Object.keys(this.purposes).forEach(function(e){t.byPurposeVendorMap[e]={legInt:new Set,consent:new Set,flexible:new Set}}),Object.keys(this.specialPurposes).forEach(function(e){t.bySpecialPurposeVendorMap[e]=new Set}),Object.keys(this.features).forEach(function(e){t.byFeatureVendorMap[e]=new Set}),Object.keys(this.specialFeatures).forEach(function(e){t.bySpecialFeatureVendorMap[e]=new Set}),Array.isArray(e)||(e=Object.keys(this.fullVendorList).map(function(e){return+e})),this.vendorIds=new Set(e),this.vendors_=e.reduce(function(e,n){var r=t.vendors_[""+n];return r&&void 0===r.deletedDate&&(r.purposes.forEach(function(e){t.byPurposeVendorMap[e+""].consent.add(n)}),r.specialPurposes.forEach(function(e){t.bySpecialPurposeVendorMap[e+""].add(n)}),r.legIntPurposes.forEach(function(e){t.byPurposeVendorMap[e+""].legInt.add(n)}),r.flexiblePurposes&&r.flexiblePurposes.forEach(function(e){t.byPurposeVendorMap[e+""].flexible.add(n)}),r.features.forEach(function(e){t.byFeatureVendorMap[e+""].add(n)}),r.specialFeatures.forEach(function(e){t.bySpecialFeatureVendorMap[e+""].add(n)}),e[n]=r),e},{})},t.prototype.getFilteredVendors=function(e,t,n,r){var o=this,i=e.charAt(0).toUpperCase()+e.slice(1),s={};return("purpose"===e&&n?this["by"+i+"VendorMap"][t+""][n]:this["by"+(r?"Special":"")+i+"VendorMap"][t+""]).forEach(function(e){s[e+""]=o.vendors[e+""]}),s},t.prototype.getVendorsWithConsentPurpose=function(e){return this.getFilteredVendors("purpose",e,"consent")},t.prototype.getVendorsWithLegIntPurpose=function(e){return this.getFilteredVendors("purpose",e,"legInt")},t.prototype.getVendorsWithFlexiblePurpose=function(e){return this.getFilteredVendors("purpose",e,"flexible")},t.prototype.getVendorsWithSpecialPurpose=function(e){return this.getFilteredVendors("purpose",e,void 0,!0)},t.prototype.getVendorsWithFeature=function(e){return this.getFilteredVendors("feature",e)},t.prototype.getVendorsWithSpecialFeature=function(e){return this.getFilteredVendors("feature",e,void 0,!0)},Object.defineProperty(t.prototype,"vendors",{get:function(){return this.vendors_},enumerable:!0,configurable:!0}),t.prototype.narrowVendorsTo=function(e){this.mapVendors(e)},Object.defineProperty(t.prototype,"isReady",{get:function(){return this.isReady_},enumerable:!0,configurable:!0}),t.prototype.clone=function(){return new t(this.getJson())},t.isInstanceOf=function(e){return"object"==typeof e&&"function"==typeof e.narrowVendorsTo},t.LANGUAGE_CACHE=new Map,t.CACHE=new Map,t.LATEST_CACHE_KEY=0,t.DEFAULT_LANGUAGE="EN",t.consentLanguages=new u.ConsentLanguages,t.latestFilename="vendor-list.json",t.versionedFilename="archives/vendor-list-v[VERSION].json",t.languageFilename="purposes-[LANG].json",t}(s.Cloneable);t.GVL=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(36),o=n(6),i=n(16),s=n(33),a=function(){function e(){}return e.encode=function(e,t){var n,o,i="";return e=r.SemanticPreEncoder.process(e,t),(o=Array.isArray(null===(n=t)||void 0===n?void 0:n.segments)?t.segments:new r.SegmentSequence(e,t)[""+e.version]).forEach(function(t,n){var s="";n1))throw new i.TCModelError("cmpId",e);this.cmpId_=+e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"cmpVersion",{get:function(){return this.cmpVersion_},set:function(e){if(!(Number.isInteger(+e)&&e>-1))throw new i.TCModelError("cmpVersion",e);this.cmpVersion_=+e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"consentScreen",{get:function(){return this.consentScreen_},set:function(e){if(!(Number.isInteger(+e)&&e>-1))throw new i.TCModelError("consentScreen",e);this.consentScreen_=+e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"consentLanguage",{get:function(){return this.consentLanguage_},set:function(e){this.consentLanguage_=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"publisherCountryCode",{get:function(){return this.publisherCountryCode_},set:function(e){if(!/^([A-z]){2}$/.test(e))throw new i.TCModelError("publisherCountryCode",e);this.publisherCountryCode_=e.toUpperCase()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vendorListVersion",{get:function(){return this.gvl?this.gvl.vendorListVersion:this.vendorListVersion_},set:function(e){if((e=+e>>0)<0)throw new i.TCModelError("vendorListVersion",e);this.vendorListVersion_=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"policyVersion",{get:function(){return this.gvl?this.gvl.tcfPolicyVersion:this.policyVersion_},set:function(e){if(this.policyVersion_=parseInt(e,10),this.policyVersion_<0)throw new i.TCModelError("policyVersion",e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"version",{get:function(){return this.version_},set:function(e){this.version_=parseInt(e,10)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isServiceSpecific",{get:function(){return this.isServiceSpecific_},set:function(e){this.isServiceSpecific_=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"useNonStandardStacks",{get:function(){return this.useNonStandardStacks_},set:function(e){this.useNonStandardStacks_=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"supportOOB",{get:function(){return this.supportOOB_},set:function(e){this.supportOOB_=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"purposeOneTreatment",{get:function(){return this.purposeOneTreatment_},set:function(e){this.purposeOneTreatment_=e},enumerable:!0,configurable:!0}),t.prototype.setAllVendorConsents=function(){this.vendorConsents.set(this.gvl.vendors)},t.prototype.unsetAllVendorConsents=function(){this.vendorConsents.empty()},t.prototype.setAllVendorsDisclosed=function(){this.vendorsDisclosed.set(this.gvl.vendors)},t.prototype.unsetAllVendorsDisclosed=function(){this.vendorsDisclosed.empty()},t.prototype.setAllVendorsAllowed=function(){this.vendorsAllowed.set(this.gvl.vendors)},t.prototype.unsetAllVendorsAllowed=function(){this.vendorsAllowed.empty()},t.prototype.setAllVendorLegitimateInterests=function(){this.vendorLegitimateInterests.set(this.gvl.vendors)},t.prototype.unsetAllVendorLegitimateInterests=function(){this.vendorLegitimateInterests.empty()},t.prototype.setAllPurposeConsents=function(){this.purposeConsents.set(this.gvl.purposes)},t.prototype.unsetAllPurposeConsents=function(){this.purposeConsents.empty()},t.prototype.setAllPurposeLegitimateInterests=function(){this.purposeLegitimateInterests.set(this.gvl.purposes)},t.prototype.unsetAllPurposeLegitimateInterests=function(){this.purposeLegitimateInterests.empty()},t.prototype.setAllSpecialFeatureOptins=function(){this.specialFeatureOptins.set(this.gvl.specialFeatures)},t.prototype.unsetAllSpecialFeatureOptins=function(){this.specialFeatureOptins.empty()},t.prototype.setAll=function(){this.setAllVendorConsents(),this.setAllPurposeLegitimateInterests(),this.setAllSpecialFeatureOptins(),this.setAllPurposeConsents(),this.setAllVendorLegitimateInterests()},t.prototype.unsetAll=function(){this.unsetAllVendorConsents(),this.unsetAllPurposeLegitimateInterests(),this.unsetAllSpecialFeatureOptins(),this.unsetAllPurposeConsents(),this.unsetAllVendorLegitimateInterests()},Object.defineProperty(t.prototype,"numCustomPurposes",{get:function(){var e=this.numCustomPurposes_;if("object"==typeof this.customPurposes){var t=Object.keys(this.customPurposes).sort(function(e,t){return+e-+t});e=parseInt(t.pop(),10)}return e},set:function(e){if(this.numCustomPurposes_=parseInt(e,10),this.numCustomPurposes_<0)throw new i.TCModelError("numCustomPurposes",e)},enumerable:!0,configurable:!0}),t.prototype.updated=function(){this.lastUpdated=new Date},t.consentLanguages=s.GVL.consentLanguages,t}(o.Cloneable);t.TCModel=c},,,function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(53)),r(n(37)),r(n(120)),r(n(124)),r(n(58)),r(n(64))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(6),o=function(){function e(){}var t,n,o,i,s,a,c,u,p,l,d,f,h,v,y,g,m,b;return t=r.Fields.cmpId,n=r.Fields.cmpVersion,o=r.Fields.consentLanguage,i=r.Fields.consentScreen,s=r.Fields.created,a=r.Fields.isServiceSpecific,c=r.Fields.lastUpdated,u=r.Fields.policyVersion,p=r.Fields.publisherCountryCode,l=r.Fields.publisherLegitimateInterests,d=r.Fields.publisherConsents,f=r.Fields.purposeConsents,h=r.Fields.purposeLegitimateInterests,v=r.Fields.purposeOneTreatment,y=r.Fields.specialFeatureOptins,g=r.Fields.useNonStandardStacks,m=r.Fields.vendorListVersion,b=r.Fields.version,e[t]=12,e[n]=12,e[o]=12,e[i]=6,e[s]=36,e[a]=1,e[c]=36,e[u]=6,e[p]=12,e[l]=24,e[d]=24,e[f]=24,e[h]=24,e[v]=1,e[y]=12,e[g]=1,e[m]=12,e[b]=6,e.anyBoolean=1,e.encodingType=1,e.maxId=16,e.numCustomPurposes=6,e.numEntries=12,e.numRestrictions=12,e.purposeId=6,e.restrictionType=2,e.segmentType=3,e.singleOrRange=1,e.vendorId=16,e}();t.BitLength=o},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.RestrictionType||(t.RestrictionType={}))[r.NOT_ALLOWED=0]="NOT_ALLOWED",r[r.REQUIRE_CONSENT=1]="REQUIRE_CONSENT",r[r.REQUIRE_LI=2]="REQUIRE_LI"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(23),o=n(5),i=n(6),s=function(){function e(){}return e.encode=function(e,t){for(var n="",o=1;o<=t;o++)n+=r.BooleanEncoder.encode(e.has(o));return n},e.decode=function(e,t){if(e.length!==t)throw new o.DecodingError("bitfield encoding length mismatch");for(var n=new i.Vector,s=1;s<=t;s++)r.BooleanEncoder.decode(e[s-1])&&n.set(s);return n.bitLength=e.length,n},e}();t.FixedVectorEncoder=s},,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}(n(48))},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.TCFCommand||(t.TCFCommand={})).PING="ping",r.GET_TC_DATA="getTCData",r.GET_IN_APP_TC_DATA="getInAppTCData",r.GET_VENDOR_LIST="getVendorList",r.ADD_EVENT_LISTENER="addEventListener",r.REMOVE_EVENT_LISTENER="removeEventListener"},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=n(28),i=n(29),s=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.cmpStatus=i.CmpStatus.ERROR,t}return r(t,e),t}(o.Response);t.Disabled=s},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),o=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spread||function(){for(var e=[],t=0;t0)for(var n=e.getMaxVendorId(),r=function(n){var r=n.toString();e.getRestrictions(n).forEach(function(e){var n=e.purposeId.toString();t[n]||(t[n]={}),t[n][r]=e.restrictionType})},o=1;o<=n;o++)r(o);return t},t.prototype.createVectorField=function(e,t){return t?t.reduce(function(t,n){return t[n+""]=e.has(+n),t},{}):i(e).reduce(function(e,t){return e[t[0].toString(10)]=t[1],e},{})},t}(n(28).Response);t.TCData=a},function(e,t,n){"use strict";var r=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spread||function(){for(var e=[],t=0;tt.value))break;if(null===t.right){t.right=n;break}t=t.right}},t.prototype.get=function(){for(var e=[],t=this.root;t;)if(t.left){for(var n=t.left;n.right&&n.right!=t;)n=n.right;n.right==t?(n.right=null,e.push(t.value),t=t.right):(n.right=t,t=t.left)}else e.push(t.value),t=t.right;return e},t.prototype.contains=function(e){for(var t=!1,n=this.root;n;){if(n.value===e){t=!0;break}e>n.value?n=n.right:et.value)n=t,t=t.right,r="right";else{if(t.left||t.right)if(t.left)if(t.right){var o=this.min(t.right);this.remove(o,t.right),t.value=o}else n?n[r]=t.left:this.root=t.left;else n?n[r]=t.right:this.root=t.right;else n?n[r]=null:this.root=null;t=null}},t}(n(15).Cloneable);t.BinarySearchTree=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.cmpId="cmpId",e.cmpVersion="cmpVersion",e.consentLanguage="consentLanguage",e.consentScreen="consentScreen",e.created="created",e.supportOOB="supportOOB",e.isServiceSpecific="isServiceSpecific",e.lastUpdated="lastUpdated",e.numCustomPurposes="numCustomPurposes",e.policyVersion="policyVersion",e.publisherCountryCode="publisherCountryCode",e.publisherCustomConsents="publisherCustomConsents",e.publisherCustomLegitimateInterests="publisherCustomLegitimateInterests",e.publisherLegitimateInterests="publisherLegitimateInterests",e.publisherConsents="publisherConsents",e.publisherRestrictions="publisherRestrictions",e.purposeConsents="purposeConsents",e.purposeLegitimateInterests="purposeLegitimateInterests",e.purposeOneTreatment="purposeOneTreatment",e.specialFeatureOptins="specialFeatureOptins",e.useNonStandardStacks="useNonStandardStacks",e.vendorConsents="vendorConsents",e.vendorLegitimateInterests="vendorLegitimateInterests",e.vendorListVersion="vendorListVersion",e.vendorsAllowed="vendorsAllowed",e.vendorsDisclosed="vendorsDisclosed",e.version="version",e}();t.Fields=r},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=n(15),i=n(5),s=n(38),a=function(e){function t(t,n){var r=e.call(this)||this;return void 0!==t&&(r.purposeId=t),void 0!==n&&(r.restrictionType=n),r}return r(t,e),t.unHash=function(e){var n=e.split(this.hashSeparator),r=new t;if(2!==n.length)throw new i.TCModelError("hash",e);return r.purposeId=parseInt(n[0],10),r.restrictionType=parseInt(n[1],10),r},Object.defineProperty(t.prototype,"hash",{get:function(){if(!this.isValid())throw new Error("cannot hash invalid PurposeRestriction");return""+this.purposeId+t.hashSeparator+this.restrictionType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"purposeId",{get:function(){return this.purposeId_},set:function(e){this.purposeId_=e},enumerable:!0,configurable:!0}),t.prototype.isValid=function(){return Number.isInteger(this.purposeId)&&this.purposeId>0&&(this.restrictionType===s.RestrictionType.NOT_ALLOWED||this.restrictionType===s.RestrictionType.REQUIRE_CONSENT||this.restrictionType===s.RestrictionType.REQUIRE_LI)},t.prototype.isSameAs=function(e){return this.purposeId===e.purposeId&&this.restrictionType===e.restrictionType},t.hashSeparator="-",t}(o.Cloneable);t.PurposeRestriction=a},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.Segment||(t.Segment={})).CORE="core",r.VENDORS_DISCLOSED="vendorsDisclosed",r.VENDORS_ALLOWED="vendorsAllowed",r.PUBLISHER_TC="publisherTC"},function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(23)),r(n(59)),r(n(121)),r(n(39)),r(n(16)),r(n(60)),r(n(61)),r(n(63)),r(n(62))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(16),o=n(5),i=function(){function e(){}return e.encode=function(e,t){return r.IntEncoder.encode(Math.round(e.getTime()/100),t)},e.decode=function(e,t){if(t!==e.length)throw new o.DecodingError("invalid bit length");var n=new Date;return n.setTime(100*r.IntEncoder.decode(e,t)),n},e}();t.DateEncoder=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(16),o=n(5),i=function(){function e(){}return e.encode=function(e,t){var n=(e=e.toUpperCase()).charCodeAt(0)-65,i=e.charCodeAt(1)-65;if(n<0||n>25||i<0||i>25)throw new o.EncodingError("invalid language code: "+e);if(t%2==1)throw new o.EncodingError("numBits must be even, "+t+" is not valid");return t/=2,r.IntEncoder.encode(n,t)+r.IntEncoder.encode(i,t)},e.decode=function(e,t){if(t!==e.length||e.length%2)throw new o.DecodingError("invalid bit length for language");var n=e.length/2,i=r.IntEncoder.decode(e.slice(0,n),n)+65,s=r.IntEncoder.decode(e.slice(n),n)+65;return String.fromCharCode(i)+String.fromCharCode(s)},e}();t.LangEncoder=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(37),o=n(23),i=n(5),s=n(16),a=n(6),c=function(){function e(){}return e.encode=function(e){var t=s.IntEncoder.encode(e.numRestrictions,r.BitLength.numRestrictions);return e.isEmpty()||e.getRestrictions().forEach(function(n){t+=s.IntEncoder.encode(n.purposeId,r.BitLength.purposeId),t+=s.IntEncoder.encode(n.restrictionType,r.BitLength.restrictionType);for(var i=e.getVendors(n),a=i.length,c=0,u=0,p="",l=function(t){var n=i[t];0===u&&(c++,u=n);var l=i[a-1],d=e.gvl.vendorIds;if(t===a-1||i[t+1]>function(e){for(;++e<=l&&!d.has(e););return e}(n)){var f=!(n===u);p+=o.BooleanEncoder.encode(f),p+=s.IntEncoder.encode(u,r.BitLength.vendorId),f&&(p+=s.IntEncoder.encode(n,r.BitLength.vendorId)),u=0}},d=0;dd&&f=200&&s.status<300){var e=s.response;if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}o(e)}else i(new Error("HTTP Status: "+s.status+" response type: "+s.responseType))}),s.addEventListener("error",function(){i(new Error("error"))}),s.addEventListener("abort",function(){i(new Error("aborted"))}),null===t?s.open("GET",e,!0):s.open("POST",e,!0),s.responseType="json",s.timeout=r,s.ontimeout=function(){i(new Error("Timeout "+r+"ms "+e))},s.send(t)})},e.post=function(e,t,n,r){return void 0===n&&(n=!1),void 0===r&&(r=0),this.absCall(e,JSON.stringify(t),n,r)},e.fetch=function(e,t,n){return void 0===t&&(t=!1),void 0===n&&(n=0),this.absCall(e,null,t,n)},e}();t.Json=r},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){e.exports=["en","fr","de","it","es","da","nl","el","hu","pt","ro","fi","pl","sk","sv","no","ru","bg","ca","cs","et","hr","lt","lv","mt","sl","tr","zh"]},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],function(e){a.headers[e]={}}),r.forEach(["post","put","patch"],function(e){a.headers[e]=r.merge(i)}),e.exports=a}).call(this,n(133))},function(e,t,n){"use strict";var r=n(7),o=n(135),i=n(72),s=n(137),a=n(140),c=n(141),u=n(76);e.exports=function(e){return new Promise(function(t,p){var l=e.data,d=e.headers;r.isFormData(l)&&delete d["Content-Type"];var f=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",v=e.auth.password||"";d.Authorization="Basic "+btoa(h+":"+v)}var y=s(e.baseURL,e.url);if(f.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),f.timeout=e.timeout,f.onreadystatechange=function(){if(f&&4===f.readyState&&(0!==f.status||f.responseURL&&0===f.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in f?a(f.getAllResponseHeaders()):null,r={data:e.responseType&&"text"!==e.responseType?f.response:f.responseText,status:f.status,statusText:f.statusText,headers:n,config:e,request:f};o(t,p,r),f=null}},f.onabort=function(){f&&(p(u("Request aborted",e,"ECONNABORTED",f)),f=null)},f.onerror=function(){p(u("Network Error",e,null,f)),f=null},f.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),p(u(t,e,"ECONNABORTED",f)),f=null},r.isStandardBrowserEnv()){var g=n(142),m=(e.withCredentials||c(y))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;m&&(d[e.xsrfHeaderName]=m)}if("setRequestHeader"in f&&r.forEach(d,function(e,t){"undefined"===typeof l&&"content-type"===t.toLowerCase()?delete d[t]:f.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(f.withCredentials=!!e.withCredentials),e.responseType)try{f.responseType=e.responseType}catch(b){if("json"!==e.responseType)throw b}"function"===typeof e.onDownloadProgress&&f.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&f.upload&&f.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){f&&(f.abort(),p(e),f=null)}),void 0===l&&(l=null),f.send(l)})}},function(e,t,n){"use strict";var r=n(136);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t,n){"use strict";var r=n(7);e.exports=function(e,t){t=t||{};var n={},o=["url","method","params","data"],i=["headers","auth","proxy"],s=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(o,function(e){"undefined"!==typeof t[e]&&(n[e]=t[e])}),r.forEach(i,function(o){r.isObject(t[o])?n[o]=r.deepMerge(e[o],t[o]):"undefined"!==typeof t[o]?n[o]=t[o]:r.isObject(e[o])?n[o]=r.deepMerge(e[o]):"undefined"!==typeof e[o]&&(n[o]=e[o])}),r.forEach(s,function(r){"undefined"!==typeof t[r]?n[r]=t[r]:"undefined"!==typeof e[r]&&(n[r]=e[r])});var a=o.concat(i).concat(s),c=Object.keys(t).filter(function(e){return-1===a.indexOf(e)});return r.forEach(c,function(r){"undefined"!==typeof t[r]?n[r]=t[r]:"undefined"!==typeof e[r]&&(n[r]=e[r])}),n}},function(e,t,n){"use strict";function r(e){this.message=e}r.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},r.prototype.__CANCEL__=!0,e.exports=r},,,,,,,,function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),r(n(47)),r(n(27)),r(n(29)),r(n(106));var o=n(51);t.API_KEY=o.API_KEY},function(e,t,n){e.exports=n(128)},function(e,t){e.exports="data:image/svg+xml,%3Csvg viewBox='0 0 16 17' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='margin-right: 5px; height: 17px;'%3E%3Cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='cog' fill='%23FFFFFF' fill-rule='nonzero'%3E%3Cpath d='M15.596917,9.98326938 L14.5041079,9.33798816 C14.5728064,8.7815386 14.5728064,8.2184614 14.5041079,7.66201184 L15.596917,7.01673062 C15.9178229,6.82726259 16.0726124,6.43742732 15.9670848,6.0741546 C15.5912871,4.78033611 14.9223646,3.61573153 14.0390021,2.66061113 C13.7831755,2.38401797 13.3749053,2.32348965 13.0525249,2.51384881 L11.9613243,3.15813608 C11.5248519,2.81840117 11.0481221,2.53648663 10.542482,2.31910255 L10.542482,1.02991108 C10.542482,0.648438733 10.2860522,0.316869683 9.92305592,0.229024792 C8.66155,-0.07632446 7.33871809,-0.0763587342 6.07694408,0.229024792 C5.71398131,0.316869683 5.457518,0.648404458 5.457518,1.02991108 L5.457518,2.31910255 C4.95187406,2.53647872 4.47514334,2.81839382 4.03867572,3.15813608 L2.94747511,2.51384881 C2.62506122,2.32348965 2.21679094,2.38401797 1.96099786,2.66061113 C1.07763542,3.61573153 0.40871289,4.78037038 0.0329152236,6.0741546 C-0.072612407,6.43742732 0.0821770899,6.82722832 0.403082962,7.01673062 L1.49589212,7.66201184 C1.42719356,8.2184614 1.42719356,8.7815386 1.49589212,9.33798816 L0.403082962,9.98326938 C0.0821770899,10.1727374 -0.072612407,10.5625727 0.0329152236,10.9258454 C0.40871289,12.2196296 1.07763542,13.3842685 1.96099786,14.3393889 C2.21682445,14.615982 2.62509474,14.6765103 2.94747511,14.4861855 L4.03867572,13.8418982 C4.47514096,14.1816349 4.95187243,14.4635389 5.457518,14.6808975 L5.457518,15.9700889 C5.457518,16.3515613 5.7139478,16.6831303 6.07694408,16.7709752 C7.33848351,17.0763245 8.66128191,17.0763587 9.92305592,16.7709752 C10.2860187,16.6831303 10.542482,16.3515955 10.542482,15.9700889 L10.542482,14.6808975 C11.0481183,14.4635198 11.5248475,14.1816171 11.9613243,13.8418982 L13.0525249,14.4861855 C13.3749053,14.6765446 13.7831755,14.6160163 14.0390021,14.3393889 C14.9223646,13.3842685 15.5912871,12.2196296 15.9670848,10.9258454 C16.0726124,10.5625727 15.9178229,10.1727717 15.596917,9.98326938 Z M13.4026193,13.4264943 L11.8507364,12.510001 C10.9463288,13.3007421 10.6255905,13.4997041 9.47011484,13.9172673 L9.47011484,15.7502196 C8.50024808,15.9548373 7.49975192,15.9548373 6.52988516,15.7502196 L6.52988516,13.9172673 C5.4031959,13.5101235 5.07699522,13.3210668 4.14926358,12.510001 L2.59738075,13.4264943 C1.9368696,12.6693763 1.43490124,11.7817076 1.12525522,10.8230912 L2.67780828,9.90659789 C2.4588108,8.69270694 2.45871027,8.30790999 2.67780828,7.09340211 L1.12525522,6.17690879 C1.43490124,5.21829242 1.93690311,4.33058946 2.59738075,3.57312864 L4.14926358,4.49030745 C5.0667072,3.68712478 5.39129933,3.4941265 6.52988516,3.08269846 L6.52988516,1.24978037 C7.49971774,1.04482059 8.50028226,1.04482059 9.47011484,1.24978037 L9.47011484,3.08273274 C10.6087677,3.49419505 10.9333933,3.6872276 11.8507364,4.49034172 L13.4026193,3.57316291 C14.0630969,4.33058946 14.5650988,5.21829242 14.8747448,6.17694306 L13.3221917,7.09343638 C13.5412227,8.3076358 13.5412897,8.69212428 13.3221917,9.90663217 L14.8747448,10.8231255 C14.5650988,11.7817076 14.0631304,12.6694105 13.4026193,13.4264943 Z M8,5.20968958 C6.22607014,5.20968958 4.78289853,6.68570996 4.78289853,8.50001714 C4.78289853,10.3143243 6.22607014,11.7903447 8,11.7903447 C9.77392986,11.7903447 11.2171015,10.3143243 11.2171015,8.50001714 C11.2171015,6.68570996 9.77392986,5.20968958 8,5.20968958 Z M8,10.6935688 C6.81738009,10.6935688 5.85526568,9.70955526 5.85526568,8.50001714 C5.85526568,7.29047902 6.81738009,6.30646543 8,6.30646543 C9.18261991,6.30646543 10.1447343,7.29047902 10.1447343,8.50001714 C10.1447343,9.70955526 9.18261991,10.6935688 8,10.6935688 Z' id='Shape'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E"},,,,,,,,,,,function(e,t,n){var r=function(e){"use strict";var t=Object.prototype,n=t.hasOwnProperty,r="function"===typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",s=r.toStringTag||"@@toStringTag";function a(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{a({},"")}catch(P){a=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var o=t&&t.prototype instanceof l?t:l,i=Object.create(o.prototype),s=new S(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return L()}for(n.method=o,n.arg=i;;){var s=n.delegate;if(s){var a=C(s,n);if(a){if(a===p)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=u(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===p)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}(e,n,s),i}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(P){return{type:"throw",arg:P}}}e.wrap=c;var p={};function l(){}function d(){}function f(){}var h={};h[o]=function(){return this};var v=Object.getPrototypeOf,y=v&&v(v(I([])));y&&y!==t&&n.call(y,o)&&(h=y);var g=f.prototype=l.prototype=Object.create(h);function m(e){["next","throw","return"].forEach(function(t){a(e,t,function(e){return this._invoke(t,e)})})}function b(e,t){var r;this._invoke=function(o,i){function s(){return new t(function(r,s){!function r(o,i,s,a){var c=u(e[o],e,i);if("throw"!==c.type){var p=c.arg,l=p.value;return l&&"object"===typeof l&&n.call(l,"__await")?t.resolve(l.__await).then(function(e){r("next",e,s,a)},function(e){r("throw",e,s,a)}):t.resolve(l).then(function(e){p.value=e,s(p)},function(e){return r("throw",e,s,a)})}a(c.arg)}(o,i,r,s)})}return r=r?r.then(s,s):s()}}function C(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,C(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=u(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function _(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function E(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function S(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(_,this),this.reset(!0)}function I(e){if(e){var t=e[o];if(t)return t.call(e);if("function"===typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r=0;--o){var i=this.tryEntries[o],s=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var a=n.call(i,"catchLoc"),c=n.call(i,"finallyLoc");if(a&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),E(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;E(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:I(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},e}(e.exports);try{regeneratorRuntime=r}catch(o){Function("r","regeneratorRuntime = r")(r)}},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.CmpStatus||(t.CmpStatus={})).STUB="stub",r.LOADING="loading",r.LOADED="loaded",r.ERROR="error"},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.DisplayStatus||(t.DisplayStatus={})).VISIBLE="visible",r.HIDDEN="hidden",r.DISABLED="disabled"},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.EventStatus||(t.EventStatus={})).TC_LOADED="tcloaded",r.CMP_UI_SHOWN="cmpuishown",r.USER_ACTION_COMPLETE="useractioncomplete"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(30),o=function(){function e(){this.eventQueue=new Map,this.queueNumber=0}return e.prototype.add=function(e){return this.eventQueue.set(this.queueNumber,e),this.queueNumber++},e.prototype.remove=function(e){return this.eventQueue.delete(e)},e.prototype.exec=function(){this.eventQueue.forEach(function(e,t){new r.GetTCDataCommand(e.callback,e.param,t,e.next)})},e.prototype.clear=function(){this.queueNumber=0,this.eventQueue.clear()},Object.defineProperty(e.prototype,"size",{get:function(){return this.eventQueue.size},enumerable:!0,configurable:!0}),e}();t.EventListenerQueue=o},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),o=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spread||function(){for(var e=[],t=0;t0){var n=e.getMaxVendorId();e.getRestrictions().forEach(function(e){t[e.purposeId.toString()]="_".repeat(n)});for(var r=function(n){var r=n+1;e.getRestrictions(r).forEach(function(e){var r=e.restrictionType.toString(),o=e.purposeId.toString(),i=t[o].substr(0,n),s=t[o].substr(n+1);t[o]=i+r+s})},o=0;o=n))throw new Error("Invalid "+t+": "+e)},e.prototype.update=function(e,t){if(void 0===t&&(t=!1),r.CmpApiModel.disabled)throw new Error("CmpApi Disabled");r.CmpApiModel.cmpStatus=o.CmpStatus.LOADED,t?(r.CmpApiModel.displayStatus=o.DisplayStatus.VISIBLE,r.CmpApiModel.eventStatus=o.EventStatus.CMP_UI_SHOWN):void 0===r.CmpApiModel.tcModel?(r.CmpApiModel.displayStatus=o.DisplayStatus.DISABLED,r.CmpApiModel.eventStatus=o.EventStatus.TC_LOADED):(r.CmpApiModel.displayStatus=o.DisplayStatus.HIDDEN,r.CmpApiModel.eventStatus=o.EventStatus.USER_ACTION_COMPLETE),r.CmpApiModel.gdprApplies=null!==e,r.CmpApiModel.gdprApplies?(""===e?(r.CmpApiModel.tcModel=new s.TCModel,r.CmpApiModel.tcModel.cmpId=r.CmpApiModel.cmpId,r.CmpApiModel.tcModel.cmpVersion=r.CmpApiModel.cmpVersion):r.CmpApiModel.tcModel=s.TCString.decode(e),r.CmpApiModel.tcModel.isServiceSpecific=this.isServiceSpecific,r.CmpApiModel.tcfPolicyVersion=+r.CmpApiModel.tcModel.policyVersion,r.CmpApiModel.tcString=e):r.CmpApiModel.tcModel=null,0===this.numUpdates?this.callResponder.purgeQueuedCalls():r.CmpApiModel.eventQueue.exec(),this.numUpdates++},e.prototype.disable=function(){r.CmpApiModel.disabled=!0,r.CmpApiModel.cmpStatus=o.CmpStatus.ERROR},e}();t.CmpApi=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(108),o=n(30),i=n(109),s=n(110),a=n(125),c=n(126),u=n(48),p=function(){function e(){}var t,n,p,l,d,f;return t=u.TCFCommand.PING,n=u.TCFCommand.GET_TC_DATA,p=u.TCFCommand.GET_IN_APP_TC_DATA,l=u.TCFCommand.GET_VENDOR_LIST,d=u.TCFCommand.ADD_EVENT_LISTENER,f=u.TCFCommand.REMOVE_EVENT_LISTENER,e[t]=r.PingCommand,e[n]=o.GetTCDataCommand,e[p]=i.GetInAppTCDataCommand,e[l]=s.GetVendorListCommand,e[d]=a.AddEventListenerCommand,e[f]=c.RemoveEventListenerCommand,e}();t.CommandMap=p},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=n(27),i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.respond=function(){this.invokeCallback(new o.Ping)},t}(n(31).Command);t.PingCommand=i},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=n(30),i=n(27),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.respond=function(){this.throwIfParamInvalid(),this.invokeCallback(new i.InAppTCData(this.param))},t}(o.GetTCDataCommand);t.GetInAppTCDataCommand=s},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=n(13),i=n(31),s=n(52),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.respond=function(){var e,t=this,n=o.CmpApiModel.tcModel,r=n.vendorListVersion;void 0===this.param&&(this.param=r),(e=this.param===r&&n.gvl?n.gvl:new s.GVL(this.param)).readyPromise.then(function(){t.invokeCallback(e.getJson())})},t}(i.Command);t.GetVendorListCommand=a},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var n=e.call(this,t)||this;return n.name="DecodingError",n}return r(t,e),t}(Error);t.DecodingError=o},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var n=e.call(this,t)||this;return n.name="EncodingError",n}return r(t,e),t}(Error);t.EncodingError=o},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var n=e.call(this,t)||this;return n.name="GVLError",n}return r(t,e),t}(Error);t.GVLError=o},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,n,r){void 0===r&&(r="");var o=e.call(this,"invalid value "+n+" passed for "+t+" "+r)||this;return o.name="TCModelError",o}return r(t,e),t}(Error);t.TCModelError=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.has=function(t){return e.langSet.has(t)},e.prototype.forEach=function(t){e.langSet.forEach(t)},Object.defineProperty(e.prototype,"size",{get:function(){return e.langSet.size},enumerable:!0,configurable:!0}),e.langSet=new Set(["BG","CA","CS","DA","DE","EL","EN","ES","ET","FI","FR","HR","HU","IT","JA","LT","LV","MT","NL","NO","PL","PT","RO","RU","SK","SL","SV","TR","ZH"]),e}();t.ConsentLanguages=r},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),o=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(t,"__esModule",{value:!0});var i=n(56),s=n(54),a=n(38),c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.bitLength=0,t.map=new Map,t}return r(t,e),t.prototype.has=function(e){return this.map.has(e)},t.prototype.isOkToHave=function(e,t,n){var r,o=!0;if(null===(r=this.gvl)||void 0===r?void 0:r.vendors){var i=this.gvl.vendors[n];if(i)if(e===a.RestrictionType.NOT_ALLOWED)o=i.legIntPurposes.includes(t)||i.purposes.includes(t);else if(i.flexiblePurposes.length)switch(e){case a.RestrictionType.REQUIRE_CONSENT:o=i.flexiblePurposes.includes(t)&&i.legIntPurposes.includes(t);break;case a.RestrictionType.REQUIRE_LI:o=i.flexiblePurposes.includes(t)&&i.purposes.includes(t)}else o=!1;else o=!1}return o},t.prototype.add=function(e,t){if(this.isOkToHave(t.restrictionType,t.purposeId,e)){var n=t.hash;this.has(n)||(this.map.set(n,new s.BinarySearchTree),this.bitLength=0),this.map.get(n).add(e)}},t.prototype.restrictPurposeToLegalBasis=function(e){for(var t=this.gvl.vendorIds,n=e.hash,r=function(){var e,n,r;try{for(var i=o(t),s=i.next();!s.done;s=i.next())r=s.value}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}(),i=1;i<=r;i++)this.has(n)||(this.map.set(n,new s.BinarySearchTree),this.bitLength=0),this.map.get(n).add(i)},t.prototype.getVendors=function(e){var t=[];if(e){var n=e.hash;this.has(n)&&(t=this.map.get(n).get())}else{var r=new Set;this.map.forEach(function(e){e.get().forEach(function(e){r.add(e)})}),t=Array.from(r)}return t},t.prototype.getRestrictionType=function(e,t){var n;return this.getRestrictions(e).forEach(function(e){e.purposeId===t&&(void 0===n||n>e.restrictionType)&&(n=e.restrictionType)}),n},t.prototype.vendorHasRestriction=function(e,t){for(var n=!1,r=this.getRestrictions(e),o=0;o0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0},t.prototype.isSet=function(e){var t=!1;return e instanceof Set&&(t=Array.from(e).every(this.isValidNumber)),t},t.prototype.set=function(e){var t=this;if(Array.isArray(e))e.forEach(function(e){return t.set(e)});else if(this.isSet(e))this.set(Array.from(e));else if(this.isIntMap(e))this.set(Object.keys(e).map(function(e){return+e}));else{if(!this.isValidNumber(e))throw new s.TCModelError("set()",e,"must be positive integer array, positive integer, Set, or IntMap");this.set_.add(e),this.maxId_=Math.max(this.maxId,e),this.bitLength=0}},t.prototype.empty=function(){this.set_=new Set},t.prototype.forEach=function(e){for(var t=1;t<=this.maxId;t++)e(this.has(t),t)},Object.defineProperty(t.prototype,"size",{get:function(){return this.set_.size},enumerable:!0,configurable:!0}),t.prototype.setAll=function(e){this.set(e)},t}(i.Cloneable);t.Vector=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(53),o=n(37),i=n(58),s=n(64),a=n(5),c=n(55),u=n(6),p=function(){function e(){}return e.encode=function(e,t){var n,s=this;try{n=this.fieldSequence[""+e.version][t]}catch(n){throw new a.EncodingError("Unable to encode version: "+e.version+", segment: "+t)}var p="";return t!==u.Segment.CORE&&(p=i.IntEncoder.encode(u.SegmentIDs.KEY_TO_ID[t],o.BitLength.segmentType)),n.forEach(function(n){var r=e[n],u=i.FieldEncoderMap[n],l=o.BitLength[n];void 0===l&&s.isPublisherCustom(n)&&(l=+e[c.Fields.numCustomPurposes]);try{p+=u.encode(r,l)}catch(e){throw new a.EncodingError("Error encoding "+t+"->"+n+": "+e.message)}}),r.Base64Url.encode(p)},e.decode=function(e,t,n){var s=this,p=r.Base64Url.decode(e),l=0;return n===u.Segment.CORE&&(t.version=i.IntEncoder.decode(p.substr(l,o.BitLength[c.Fields.version]),o.BitLength[c.Fields.version])),n!==u.Segment.CORE&&(l+=o.BitLength.segmentType),this.fieldSequence[""+t.version][n].forEach(function(e){var n=i.FieldEncoderMap[e],r=o.BitLength[e];if(void 0===r&&s.isPublisherCustom(e)&&(r=+t[c.Fields.numCustomPurposes]),0!==r){var u=p.substr(l,r);if(n===i.VendorVectorEncoder?t[e]=n.decode(u,t.version):t[e]=n.decode(u,r),Number.isInteger(r))l+=r;else{if(!Number.isInteger(t[e].bitLength))throw new a.DecodingError(e);l+=t[e].bitLength}}}),t},e.isPublisherCustom=function(e){return 0===e.indexOf("publisherCustom")},e.fieldSequence=new s.FieldSequence,e}();t.SegmentEncoder=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(6),o=n(23),i=n(59),s=n(39),a=n(16),c=n(60),u=n(61),p=n(62),l=function(){function e(){}var t,n,l,d,f,h,v,y,g,m,b,C,_,E,S,I,L,P,w,A,k,O,T,V,x,R;return t=r.Fields.version,n=r.Fields.created,l=r.Fields.lastUpdated,d=r.Fields.cmpId,f=r.Fields.cmpVersion,h=r.Fields.consentScreen,v=r.Fields.consentLanguage,y=r.Fields.vendorListVersion,g=r.Fields.policyVersion,m=r.Fields.isServiceSpecific,b=r.Fields.useNonStandardStacks,C=r.Fields.specialFeatureOptins,_=r.Fields.purposeConsents,E=r.Fields.purposeLegitimateInterests,S=r.Fields.purposeOneTreatment,I=r.Fields.publisherCountryCode,L=r.Fields.vendorConsents,P=r.Fields.vendorLegitimateInterests,w=r.Fields.publisherRestrictions,A=r.Fields.vendorsDisclosed,k=r.Fields.vendorsAllowed,O=r.Fields.publisherConsents,T=r.Fields.publisherLegitimateInterests,V=r.Fields.numCustomPurposes,x=r.Fields.publisherCustomConsents,R=r.Fields.publisherCustomLegitimateInterests,e[t]=a.IntEncoder,e[n]=i.DateEncoder,e[l]=i.DateEncoder,e[d]=a.IntEncoder,e[f]=a.IntEncoder,e[h]=a.IntEncoder,e[v]=c.LangEncoder,e[y]=a.IntEncoder,e[g]=a.IntEncoder,e[m]=o.BooleanEncoder,e[b]=o.BooleanEncoder,e[C]=s.FixedVectorEncoder,e[_]=s.FixedVectorEncoder,e[E]=s.FixedVectorEncoder,e[S]=o.BooleanEncoder,e[I]=c.LangEncoder,e[L]=p.VendorVectorEncoder,e[P]=p.VendorVectorEncoder,e[w]=u.PurposeRestrictionVectorEncoder,e.segmentType=a.IntEncoder,e[A]=p.VendorVectorEncoder,e[k]=p.VendorVectorEncoder,e[O]=s.FixedVectorEncoder,e[T]=s.FixedVectorEncoder,e[V]=a.IntEncoder,e[x]=s.FixedVectorEncoder,e[R]=s.FixedVectorEncoder,e}();t.FieldEncoderMap=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(6);t.FieldSequence=function(){var e,t;this[1]=((e={})[r.Segment.CORE]=[r.Fields.version,r.Fields.created,r.Fields.lastUpdated,r.Fields.cmpId,r.Fields.cmpVersion,r.Fields.consentScreen,r.Fields.consentLanguage,r.Fields.vendorListVersion,r.Fields.purposeConsents,r.Fields.vendorConsents],e),this[2]=((t={})[r.Segment.CORE]=[r.Fields.version,r.Fields.created,r.Fields.lastUpdated,r.Fields.cmpId,r.Fields.cmpVersion,r.Fields.consentScreen,r.Fields.consentLanguage,r.Fields.vendorListVersion,r.Fields.policyVersion,r.Fields.isServiceSpecific,r.Fields.useNonStandardStacks,r.Fields.specialFeatureOptins,r.Fields.purposeConsents,r.Fields.purposeLegitimateInterests,r.Fields.purposeOneTreatment,r.Fields.publisherCountryCode,r.Fields.vendorConsents,r.Fields.vendorLegitimateInterests,r.Fields.publisherRestrictions],t[r.Segment.PUBLISHER_TC]=[r.Fields.publisherConsents,r.Fields.publisherLegitimateInterests,r.Fields.numCustomPurposes,r.Fields.publisherCustomConsents,r.Fields.publisherCustomLegitimateInterests],t[r.Segment.VENDORS_ALLOWED]=[r.Fields.vendorsAllowed],t[r.Segment.VENDORS_DISCLOSED]=[r.Fields.vendorsDisclosed],t)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(6);t.SegmentSequence=function(e,t){if(this[1]=[r.Segment.CORE],this[2]=[r.Segment.CORE],2===e.version)if(e.isServiceSpecific)this[2].push(r.Segment.PUBLISHER_TC);else{var n=!(!t||!t.isForVendors);n&&!0!==e[r.Fields.supportOOB]||this[2].push(r.Segment.VENDORS_DISCLOSED),n&&(e[r.Fields.supportOOB]&&e[r.Fields.vendorsAllowed].size>0&&this[2].push(r.Segment.VENDORS_ALLOWED),this[2].push(r.Segment.PUBLISHER_TC))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(5),o=n(6),i=function(){function e(){}return e.process=function(e,t){var n,o,i=e.gvl;if(!i)throw new r.EncodingError("Unable to encode TCModel without a GVL");if(!i.isReady)throw new r.EncodingError("Unable to encode TCModel tcModel.gvl.readyPromise is not resolved");(e=e.clone()).consentLanguage=i.language.toUpperCase(),(null===(n=t)||void 0===n?void 0:n.version)>0&&(null===(o=t)||void 0===o?void 0:o.version)<=this.processor.length?e.version=t.version:e.version=this.processor.length;var s=e.version-1;if(!this.processor[s])throw new r.EncodingError("Invalid version: "+e.version);return this.processor[s](e,i)},e.processor=[function(e){return e},function(e,t){e.publisherRestrictions.gvl=t,e.purposeLegitimateInterests.unset(1);var n=new Map;return n.set("legIntPurposes",e.vendorLegitimateInterests),n.set("purposes",e.vendorConsents),n.forEach(function(n,r){n.forEach(function(i,s){if(i){var a=t.vendors[s];if(!a||a.deletedDate)n.unset(s);else if(0===a[r].length)if(e.isServiceSpecific)if(0===a.flexiblePurposes.length)n.unset(s);else{for(var c=e.publisherRestrictions.getRestrictions(s),u=!1,p=0,l=c.length;p1)for(var n=1;n=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([n]):s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(7);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r=n(7);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var r=n(78);function o(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new r(e),t(n.reason))})}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o(function(t){e=t}),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function i(e){for(var t=1;tWhen you visit this website, we collect personal information such as IP addresses, cookie identifiers and other pseudonymous identifiers. This information may be used to personalize content based on your interests, run and optimize advertising campaigns tailored to you, measure the performance of ads and content, and derive insights about the audiences who engage with ads and content. This information may also be disclosed by us to third parties on the IAB’s List of Downstream Participants that may further disclose it to other third parties. Using personal information as described above is an integral part of how we operate our website, make revenue to support our staff, and generate relevant content for our audience. You can learn more about our data collection and use practices in our Privacy Policy.

','

If you wish to opt out of the disclosure of your personal information to third parties by us, please use the below opt out and confirm your selection. Please note that after your opt out request is processed, you may continue seeing interest-based ads based on personal Information utilized by us or personal information disclosed to third parties prior to your opt out. You may separately opt out of the further disclosure of your personal information by third parties on the IAB’s List of Downstream Participants.

'],uspDoNotSellToggleText:'I want to make a "Do Not Sell My Personal Information" request. Note: this action will make it harder to us to tailor content for you.',uspPrivacyPolicyLinkText:"Privacy Policy",uspDeleteDataLinkText:"Data Deletion",uspAccessDataLinkText:"Data Access",uspAcceptButton:"CONFIRM"},I={initScreenTitle:"We value your privacy",agreeButton:"AGREE",initScreenRejectButton:"DISAGREE",initScreenSettingsButton:"MORE OPTIONS",summaryScreenBodyNoRejectService:["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products."," With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners’ processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy.\n"],summaryScreenBodyNoRejectGroup:["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products."," With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners’ processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites [hyperlinked to domain where all the properties are listed for this group configuration].You can change your preferences at any time by returning to this site or visit our privacy policy."],summaryScreenBodyRejectService:["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products."," With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners’ processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy."],summaryScreenBodyRejectGroup:["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products."," With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners’ processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites [links to domain where all the properties are listed for this group configuration]. You can change your preferences at any time by returning to this site or visit our privacy policy."],initScreenBodyService:"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners’ processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to this website only. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.",initScreenBodyGroup:"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners’ processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to a group of websites [links to domain where all the properties are listed for this group configuration]. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.",specialPurposesAndFeatures:"Special Purposes and Features",saveAndExitButton:"SAVE & EXIT",purposeScreenVendorLink:"PARTNERS",legitimateInterestLink:"LEGITIMATE INTEREST ",specialPurposesLabel:"Special Purposes",specialFeaturesLabel:"Special Features",featuresLabel:"Features",back:"Back",onLabel:"ON",offLabel:"OFF",multiLabel:"MULTI",legalDescription:"Legal Description",showPartners:"Show Partners",hidePartners:"Hide Partners",vendorScreenBody:"Review and set your consent preferences for each partner below. Expand each partner list item for more information to help make your choice. Some personal data is processed without your consent, but you have the right to object.",privacyPolicyLabel:"Privacy Policy",descriptionLabel:"Vendor Description",legitimateScreenBody:"Review and object to processing of personal data without your consent on the basis of a legitimate interest for each purpose and by each partner below. Expand each purpose or partner list item for more information to help make your choice. To object to the special purposes of ensuring security, preventing fraud, and debugging, and technically delivering ads or content click on a partner's privacy policy link.",legitimateInterestPurposesLabel:"Legitimate Interest Purpose(s)",legitimateInterestVendorLabel:"Legitimate Interest Vendors",legitimateScreenObject:"OBJECT (translation hint: verb to object)",legitimateScreenObjected:"OBJECTED",legitimateScreenAccept:"REMOVE OBJECTION",objectAllButton:"OBJECT ALL",persistentConsentLinkLabel:"Privacy",nonIabVendorsNotice:"Vendors who do not participate in the IAB Europe Transparency and Consent Framework and do not adhere to its policies or technical specifications",googlePartners:"Google Partners",cookieMaxAgeLabel:"Max cookie age",secondsLabel:"seconds",daysLabel:"days",storageDisclosureLabel:"Cookie disclosure"},L={nonIabVendorListUrl:"",vendorBlacklist:[],vendorWhitelist:[],googleWhitelist:[1]},P={uxBackgroundColor:"#fff",uxPrimaryButtonColor:"#206DC5",uxPrimaryButtonTextColor:"#fff",uxSecondaryButtonColor:"#fff",uxSecondaryButtonTextColor:"#206DC5",uxToogleActiveColor:"#206DC5",uxLinkColor:"#206DC5",uxFontColor:"#141e23"},w=parseInt("".concat("33")),A=Number.isNaN(w)?1:w,k="CMPList",O="euconsent-v2",T="noniabvendorconsent",V="eupubconsent",x="_cmpRepromptHash",R="usprivacy",U="addtl_consent",M=n(70),D={quantcastAccountId:{type:"string",values:""},consentScope:{type:"string",values:[v.SERVICE,v.SERVICE_GROUP]},defaultToggleValue:{type:"string",values:["on","off"]},displayUi:{type:"string",values:["never","inEU","always"]},displayPersistentConsentLink:{type:"boolean",values:""},groupSitesUrl:{type:"string",values:""},hashCode:{type:"string",values:""},initScreenRejectButtonShowing:{type:"boolean",values:""},isAMP:{type:"boolean",values:""},initScreenBodyTextOption:{type:"number",values:""},lang_:{type:"string",values:M},nonconsentDisplayFrequency:{type:"number",values:""},persistentConsentLinkLocation:{type:"number",values:[1,2,3,4]},publisherLogo:{type:"string",values:""},publisherName:{type:"string",values:""},publisherFeaturesIds:{type:"array",values:[1,2,3]},publisherSpecialFeaturesIds:{type:"array",canBeEmpty:!0,values:[1,2]},publisherSpecialPurposesIds:{type:"array",values:[1,2]},publisherPurposeIds:{type:"array",canBeEmpty:!0,values:[1,2,3,4,5,6,7,8,9,10]},publisherPurposeLegitimateInterestIds:{type:"array",canBeEmpty:!0,values:[1,2,3,4,5,6,7,8,9,10]},publisherVendorListUrl:{type:"string",values:""},publisherCountryCode:{type:"string",values:["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","AN","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SK","SI","SB","SO","ZA","GS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"]},vendorPurposeIds:{type:"array",canBeEmpty:!0,values:[1,2,3,4,5,6,7,8,9,10]},vendorPurposeLegitimateInterestIds:{type:"array",canBeEmpty:!0,values:[1,2,3,4,5,6,7,8,9,10]},vendorSpecialFeaturesIds:{type:"array",canBeEmpty:!0,values:[1,2]},vendorSpecialPurposesIds:{type:"array",canBeEmpty:!0,values:[1,2]},vendorFeaturesIds:{type:"array",canBeEmpty:!0,values:[1,2,3]},rejectConsentRedirectUrl:{type:"string",values:""},stacks:{type:"array",values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42]},softOptInEnabled:{type:"boolean",values:""},uiLayout:{type:"string",values:["popup","banner"]},vendorListUpdateFreq:{type:"number",values:""},consentScopeGroupURL:{type:"string",values:""},cookieDomain:{type:"string",values:""},cookiePath:{type:"string",values:""},thirdPartyStorageType:{type:"string",values:["iframe","api"]},showSummaryView:{type:"boolean",values:""},privacyMode:{type:"array",values:[y.GDPR,y.USP]},uspVersion:{type:"number",values:[1]},uspJurisdiction:{type:"array",values:["US","CA"]},uspLspact:{type:"string",values:[h.YES,h.NOT]},uspPrivacyPolicyLink:{type:"string",values:""},uspDeleteDataLink:{type:"string",values:""},uspAccessDataLink:{type:"string",values:""},suppressCcpaLinks:{type:"boolean",values:""},googleEnabled:{type:"boolean",values:""},publisherConsentRestrictionIds:{type:"array",values:"",arrayType:"number"},publisherLIRestrictionIds:{type:"array",values:"",arrayType:"number"},consentOnSafari:{type:"boolean",values:""}},F={acceptAll:{type:"string"},initScreenRejectButton:{type:"string"},initScreenSettingsButton:{type:"string"},initScreenTitle:{type:"string"},persistentConsentLinkLabel:{type:"string"},customInitScreenBodyText:{type:"string"},customSecondScreenBodyText:{type:"string"},customVendorScreenBodyText:{type:"string"},customLegitimateScreenBodyText:{type:"string"},summaryScreenBodyNoRejectService:{type:"array",values:""},summaryScreenBodyNoRejectGroup:{type:"array",values:""},summaryScreenBodyRejectService:{type:"array",values:""},summaryScreenBodyRejectGroup:{type:"array",values:""},groupOfSitesLabel:{type:"string"},saveAndExitButton:{type:"string"},agreeToSelectedButton:{type:"string"},agreeButton:{type:"string"},agreeAllButton:{type:"string"},rejectAll:{type:"string"},objectAllButton:{type:"string"}},N={nonIabVendorListUrl:{type:"string",values:""},vendorWhitelist:{type:"array",values:"",arrayType:"number"},vendorBlacklist:{type:"array",values:"",arrayType:"number"},googleWhitelist:{type:"array",values:"",arrayType:"number"}},B={initScreenCustomLinks:{type:"array",values:"",arrayType:"object"},linksTitle:{type:"string"},nonIabVendorsLabel:{type:"string"},uspDnsTitle:{type:"string"},uspDnsText:{type:"array",values:"",arrayType:"string"},uspDoNotSellToggleText:{type:"string"},uspPrivacyPolicyLinkText:{type:"string"},uspDeleteDataLinkText:{type:"string"},uspAccessDataLinkText:{type:"string"},uspAcceptButton:{type:"string"}},j={uxBackgroundColor:{type:"string",values:""},uxPrimaryButtonColor:{type:"string",values:""},uxPrimaryButtonTextColor:{type:"string",values:""},uxSecondaryButtonColor:{type:"string",values:""},uxSecondaryButtonTextColor:{type:"string",values:""},uxToogleActiveColor:{type:"string",values:""},uxLinkColor:{type:"string",values:""},uxFontColor:{type:"string",values:""}},G={nonIabVendorList:{type:"array",values:"",arrayType:"object"},updateAt:{type:"string",values:""},nonIabVendorsHash:{type:"string",values:""}},H=function(e,t,n){if(t in n){var r=e[t],o=n[t].type,i=n[t].values;return""!==r&&(typeof r===o?"number"===o&&r<0?(console.warn("".concat(t," must be a valid number")),!1):""===i||(!!i.includes(r)||(console.warn("".concat(t," must be a valid value")),!1)):(console.warn("".concat(t," must be ").concat(o)),!1))}return console.warn("".concat(t," is not a valid config value")),!1},q=function(e,t,n){var r=e[t];if(Array.isArray(r)){if(!r.length)return!0===n[t].canBeEmpty&&r;var o=[];return r.forEach(function(e){"string"===typeof n[t].values?typeof e===n[t].arrayType?o.push(e):console.warn("".concat(e," ").concat("is not a valid value for"," ").concat(t)):n[t].values.includes(e)?o.push(e):console.warn("".concat(e," ").concat("is not a valid value for"," ").concat(t))}),!!o.length&&o}return console.warn("".concat(t," must be an array")),!1},z=function(){function e(t){var n=this;p(this,e),this._coreConfig=void 0,this._premiumProperties=void 0,this._coreUiLabels=void 0,this._premiumUiLabels=void 0,this._theme=void 0,this._nonIabVendorsInfo=void 0,this._ampData=void 0,this.cleanConfig=void 0,this.checkRequiredValues=function(){var e=n.cleanConfig.coreConfig;"consentScope"in e||(n.cleanConfig.coreConfig.consentScope=v.SERVICE),"privacyMode"in e||(n.cleanConfig.coreConfig.privacyMode=[y.GDPR])},this.validateConfig=function(e){var t={},r={},o={},i={},s={},a=void 0,c=void 0;return e.coreConfig&&(t=n.filterConfig(e.coreConfig,D)),e.coreUiLabels&&(r=n.filterLabels(e.coreUiLabels,F)),e.premiumProperties&&(o=n.filterConfig(e.premiumProperties,N)),e.premiumUiLabels&&(i=n.filterLabels(e.premiumUiLabels,B)),e.theme&&(s=n.filterConfig(e.theme,j)),e.nonIabVendorsInfo&&(a=n.filterConfig(e.nonIabVendorsInfo,G)),e.ampData&&(c=e.ampData),{coreConfig:t,coreUiLabels:r,premiumProperties:o,premiumUiLabels:i,theme:s,nonIabVendorsInfo:a,ampData:c}},this.filterConfig=function(e,t){var n={};for(var r in e)if(r in t)if("array"===t[r].type){var o=q(e,r,t);o&&(n[r]=o)}else H(e,r,t)&&(n[r]=e[r]);return n},this.filterLabels=function(e,t){var n={};for(var r in e)if(r in t)if("string"===t[r].type)""!==e[r]?n[r]=e[r]:console.warn("".concat(r," cannot be empty"));else{var o=q(e,r,t);o&&(n[r]=o)}return n},this.getCustomCoreUiLabels=function(){return n.cleanConfig.coreUiLabels},this.initializeConfig=function(){Object.keys(n.cleanConfig).forEach(function(e){n[e]&&(n[e]=i(i({},n[e]),n.cleanConfig[e]))})},this.cleanConfig=this.validateConfig(t),this.checkRequiredValues();var r=this.cleanConfig,o=r.coreConfig,s=o.privacyMode,a=o.consentScope,c=o.quantcastAccountId,u=r.nonIabVendorsInfo,l=r.ampData;s.includes(y.GDPR)&&s.includes(y.USP)?(this._coreConfig=i(i({quantcastAccountId:c,consentScope:a,privacyMode:s},_),C),this._premiumUiLabels=i(i({},S),E),this._premiumProperties=i({},L),this._coreUiLabels=i({},I),this._theme=i({},P),u&&(this._nonIabVendorsInfo=u)):s.includes("GDPR")?(this._coreConfig=i({quantcastAccountId:c,consentScope:a,privacyMode:s},_),this._premiumUiLabels=i({},E),this._premiumProperties=i({},L),this._coreUiLabels=i({},I),this._theme=i({},P),u&&(this._nonIabVendorsInfo=u)):(this._coreConfig=i({quantcastAccountId:c,consentScope:a,privacyMode:s},C),this._premiumUiLabels=i({},S),this._premiumProperties={},this._coreUiLabels={},this._theme=i({},P)),l&&(this._ampData=l)}return d(e,[{key:"getCustomPremiumUiLabels",value:function(){return this.cleanConfig.premiumUiLabels}},{key:"coreConfig",get:function(){return this._coreConfig},set:function(e){var t=this,n=["publisherLogo","publisherName","publisherFeaturesIds","publisherSpecialFeaturesIds","publisherSpecialPurposesIds","publisherPurposeIds","publisherPurposeLegitimateInterestIds","publisherVendorListUrl","publisherVendorListUrl","publisherCountryCode","vendorPurposeIds","vendorPurposeLegitimateInterestIds","vendorSpecialFeaturesIds","vendorSpecialPurposesIds","vendorFeaturesIds","rejectConsentRedirectUrl","stacks"],r=["nonconsentDisplayFrequency","vendorListUpdateFreq"];Object.keys(e).forEach(function(o){if(e[o]!==t.coreConfig[o]){if(-1!==n.indexOf(o)&&(""===e[o]||e[o]===[]))throw new Error("".concat(o," cannot be empty"));if(r.indexOf(o)&&e[o]<0)throw new Error("".concat(o," cannot be a negative number"))}}),this._coreConfig=e}},{key:"premiumProperties",get:function(){return this._premiumProperties},set:function(e){var t=this;Object.keys(e).forEach(function(n){if(t.premiumProperties[n]!==e[n]&&(""===e[n]||e[n]===[]))throw new Error("".concat(n," cannot be empty"))}),this._premiumProperties=e}},{key:"coreUiLabels",get:function(){return this._coreUiLabels},set:function(e){var t=this;Object.keys(e).forEach(function(n){if(t.coreUiLabels[n]!==e[n]&&""===e[n])throw new Error("".concat(n," cannot be empty"))}),this._coreUiLabels=e}},{key:"theme",get:function(){return this._theme},set:function(e){var t=this;Object.keys(e).forEach(function(n){if(t.theme[n]!==e[n]&&""===e[n])throw new Error("".concat(n," cannot be empty"))}),this._theme=e}},{key:"nonIabVendorsInfo",get:function(){return this._nonIabVendorsInfo},set:function(e){this._nonIabVendorsInfo=e}},{key:"ampData",get:function(){return this._ampData},set:function(e){this._ampData=e}},{key:"premiumUiLabels",get:function(){return this._premiumUiLabels},set:function(e){var t=this;Object.keys(e).forEach(function(n){if(t.premiumUiLabels[n]!==e[n]&&!e[n].length)throw new Error("".concat(n," cannot be empty"))}),this._premiumUiLabels=e}}]),e}(),J=n(20),W=n(33),Y=n(70),K=function(){function e(){var t=this;p(this,e),this.__tcfapiui=void 0,this.__tcfapiui=function(e){for(var n=t.__tcfapiui.a=t.__tcfapiui.a||[],r=arguments.length,o=new Array(r>1?r-1:0),i=1;i1&&void 0!==l[1]?l[1]:1,i=l.length>2&&void 0!==l[2]&&l[2],e.createUiScriptBlock(),s=null===(r=Ne.coreConfig.privacyMode)||void 0===r?void 0:r.includes(n),Fe.updateApiVisible(n,s),s){t.next=8;break}return console.warn("attempt to show disabled CMP UI regulation=".concat(n)),t.abrupt("return");case 8:if(!(c="GDPR"===n)||We){t.next=12;break}return t.next=12,Ye(!0);case 12:if(!c){t.next=18;break}return t.next=15,Fe.loadGVL();case 15:t.t0=t.sent,t.next=19;break;case 18:t.t0=void 0;case 19:if(u=t.t0,t.t1=n,t.t2=o,t.t3=i,t.t4=Ne,t.t5=u,!c){t.next=31;break}return t.next=28,Fe.getConsents();case 28:t.t6=t.sent,t.next=32;break;case 31:t.t6={};case 32:t.t7=t.t6,t.t8=c?He.data.data.nonIabVendorList:{},t.t9=c?Ke.fetchPartners():void 0,p={regulation:t.t1,page:t.t2,isMandatory:t.t3,config:t.t4,gvl:t.t5,consentInfo:t.t7,nonIabVendorList:t.t8,googleData:t.t9},window.__tcfapiui("displayUi",p);case 37:case"end":return t.stop()}},t)}));return function(e){return t.apply(this,arguments)}}()}],[{key:"createUiScriptBlock",value:function(){var e=window.document;if(!e.getElementById("__tcfapiuiscript")){var t=document.createElement("script"),n=(Ne.coreConfig.lang_||"en").toLowerCase();Y.includes(n)||(n="en");var r="https://quantcast.mgr.consensu.org/tcfv2/33/cmp2ui.js";r=r.replace(".js","-".concat(n,".js")),t.type="text/javascript",t.id="__tcfapiuiscript",t.src=r,e.head.appendChild(t)}}}]),e}(),Q=n(87),Z=n.n(Q).a.create({xsrfCookieName:null}),X=function(e){Object({NODE_ENV:"production",PUBLIC_URL:"",AMP_FRAME_URL_BASE:"https://quantcast.mgr.consensu.org/tcfv2/33",AMP_CHECK_CONSENT_URL:"https://apis.quantcast.mgr.consensu.org/amp/check-consent",LOCAL_STATIC_DIR:"",REACT_APP_LOG_API:"https://audit-tcfv2.quantcast.mgr.consensu.org",REACT_APP_GEOIP_API_URL:"https://apis.quantcast.mgr.consensu.org/geoip",REACT_APP_GOOGLE_ATP_URL:"https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json",REACT_APP_VERSION:"33",REACT_APP_CMPUI_SRC:"https://quantcast.mgr.consensu.org/tcfv2/33/cmp2ui.js",REACT_APP_GVL_BASE_URL:"https://quantcast.mgr.consensu.org/GVL-v2/",REACT_APP_TRANSLATION_BASE_URL:"https://www.quantcast.mgr.consensu.org/tcfv2/translations/"}).REACT_APP_DEBUG&&console.log("Debug: "+e)},$=function(){function e(t){switch(p(this,e),this._isUserInEU=void 0,this._isUserInUS=void 0,this._userSpecificLocation=void 0,this._userSpecificLocation=null,t){case"inUS":this._isUserInEU=false,this._isUserInUS=false;break;case"inEU":this._isUserInEU=false,this._isUserInUS=false;break;default:this._isUserInEU=false,this._isUserInUS=false}}return d(e,[{key:"checkSpecificLocation",value:function(){var e=u(a.a.mark(function e(){var t,n,r;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Ne.coreConfig.privacyMode,this._userSpecificLocation){e.next=23;break}if(X("initUspLocation: exact location request"),!t.includes("USP")){e.next=23;break}if(n=Ne.coreConfig.uspJurisdiction,!this.isUserInUS){e.next=22;break}if(n.includes("US")){e.next=19;break}return e.prev=7,e.next=10,Z.get("https://apis.quantcast.mgr.consensu.org/geoip");case 10:r=e.sent,this._userSpecificLocation=r.data,e.next=17;break;case 14:e.prev=14,e.t0=e.catch(7),console.log(e.t0);case 17:e.next=20;break;case 19:this._userSpecificLocation="US";case 20:e.next=23;break;case 22:this._userSpecificLocation="non-US";case 23:return e.abrupt("return",this._userSpecificLocation);case 24:case"end":return e.stop()}},e,this,[[7,14]])}));return function(){return e.apply(this,arguments)}}()},{key:"isUserInEU",set:function(e){X("this should only be used for testing"),this._isUserInEU=e},get:function(){return this._isUserInEU}},{key:"isUserInUS",set:function(e){X("this should only be used for testing"),this._isUserInUS=e},get:function(){return this._isUserInUS}},{key:"userSpecificLocation",set:function(e){X("this should only be used for testing"),this._userSpecificLocation=e},get:function(){return this._userSpecificLocation}}]),e}();function ee(e){return function(e,t){return te="",ne(t).dispatch(e),function(e){return btoa(function(e){for(var t="",n=0;n>8*o&255);return t}(function(e){var t,n=e.length,r=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=e.length;t+=64)re(r,ue(e.substring(t-64,t)));e=e.substring(t-64);var o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(re(r,o),t=0;t<16;t++)o[t]=0;return o[14]=8*n,re(r,o),r}(e)))}(te)}(e)}var te="";function ne(e,t,n){n=n||[];var r=function(e){te+=e};return{dispatch:function(e){var t=typeof e;return null===e&&(t="null"),this["_"+t](e)},_object:function(e){var t=Object.prototype.toString.call(e),o=/\[object (.*)\]/i.exec(t);o=(o=o?o[1]:"unknown:["+t+"]").toLowerCase();var i;if((i=n.indexOf(e))>=0)return this.dispatch("[CIRCULAR:"+i+"]");if(n.push(e),"object"===o||"function"===o||"asyncfunction"===o){var s=Object.keys(e);r("object:"+s.length+":");var a=this;return s.forEach(function(t){a.dispatch(t),r(":"),a.dispatch(e[t]),r(",")})}if(!this["_"+o])throw new Error('Unknown object type "'+o+'"');this["_"+o](e)},_array:function(e){var t=this;return r("array:"+e.length+":"),e.forEach(function(e){return t.dispatch(e)})},_date:function(e){return r("date:"+e.toJSON())},_symbol:function(e){return r("symbol:"+e.toString())},_error:function(e){return r("error:"+e.toString())},_boolean:function(e){return r("bool:"+e.toString())},_string:function(e){r("string:"+e.length+":"),r(e.toString())},_function:function(e){r("fn:"),this.dispatch(e.toString())},_number:function(e){return r("number:"+e.toString())},_xml:function(e){return r("xml:"+e.toString())},_null:function(){return r("Null")},_undefined:function(){return r("Undefined")},_regexp:function(e){return r("regex:"+e.toString())},_uint8array:function(e){return r("uint8array:"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return r("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return r("uint8array:"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return r("uint16array:"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return r("uint16array:"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return r("uint32array:"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return r("uint32array:"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return r("float32array:"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return r("float64array:"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return r("arraybuffer:"),this.dispatch(new Uint8Array(e))},_url:function(e){return r("url:"+e.toString())},_map:function(e){r("map:");var t=Array.from(e);return this._array(t)},_set:function(e){r("set:");var t=Array.from(e);return this._array(t)}}}function re(e,t){var n=e[0],r=e[1],o=e[2],i=e[3];n=ie(n,r,o,i,t[0],7,-680876936),i=ie(i,n,r,o,t[1],12,-389564586),o=ie(o,i,n,r,t[2],17,606105819),r=ie(r,o,i,n,t[3],22,-1044525330),n=ie(n,r,o,i,t[4],7,-176418897),i=ie(i,n,r,o,t[5],12,1200080426),o=ie(o,i,n,r,t[6],17,-1473231341),r=ie(r,o,i,n,t[7],22,-45705983),n=ie(n,r,o,i,t[8],7,1770035416),i=ie(i,n,r,o,t[9],12,-1958414417),o=ie(o,i,n,r,t[10],17,-42063),r=ie(r,o,i,n,t[11],22,-1990404162),n=ie(n,r,o,i,t[12],7,1804603682),i=ie(i,n,r,o,t[13],12,-40341101),o=ie(o,i,n,r,t[14],17,-1502002290),n=se(n,r=ie(r,o,i,n,t[15],22,1236535329),o,i,t[1],5,-165796510),i=se(i,n,r,o,t[6],9,-1069501632),o=se(o,i,n,r,t[11],14,643717713),r=se(r,o,i,n,t[0],20,-373897302),n=se(n,r,o,i,t[5],5,-701558691),i=se(i,n,r,o,t[10],9,38016083),o=se(o,i,n,r,t[15],14,-660478335),r=se(r,o,i,n,t[4],20,-405537848),n=se(n,r,o,i,t[9],5,568446438),i=se(i,n,r,o,t[14],9,-1019803690),o=se(o,i,n,r,t[3],14,-187363961),r=se(r,o,i,n,t[8],20,1163531501),n=se(n,r,o,i,t[13],5,-1444681467),i=se(i,n,r,o,t[2],9,-51403784),o=se(o,i,n,r,t[7],14,1735328473),n=ae(n,r=se(r,o,i,n,t[12],20,-1926607734),o,i,t[5],4,-378558),i=ae(i,n,r,o,t[8],11,-2022574463),o=ae(o,i,n,r,t[11],16,1839030562),r=ae(r,o,i,n,t[14],23,-35309556),n=ae(n,r,o,i,t[1],4,-1530992060),i=ae(i,n,r,o,t[4],11,1272893353),o=ae(o,i,n,r,t[7],16,-155497632),r=ae(r,o,i,n,t[10],23,-1094730640),n=ae(n,r,o,i,t[13],4,681279174),i=ae(i,n,r,o,t[0],11,-358537222),o=ae(o,i,n,r,t[3],16,-722521979),r=ae(r,o,i,n,t[6],23,76029189),n=ae(n,r,o,i,t[9],4,-640364487),i=ae(i,n,r,o,t[12],11,-421815835),o=ae(o,i,n,r,t[15],16,530742520),n=ce(n,r=ae(r,o,i,n,t[2],23,-995338651),o,i,t[0],6,-198630844),i=ce(i,n,r,o,t[7],10,1126891415),o=ce(o,i,n,r,t[14],15,-1416354905),r=ce(r,o,i,n,t[5],21,-57434055),n=ce(n,r,o,i,t[12],6,1700485571),i=ce(i,n,r,o,t[3],10,-1894986606),o=ce(o,i,n,r,t[10],15,-1051523),r=ce(r,o,i,n,t[1],21,-2054922799),n=ce(n,r,o,i,t[8],6,1873313359),i=ce(i,n,r,o,t[15],10,-30611744),o=ce(o,i,n,r,t[6],15,-1560198380),r=ce(r,o,i,n,t[13],21,1309151649),n=ce(n,r,o,i,t[4],6,-145523070),i=ce(i,n,r,o,t[11],10,-1120210379),o=ce(o,i,n,r,t[2],15,718787259),r=ce(r,o,i,n,t[9],21,-343485551),e[0]=pe(n,e[0]),e[1]=pe(r,e[1]),e[2]=pe(o,e[2]),e[3]=pe(i,e[3])}function oe(e,t,n,r,o,i){return t=pe(pe(t,e),pe(r,i)),pe(t<>>32-o,n)}function ie(e,t,n,r,o,i,s){return oe(t&n|~t&r,e,t,o,i,s)}function se(e,t,n,r,o,i,s){return oe(t&r|n&~r,e,t,o,i,s)}function ae(e,t,n,r,o,i,s){return oe(t^n^r,e,t,o,i,s)}function ce(e,t,n,r,o,i,s){return oe(n^(t|~r),e,t,o,i,s)}function ue(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function pe(e,t){return e+t&4294967295}var le=function(){function e(){p(this,e),this._values=void 0,this._values={euconsent:"",nonIabVendorConsent:"",nonIabVendorsHash:"",fetched:!1,promise:Promise.resolve()}}return d(e,[{key:"values",set:function(e){this._values=e},get:function(){return this._values}}]),e}();function de(e,t,n,r){var o=n&&document.getElementById(n);return o||(o=document.createElement(e),t&&(o.className=t),n&&(o.id=n),r&&r.insertBefore(o,r.firstChild)),o}var fe=function(e){var t=e.coreConfig,n=t.publisherFeaturesIds,r=t.publisherSpecialFeaturesIds,o=t.publisherSpecialPurposesIds,i=t.publisherPurposeIds,s=t.publisherPurposeLegitimateInterestIds,a=t.vendorPurposeIds,c=t.vendorPurposeLegitimateInterestIds,u=t.vendorSpecialFeaturesIds,p=t.vendorSpecialPurposesIds,l=t.vendorFeaturesIds,d=[n,r,o,i,s,a,c,u,p,l],f=(a||[]).length;return d.forEach(function(e){var t;(t=e)&&t.sort(function(e,t){return e-t})}),{purposeIds:(f?a:i)||[],purposeLegitimateInterestIds:(f?c:s)||[],specialFeaturesIds:(f?u:r)||[],specialPurposesIds:(f?p:o)||[],featuresIds:(f?l:n)||[]}},he=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r="".concat(e[0],"~"),o=e.match(/\d+/g);if(o.shift(),n)return"".concat(r).concat(null===o||void 0===o?void 0:o.join("."));var i=null===o||void 0===o?void 0:o.reduce(function(e,n,r,o){if(0===r)return t=parseInt(n,10),e.concat(n);var i=o[r]?parseInt(n,10)+t:null;return t=i,i?e.concat(".".concat(i)):e},r);return i};function ve(e,t){return t&&"string"===typeof t?e(t):null}var ye,ge,me,be,Ce,_e,Ee,Se,Ie,Le,Pe=function(){function e(){p(this,e),this.data=void 0,this._repromptOptionsHash=void 0,this._storedHash=void 0,this.data=new le,this._repromptOptionsHash="",this._storedHash=""}return d(e,[{key:"shouldReprompt",value:function(){var e=this.generateRepromptOptionsHash(),t=!1;return this._storedHash!==e&&(t=!0),t}},{key:"generateRepromptOptionsHash",value:function(){var e=this.data.values,t=e.euconsent,n=e.nonIabVendorConsent,r=e.nonIabVendorsHash,o=Ne.coreConfig,i=o.stacks,s=o.initScreenBodyTextOption,a=Ne.premiumProperties,c=a.vendorWhitelist,u=a.vendorBlacklist,p=fe(Ne),l=p.purposeIds,d=p.purposeLegitimateInterestIds,f=p.specialFeaturesIds,h=p.specialPurposesIds,v=p.featuresIds,y=this.createNewHash([i,l,d,f,h,v,c,u]),g=t;return g="".concat(g,".").concat(s,".").concat(y),g=n?"".concat(g,".").concat(n):g,g=r?"".concat(g,".").concat(r):g,this._repromptOptionsHash=g}},{key:"createNewHash",value:function(e){return ee(e)}},{key:"setValues",value:function(e){this.data.values=e}},{key:"getValues",value:function(){return this.data.values}},{key:"storedHash",set:function(e){this._storedHash=e},get:function(){return this._storedHash}}]),e}(),we=n(21),Ae=function(){function e(){p(this,e),this.LOWERCASE_START=97,this.PAD_ZEROS="00000000000000000000000000000000000000000000000000",this.COOKIE_MAX_AGE=33696e3,this.bitSizes={cmpId:12,created:36,consentScreen:6,consentLanguage:12,cmpVersion:12,cmpVersionOld:6,consentValue:1,defaultConsent:1,endVendorId:16,encodingType:1,isRange:1,lastUpdated:36,maxVendorId:16,numberCustomPurposes:6,numEntries:12,publisherPurposesVersion:12,purposesAlowed:24,standardPurposesAllowed:24,startVendorId:16,version:6,vendorListVersion:12},this._binaryStr=void 0,this._bitPosition=void 0,this.TCString=void 0,this._binaryStr="",this._bitPosition=0,this.TCString=new we.TCString}return d(e,[{key:"encode",value:function(e,t){var n,r;switch(e.cookieName){case T:n=dt(["cookieName","created","lastUpdated","cmpId","cmpVersion","maxVendorId","vendorConsents"],e),r="nonIabVendorToBinary";break;case V:n=dt(["cookieName","publisherPurposesVersion","standardPurposesAllowed","numberCustomPurposes","version","created","lastUpdated","cmpId","cmpVersion","consentScreen","consentLanguage","vendorListVersion","customPurposeConsents"],e),r="publisherConsentToBinary";break;case O:n=dt(["cookieName","vendorConsents","purposeConsents","specialFeatureOptins","purposeLegitimateInterests","vendorLegitimateInterests","purposeLegitimateInterests","publisherConsent","publisherLegitimate","publisherPurposeIds","publisherPurposeLegitimateInterestIds"],e),r="encodeEuConsent";break;case U:n=dt(["cookieName","vendorConsents","version"],e),r="encodeGoogleConsent"}if(r&&n){if(n.notFound)return new Error("".concat(n.notFound," keys not found"));if(r.includes("ToBinary")){var o=this[r]({verifiedObject:n,metadataOnly:t}),i=this.binaryToBytes(o);return this.toWebSafeBase64(i)}return this[r](n)}return new Error("Invalid cookie name")}},{key:"decode",value:function(e,t){var n="";switch(e){case T:n="decodeNonIabVendorBinary";break;case V:n="decodePublisherBinary";break;case O:n="decodeEuConsent";break;case U:n="decodeGoogleConsent"}if(n){if(n.includes("Binary")){var r=this.fromWebSafeBase64(t),o=this.bytesToBinary(r);return this[n](o)}return this[n](t)}return new Error("Invalid cookie name")}},{key:"addBinaryField",value:function(e,t,n){var r=(e||0).toString(2);if(!(r.length<=t))throw new Error("Encountered an overflow setting cookie field ".concat(n));r=this.PAD_ZEROS.substr(0,t-r.length)+r,this.binaryStr+=r}},{key:"encodeGoogleConsent",value:function(e){var t="".concat(e.version,"~");return Ne.coreConfig.isAMP?"".concat(t).concat(e.vendorConsents.join(".")):e.vendorConsents.reduce(function(e,t,n,r){if(0===n)return e.concat(t);var o=r[n]?t-r[n-1]:null;return o?e.concat(".".concat(o)):e},t)}},{key:"decodeGoogleConsent",value:function(e){var t,n=null===(t=he(e,Ne.coreConfig.isAMP).match(/\d+/g))||void 0===t?void 0:t.map(function(e){return parseInt(e,10)});return{version:null===n||void 0===n?void 0:n.shift(),consentIds:n}}},{key:"encodeEuConsent",value:function(e){var t=i({},e.vendorConsents),n=i({},e.vendorLegitimateInterests);e.vendorConsents=t,e.vendorLegitimateInterests=n;var o=function(t){for(var n in e[t])e[t][n]?We[t].set(parseInt(n)):We[t].unset(parseInt(n))};return[{value:e.publisherConsent,tcModelName:"publisherConsents",reduceArray:e.publisherPurposeIds},{value:e.publisherLegitimate,tcModelName:"publisherLegitimateInterests",reduceArray:e.publisherPurposeLegitimateInterestIds}].forEach(function(t){void 0!==t.value&&(e[t.tcModelName]=t.reduceArray.reduce(function(e,n){return i(i({},e),{},r({},n,t.value))},{}))}),o("vendorConsents"),o("purposeConsents"),o("specialFeatureOptins"),o("vendorLegitimateInterests"),o("purposeLegitimateInterests"),o("publisherConsents"),o("publisherLegitimateInterests"),yt(We)}},{key:"decodeEuConsent",value:function(e){return gt(e)}},{key:"nonIabVendorToBinary",value:function(e){var t=e.verifiedObject,n=e.metadataOnly;if(this.binaryStr="",this.addBinaryField(pt(t.created),this.bitSizes.created,"created"),this.addBinaryField(pt(t.lastUpdated),this.bitSizes.lastUpdated,"lastUpdated"),this.addBinaryField(t.cmpId,this.bitSizes.cmpId,"cmpId"),this.addBinaryField(t.cmpVersion,this.bitSizes.cmpVersion,"cmpVersion"),n)return this.binaryStr;this.addBinaryField(t.maxVendorId,this.bitSizes.maxVendorId,"maxVendorId");for(var r=1;r<=t.maxVendorId;r++)this.binaryStr+=t.vendorConsents[r]?"1":"0";return this.binaryStr}},{key:"decodeNonIabVendorBinary",value:function(e){this.bitPosition=0;for(var t={created:lt(this.getBits(this.bitSizes.created,e)),lastUpdated:lt(this.getBits(this.bitSizes.lastUpdated,e)),cmpId:this.getBits(this.bitSizes.cmpId,e),cmpVersion:this.getBits(this.bitSizes.cmpVersion,e),maxVendorId:this.getBits(this.bitSizes.maxVendorId,e),vendorConsents:[void 0]},n=t.maxVendorId||1,r=new Array(n),o=0;o>>4&15]+t[15&e]}},{key:"getBits",value:function(e,t){var n=parseInt(t.substr(this.bitPosition,e),2);return this.bitPosition+=e,n}},{key:"toWebSafeBase64",value:function(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}},{key:"fromWebSafeBase64",value:function(e){return atob(e.replace(/-/g,"+").replace(/_/g,"/"))}},{key:"languageToCookieValue",value:function(e){return 64*(e.charCodeAt(0)-this.LOWERCASE_START)+(e.charCodeAt(1)-this.LOWERCASE_START)}},{key:"languageFromCookieValue",value:function(e){return String.fromCharCode(this.LOWERCASE_START+e/64>>>0)+String.fromCharCode(this.LOWERCASE_START+e%64)}},{key:"deleteCookie",value:function(e,t){document.cookie="".concat(e,"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; max-age=-1; domain=").concat(t)}},{key:"fallbackToLocalStorage",value:function(e,t){this.saveOnLocalStorage(e,t)&&this.deleteCookie(e)}},{key:"saveOnLocalStorage",value:function(e,t){try{return window.localStorage.setItem(e,t),!0}catch(n){return console.warn("Could not save data on local storage: Not enough space."),!1}}},{key:"set",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=!1;n&&(r=this.saveOnLocalStorage(e,t)),r||vt({cookieName:e,encodedValue:t,maxAge:this.COOKIE_MAX_AGE})}},{key:"get",value:function(e){if(window.localStorage.getItem(e))return window.localStorage.getItem(e);var t=e.trim(),n=document.cookie.split(";").filter(function(e){return e.trim().startsWith(t+"=")}).map(function(e){return e.trim().substring(t.length+1)});if(n.length){var r="";return r=e===O?bt(n):n[0],e!==O&&e!==R&&e!==U&&this.fallbackToLocalStorage(t,r),r}return new Error("".concat(e," not found."))}},{key:"bitPosition",get:function(){return this._bitPosition},set:function(e){this._bitPosition=e}},{key:"binaryStr",set:function(e){this._binaryStr=e},get:function(){return this._binaryStr}}]),e}();function ke(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o,i=!0,s=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return i=e.done,e},e:function(e){s=!0,o=e},f:function(){try{i||null==r.return||r.return()}finally{if(s)throw o}}}}function Ve(e){return function(e){if(Array.isArray(e))return ke(e)}(e)||function(e){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||Oe(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function xe(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(c){o=!0,i=c}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}}(e,t)||Oe(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}!function(e){e.GO_TO_PAGE="goToPage",e.PURPOSE="purpose",e.LEGITIMATE_PURPOSE="legitimatePurpose",e.LEGITIMATE_VENDOR="legitimateVendor",e.SPECIAL_FEATURE="specialFeature",e.STACK="stack",e.PARTIAL_CONSENT="partial",e.SAVE_AND_EXIT="saveAndExit",e.ACCEPT_ALL="acceptAll",e.REJECT_ALL="rejectAll",e.ACCEPT_ALL_LEGITIMATE="acceptAllLegitimate",e.OBJECT_ALL_LEGITIMATE="objectAllLegitimate",e.ACCEPT_ALL_VENDORS="acceptAllVendors",e.REJECT_ALL_VENDORS="rejectAllVendors",e.ACCEPT_ALL_PURPOSES="acceptAllPurposes",e.REJECT_ALL_PURPOSES="rejectAllPurposes",e.VENDOR="vendor",e.NON_IAB_VENDOR="nonIabVendor",e.DISMISS_UI="dismissUi",e.START_ON_PAGE="startOnPage",e.OPT_OUT_TOGGLE="optOutToggle",e.OPT_OUT_CONFIRM="optOutConfirm",e.EXPAND_ELEMENT="expandElement",e.COLLAPSE_ELEMENT="collapseElement",e.GOOGLE="googlePartner"}(ye||(ye={})),function(e){e.MANDATORY="tcfui:mandatory",e.CHANGE_OF_CONSENT="tcfui:changeofconsent",e.CCPA="uspui:donotsell"}(ge||(ge={})),function(e){e.FEATURES="Features",e.NON_IAB="Non IAB",e.PURPOSES="Purposes",e.LEGITIMATE_PURPOSES="Legitimate Purposes",e.LEGITIMATE_VENDORS="Legitimate Vendors",e.SPECIAL_PURPOSES="Special Purposes",e.SPECIAL_FEATURES="Special Features",e.VENDORS="Vendors",e.STACKS="Stacks",e.GOOGLE="Google"}(me||(me={})),function(e){e.INIT="init",e.NAVIGATION="navigation",e.DONE="done"}(be||(be={})),function(e){e.ACCEPT_ALL="All",e.ACCEPT_PARTIAL="Partial",e.REJECT="Reject"}(Ce||(Ce={})),function(e){e.NONE_OBJECTED="None",e.ALL_OBJECTED="All"}(_e||(_e={})),function(e){e.STACKS="stacks",e.VENDORS="vendors",e.FEATURES="features",e.PURPOSES="purposes",e.SPECIAL_FEATURES="specialFeatures",e.SPECIAL_PURPOSES="specialPurposes",e.FLEXIBLE_PURPOSES="flexiblePurposes",e.LEGITIMATE_VENDORS="legitimateVendors",e.LEGITIMATE_PURPOSES="legitimatePurposes",e.UNFILTERED_FEATURES="unfilteredFeatures",e.UNFILTERED_PURPOSES="unfilteredPurposes",e.UNFILTERED_SPECIAL_FEATURES="unfilteredSpecialFeatures",e.UNFILTERED_SPECIAL_PURPOSES="unfilteredSpecialPurposes"}(Ee||(Ee={})),function(e){e.CONSENT_RESPONSE="consent-response",e.CONSENT_UI="consent-ui"}(Se||(Se={})),function(e){e[e.GDPR=2]="GDPR",e[e.USP=3]="USP"}(Ie||(Ie={})),function(e){e.ACCEPT="accept",e.REJECT="reject",e.DISMISS="dismiss",e.ENTER_FULLSCREEN="enter-fullscreen"}(Le||(Le={}));var Re=n(88),Ue=n.n(Re),Me={en:"Privacy",fr:"Confidentialité",de:"Datenschutz",it:"Riservatezza",es:"Privacidad",da:"Privatlivets fred",nl:"Privacy",el:"Απόρρητο",hu:"Adatvédelem",pt:"Privacidade",ro:"Confidențialitate",fi:"Yksityisyys",pl:"Prywatność",sk:"Súkromie",sv:"Integritet",no:"Personvern",ru:"Конфиденциальность",ar:"إعدادات الخصوصية",fa:"تنظیمات حریم خصوصی"};function De(e,t,n){var o,i=function(){var e="qc-cmp2-container";return de("div",e,e,document.body)}(),s="qc-cmp2-persistent-link",a=de("a",s,s,i);if(a.firstChild)return a;a.onclick=function(){return window.__tcfapi("displayConsentUi",2,function(){})};var c=de("img",void 0,void 0,a),u=e||Me[(t||"en").toLowerCase()]||Me.en;c.src=Ue.a,c.alt=u;var p=document.createTextNode(u);a.appendChild(p);var l=de("style",void 0,"qc-cmp2",document.head),d=xe((o={},r(o,f.TOP_LEFT,["top","left"]),r(o,f.TOP_RIGHT,["top","right"]),r(o,f.BOTTOM_LEFT,["bottom","left"]),r(o,f.BOTTOM_RIGHT,["bottom","right"]),o)[n],2),h=d[0],v=d[1],y="top"===h?"bottom":"top";return l.innerHTML=".qc-cmp2-persistent-link {cursor:pointer; position:fixed; background-color:#368BD6;padding:5px 15px; color:#FFF; display:flex;align-items:center; max-height:30px; z-index:2147483640;"+"".concat(h,":0; ").concat(v,":0;")+"border-".concat(y,"-left-radius:3px;")+"border-".concat(y,"-right-radius:3px;")+"}.qc-cmp2-persistent-link img {width:16px; height:17px; margin-right:5px;}",a}var Fe,Ne,Be,je,Ge,He,qe,ze,Je,We,Ye,Ke,Qe=function(){function e(){var t=this;p(this,e),this._cookieValues=void 0,this._deletedVendors=void 0,this.isSafari=void 0,this.resolveCookie=void 0,this._fetchCookiesCalled=void 0,this.resolveCookie=function(){},this._cookieValues={euconsent:"",nonIabVendorConsent:"",googleCookieValue:"",fetched:!1,promise:new Promise(function(e){return t.resolveCookie=e})},this._deletedVendors=[],this.isSafari=mt("safari"),this._fetchCookiesCalled=!1}return d(e,[{key:"getCoreConfig",value:function(){return Ne.coreConfig}},{key:"getConsents",value:function(){var e=u(a.a.mark(function e(){var t,n,o,s,c,u,p,l,d,f,h,v,y,g,m,C,_;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=me.VENDORS,n=me.LEGITIMATE_VENDORS,o=me.LEGITIMATE_PURPOSES,s=me.PURPOSES,c=me.SPECIAL_FEATURES,u=me.NON_IAB,p=me.GOOGLE,this._cookieValues.fetched){e.next=4;break}return e.next=4,this._cookieValues.promise;case 4:return l=ve(ze.decode,this._cookieValues.euconsent),d=new b,f=We.gvl,h=Ne.coreConfig.publisherName||Ne.coreConfig.cookieDomain||"",v=Ne.coreConfig,y=v.publisherPurposeIds,g=v.publisherPurposeLegitimateInterestIds,m=f.vendors,(y||g)&&(m=i(i({},m),{},r({},h,{id:h,name:h}))),this.populateCoreConsents(d,t,m,l),this.populateCoreConsents(d,s,f.purposes,l),this.populateCoreConsents(d,c,f.specialFeatures,l),this.populateCoreConsents(d,n,m,l),this.populateCoreConsents(d,o,f.purposes,l),C=ve(He.decode,this._cookieValues.nonIabVendorConsent),this.populateCoreConsents(d,u,He.data.data.nonIabVendorList,C),_=ve(Ke.decode,this._cookieValues.googleCookieValue),this.populateCoreConsents(d,p,[],_),e.abrupt("return",d);case 21:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"extractNumericKeys",value:function(e){var t={};for(var n in e){var r=parseInt(n);isNaN(r)||(t[n]=e[n])}return t}},{key:"setConsents",value:function(e){var t=Ne.coreConfig,n=t.publisherPurposeIds,r=t.publisherPurposeLegitimateInterestIds,o=t.publisherName,s=t.isAMP;e.consentScreen&&(We.consentScreen=e.consentScreen);var a,c=ze.encode(this.extractNumericKeys(e.vendorConsents),this.extractNumericKeys(e.purposesConsents),this.extractNumericKeys(e.specialFeatures),this.extractNumericKeys(e.vendorLegitimateInterest),this.extractNumericKeys(e.legitimatePurposesConsents),e.vendorConsents[o],e.vendorLegitimateInterest[o],n,r),u=this.formatConsents(e.nonIabConsents),p=Ne.premiumProperties.nonIabVendorListUrl?He.encode(u.consentArray,u.maxVendorId):"",l=this.formatGoogleConsents(e),d=Ne.coreConfig.googleEnabled?Ke.encode(l):"",f=He.data.data.nonIabVendorsHash;return l.length||s||Ge.deleteCookie(U,Ne.coreConfig.cookieDomain),Je.setValues({euconsent:c,nonIabVendorConsent:p,nonIabVendorsHash:f}),a=Je.generateRepromptOptionsHash(),this.setData(c,p,a,d),this.updateApiVisible("GDPR",!1),i(i({},this._cookieValues),{},{allConsents:e.allConsents})}},{key:"updateApiVisible",value:function(e,t){if("USP"!==e&&ft(Be.isUserInEU,Ne.coreConfig.displayUi)){var n=this._cookieValues.euconsent;n&&!n.message||(n=""),Et.cmpApi.update(n,t)}else Et.cmpApi.update(null);Ne.coreConfig.privacyMode.includes("GDPR")&&Ne.coreConfig.displayPersistentConsentLink&&!Ne.coreConfig.isAMP&&this.hasCookie()&&De(Ne.getCustomCoreUiLabels().persistentConsentLinkLabel,Ne.coreConfig.lang_,Ne.coreConfig.persistentConsentLinkLocation)}},{key:"setData",value:function(e,t,n,r){var o=Ne.coreConfig,i=o.consentScope,s=o.thirdPartyStorageType,a=o.consentScopeGroupURL,c=o.consentOnSafari,u=o.isAMP,p="api"===s,l=this.isSafari&&c;u||(l?this.setDataUsingApi(!0,a,e,t,n,r):i===v.SERVICE||this.isSafari?this.setDataUsingFirstParty(e,t,n,r):i===v.SERVICE_GROUP&&(p?this.setDataUsingApi(!0,a,e,t,n,r):this.setDataUsingIframe(e,t,n,r))),this._cookieValues={euconsent:e,nonIabVendorConsent:t,googleCookieValue:r,fetched:!0,promise:this._cookieValues.promise}}},{key:"setDataUsingApi",value:function(e,t,n,r,o,i){var s={};n&&(s[O]=n),r&&(s[T]=r),o&&(s[x]=o),i&&(s[U]=i),Z({method:"post",url:t,data:s,withCredentials:e}).then(function(){console.log("the cookies was saved successfully")})}},{key:"setDataUsingIframe",value:function(e,t,n,r){e&&st.tryGroupCookieAccessCall("set",O,e),t&&st.tryGroupCookieAccessCall("set",T,t),n&&st.tryGroupCookieAccessCall("set",x,n),r&&st.tryGroupCookieAccessCall("set",U,r)}},{key:"setDataUsingFirstParty",value:function(e,t,n,r){e&&ze.setCookie(e),t&&He.setCookie(t),n&&Ge.set(x,n),r&&Ke.setCookie(r)}},{key:"fetchCookieValues",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o,i,s,c,u,p,l,d,f,h;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Ne.coreConfig,n=t.consentScope,r=t.consentScopeGroupURL,o=t.thirdPartyStorageType,i=t.consentOnSafari,s=t.isAMP,c=Ne.ampData,u="",p="",l="",d={},f=function(e){u=e.nonIabCookieValue,p=e.vendorCookieValue,l=e.googleCookieValue},h=this.isSafari&&i,this._fetchCookiesCalled=!0,!s){e.next=12;break}c.consentMetadata&&c.consentMetadata.consentStringType===Ie.GDPR&&(p=c.consentString,c.consentMetadata.additionalConsent&&(l=c.consentMetadata.additionalConsent)),e.next=36;break;case 12:if(!h){e.next=19;break}return e.next=15,this.getDataUsingApi(!0,r);case 15:d=e.sent,f(d),e.next=36;break;case 19:if(n!==v.SERVICE&&!this.isSafari){e.next=24;break}d=this.getDataUsingFirstParty(),f(d),e.next=36;break;case 24:if(n!==v.SERVICE_GROUP){e.next=36;break}if("api"!==o){e.next=32;break}return e.next=28,this.getDataUsingApi(!0,r);case 28:d=e.sent,f(d),e.next=36;break;case 32:return e.next=34,this.getDataUsingIframe();case 34:d=e.sent,f(d);case 36:this._cookieValues={euconsent:p,nonIabVendorConsent:u,googleCookieValue:l,fetched:!0,promise:this._cookieValues.promise},this.resolveCookie();case 38:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"getDataUsingApi",value:function(){var e=u(a.a.mark(function e(t,n){var r,o,i;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Z({method:"get",url:n,withCredentials:t});case 2:return r=e.sent,o={},i=r.data[x],Je.storedHash=i,o.vendorCookieValue=r.data[O],o.nonIabCookieValue=r.data[T],o.googleCookieValue=r.data.addtl_consent,e.abrupt("return",o);case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()},{key:"getDataUsingIframe",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o,i,s;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t=Ne.coreConfig.googleEnabled,n=Ne.premiumProperties.nonIabVendorListUrl,r={},e.next=4,st.tryGroupCookieAccessCall("get",x,"");case 4:return o=e.sent,Je.storedHash=o,e.next=8,st.tryGroupCookieAccessCall("get",O,"");case 8:if(r.vendorCookieValue=e.sent,!n){e.next=15;break}return e.next=12,st.tryGroupCookieAccessCall("get",T,"");case 12:(i=e.sent)&&Array.isArray(i)?i=i[0]:i||(i=null),r.nonIabCookieValue=i;case 15:if(!t){e.next=21;break}return e.next=18,st.tryGroupCookieAccessCall("get",U,"");case 18:(s=e.sent)&&Array.isArray(s)?s=s[0]:s||(s=null),r.googleCookieValue=s;case 21:return e.abrupt("return",r);case 22:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}()},{key:"getDataUsingFirstParty",value:function(){var e={},t=Ne.coreConfig.googleEnabled,n=Ne.premiumProperties.nonIabVendorListUrl,r=Ge.get(O),o=Ge.get(x),i=Ge.get(T),s=Ge.get(U);return Je.storedHash=o,"string"===typeof r&&(e.vendorCookieValue=r),t&&"string"===typeof s&&(e.googleCookieValue=s),n&&"string"===typeof i&&(e.nonIabCookieValue=i),e}},{key:"repromptDueToInvalidCMPID",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o,i,s,c,u,p;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Ne.coreConfig.isAMP,n=!1,t){e.next=25;break}if(r="https://test.quantcast.mgr.consensu.org/GVL-v2/cmp-list.json",o=[],i=new Date,s=Ge.get(k),!((c=s&&!s.message?JSON.parse(s):null)&&c.CMP&&c.CMP.includes(String(We.cmpId))&&i.getTime()864e5*t){e.next=11;break}return e.abrupt("return",{outdatedGvlReprompt:r,decodedEuConsent:n});case 11:return e.next=13,this.loadGVL();case 13:u=We.gvl,p=u.vendorListVersion,l=u.tcfPolicyVersion,c&&(p>o||l>i)&&(r=!0),e.next=18;break;case 17:r=!0;case 18:return e.abrupt("return",{outdatedGvlReprompt:r,decodedEuConsent:n});case 19:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"repromptDueToConsentOnDeletedVendors",value:function(e){var t,n=!1,r=Te(this._deletedVendors);try{for(r.s();!(t=r.n()).done;){var o=t.value;if(e.has(o)){n=!0;break}}}catch(i){r.e(i)}finally{r.f()}return n}},{key:"fetchDataToReprompt",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o,s;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.repromptDueToOutdatedGvl();case 2:return t=e.sent,n=t.outdatedGvlReprompt,r=t.decodedEuConsent,e.next=7,this.repromptDueToInvalidCMPID();case 7:return o=e.sent,(s=n||o)||(s=this.repromptDueToConsentOnDeletedVendors(r.vendorConsents.set_))||(Je.setValues(i(i({},this._cookieValues),{},{nonIabVendorsHash:He.data.data.nonIabVendorsHash})),s=Je.shouldReprompt()),e.abrupt("return",s);case 11:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"populateCoreConsents",value:function(e,t,n,r){var o,i=me.NON_IAB,s=me.PURPOSES,a=me.LEGITIMATE_PURPOSES,c=me.LEGITIMATE_VENDORS,u=me.VENDORS,p=me.SPECIAL_FEATURES,l=me.GOOGLE,d="",f="";switch(t){case i:o="nonIabConsents",d="vendorConsents";break;case u:o="vendorConsents",d="vendorConsents",f="publisherConsents";break;case s:o="purposesConsents",d="purposeConsents";break;case a:o="legitimatePurposesConsents",d="purposeLegitimateInterests";break;case c:o="vendorLegitimateInterest",d="vendorLegitimateInterests",f="publisherLegitimateInterests";break;case p:o="specialFeatures",d="specialFeatureOptins";break;case l:o="googleConsents",d="consentIds";break;default:o=""}var h=null!==r&&!r.message,v=Ne.coreConfig.publisherName;if(e[o].hasCookie=h,h)switch(t){case i:if(n){var y,g=Te(n);try{for(g.s();!(y=g.n()).done;){var m=y.value,b=r[d][m.id];e[o][m.id]=b}}catch(E){g.e(E)}finally{g.f()}}break;case l:r.consentIds&&r.consentIds.forEach(function(t){e[o][t]=!0});break;default:for(var C in n){var _=C===v&&f?Ve(r[f].set_).length>0:r[d].has(parseInt(C));e[o][C]=_}}}},{key:"formatConsents",value:function(e){var t=0,n=[];for(var r in e){var o=parseInt(r);isNaN(o)||(o>t&&(t=o),n.push({consent:e[r],id:o}))}return{consentArray:n,maxVendorId:t}}},{key:"formatGoogleConsents",value:function(e){var t=[];for(var n in e.googleConsents)!0===e.googleConsents[n]&&t.push(n);return t.sort(function(e,t){return e-t}),t}},{key:"regulationToInit",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Ne.coreConfig.privacyMode,n="",!t.includes("USP")){e.next=14;break}if(r=Ne.coreConfig.uspJurisdiction,!Be.isUserInUS||!r.length){e.next=14;break}if(X("initUspLocation: US"),r.includes("US")){e.next=13;break}return e.next=9,Be.checkSpecificLocation();case 9:X("initUspLocation: specific location"+JSON.stringify(Be.userSpecificLocation)),Be.userSpecificLocation&&Be.userSpecificLocation.region&&r.includes(Be.userSpecificLocation.region.toUpperCase())&&(n="USP"),e.next=14;break;case 13:n="USP";case 14:return t.includes("GDPR")&&"USP"!==n&&(o=Ne.coreConfig.displayUi,(Be.isUserInEU&&"inEU"===o||"always"===o)&&(n="GDPR")),e.abrupt("return",n);case 16:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}()},{key:"loadGVL",value:function(){var e=u(a.a.mark(function e(){var t,n,r,o,i,s,c;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Ne.coreConfig,n=t.privacyMode,r=t.lang_,o=Ne.premiumProperties,i=o.vendorWhitelist,s=o.vendorBlacklist,c=null===r||void 0===r?void 0:r.toUpperCase(),We.gvl){e.next=12;break}return We.gvl=new J.GVL("LATEST"),e.next=6,We.gvl.readyPromise;case 6:if(!n.includes("GDPR")){e.next=10;break}return e.next=9,We.gvl.changeLanguage(c);case 9:this.filterGvl(We.gvl,i,s);case 10:e.next=14;break;case 12:return e.next=14,We.gvl.readyPromise;case 14:return e.abrupt("return",We.gvl);case 15:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"filterGvl",value:function(e,t,n){var r=e.vendors,o=[],i=[];Object.keys(r).forEach(function(e){r[e].deletedDate?i.push(r[e].id):o.push(r[e].id)}),this.deletedVendors=i,t.length&&(o=t.filter(function(e){return o.includes(e)})),n.length?e.narrowVendorsTo(o.filter(function(e){return!n.includes(e)})):e.narrowVendorsTo(o)}},{key:"hasCookie",value:function(){return!!this._cookieValues.euconsent}},{key:"setPublisherRestriction",value:function(e){We.publisherRestrictions.add(e.id,e.purposeRestriction)}},{key:"deletedVendors",set:function(e){this._deletedVendors=e}},{key:"cookieValues",get:function(){return this._cookieValues}},{key:"fetchCookiesCalled",get:function(){return this._fetchCookiesCalled}}]),e}(),Ze=function(){function e(){p(this,e),this._data=void 0,this._fields=void 0,this._fields={created:new Date,lastUpdated:new Date,cmpId:10,cmpVersion:26,maxVendorId:0,vendorConsents:[]},this._data={nonIabVendorList:[],updateAt:"",nonIabVendorsHash:""}}return d(e,[{key:"data",set:function(e){this._data=e},get:function(){return this._data}},{key:"fields",set:function(e){this._fields=e},get:function(){return this._fields}}]),e}(),Xe=function(){function e(){p(this,e),this._data=void 0,this.created=void 0,this._data=new Ze,this.created=!1}return d(e,[{key:"encode",value:function(e,t){var n=[];return e.forEach(function(e){n[e.id]=e.consent}),!1===this.created?(this.created=!0,this._data.fields=i(i({},this._data.fields),{},{vendorConsents:n,created:new Date,lastUpdated:new Date,maxVendorId:t})):this._data.fields=i(i({},this._data.fields),{},{vendorConsents:n,lastUpdated:new Date}),Ge.encode(i({cookieName:T},this._data.fields))}},{key:"decode",value:function(e){return Ge.decode(T,e)}},{key:"setCookie",value:function(e){"string"===typeof e?Ge.set(T,e):console.error(e.message)}},{key:"getCookie",value:function(){var e=Ge.get(T);return e&&"string"===typeof e?this.decode(e):e}},{key:"fetchList",value:function(){var e=u(a.a.mark(function e(){var t,n,r;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(Ne.premiumProperties.nonIabVendorListUrl||Ne.nonIabVendorsInfo){e.next=2;break}return e.abrupt("return");case 2:if(e.prev=2,"undefined"===typeof Ne.nonIabVendorsInfo){e.next=9;break}if(Ne.nonIabVendorsInfo.nonIabVendorList&&0!==Ne.nonIabVendorsInfo.nonIabVendorList.length){e.next=6;break}return e.abrupt("return");case 6:t=Ne.nonIabVendorsInfo,e.next=13;break;case 9:return e.next=11,Z.get(Ne.premiumProperties.nonIabVendorListUrl);case 11:n=e.sent,t=n.data;case 13:r=[],t.nonIabVendorList.forEach(function(e){var t={name:e.name,id:e.vendorId,policyUrl:!!e.privacyPolicyUrl&&e.privacyPolicyUrl,description:!!e.description&&e.description,purposes:"nonIabPurposeConsentIds"in e&&e.nonIabPurposeConsentIds,legIntPurposes:"nonIabPurposeLegitimateInterestIds"in e&&e.nonIabPurposeLegitimateInterestIds};r.push(t)}),this._data.data=i(i({},t),{},{nonIabVendorList:r}),e.next=21;break;case 18:e.prev=18,e.t0=e.catch(2),console.log("error processing nonIabVendors",e.t0);case 21:case"end":return e.stop()}},e,this,[[2,18]])}));return function(){return e.apply(this,arguments)}}()},{key:"data",get:function(){return this._data}}]),e}(),$e=function(){function e(){p(this,e)}return d(e,[{key:"encode",value:function(e,t,n,r,o,i,s,a,c){return Ge.encode({cookieName:O,vendorConsents:e,purposeConsents:t,specialFeatureOptins:n,vendorLegitimateInterests:r,purposeLegitimateInterests:o,publisherConsent:i,publisherLegitimate:s,publisherPurposeIds:a,publisherPurposeLegitimateInterestIds:c})}},{key:"decode",value:function(e){return Ge.decode(O,e)}},{key:"setCookie",value:function(e){"string"===typeof e?Ge.set(O,e,!1):console.error(e.message)}},{key:"getCookie",value:function(){var e=Ge.get(O);return e&&"string"===typeof e?this.decode(e):e}}]),e}(),et=function(){function e(){p(this,e),this._uspVersion=void 0,this._baseString=void 0,this._noticegiven=void 0,this._optedout=void 0,this._lspact=void 0,this._uspVersion=1,this._noticegiven="-",this._optedout="-",this._lspact="-",this._baseString=null}return d(e,[{key:"baseString",set:function(e){this._baseString=e},get:function(){return this._baseString}},{key:"noticegiven",set:function(e){this._noticegiven=e},get:function(){return this._noticegiven}},{key:"optedout",set:function(e){this._optedout=e},get:function(){return this._optedout}},{key:"lspact",set:function(e){this._lspact=e},get:function(){return this._lspact}},{key:"uspVersion",get:function(){return this._uspVersion}}]),e}(),tt=/^[1][nNyY-][nNyY-][nNyY-]$/,nt=function(){function e(){p(this,e),this._data=void 0,this._data=new et}return d(e,[{key:"encode",value:function(e,t){return this._data.baseString="".concat(e,"Y").concat(t?"Y":"N").concat(Ne.coreConfig.uspLspact),this._data.baseString}},{key:"setCookie",value:function(e){"string"===typeof e?tt.test(e)&&Ge.set(R,e,!1):e&&"message"in e&&console.error(e.message)}},{key:"getCookie",value:function(){return Ge.get(R)}}]),e}(),rt=function(){function e(t){p(this,e),this._cookieAccessIframe=void 0,this._isCookieAccessIframeReady=void 0,this.groupCookieAccessCallbacks=void 0,this._cookieAccessIframe=document.createElement("iframe"),this._isCookieAccessIframeReady=!1,this.groupCookieAccessCallbacks={},this.groupCookieAccessHandler=this.groupCookieAccessHandler.bind(this),window.addEventListener?window.addEventListener("message",this.groupCookieAccessHandler,!1):window.attachEvent("onmessage",this.groupCookieAccessHandler),this.createGroupCookieAccessIframe(t.coreConfig.consentScopeGroupURL,"_qc_cookie_access")}return d(e,[{key:"tryGroupCookieAccessCall",value:function(e,t,n){var r=this;return new Promise(function(o){var i=setInterval(function(){r._isCookieAccessIframeReady&&r._cookieAccessIframe.contentWindow&&(clearInterval(i),r.groupCookieAccessCall(e,t,n,function(e){o(e)}))},50)})}},{key:"groupCookieAccessCall",value:function(e,t,n,r){var o=Math.random().toString(),i={callId:o,__qcCmpCookieAccessCall:{cmd:e,cookieName:t}};if("set"===e){this.groupCookieAccessCallbacks[o]={cookieName:t,cookieValue:n};var s=new Date(Date.now()+33696e6).toUTCString();i.__qcCmpCookieAccessCall.cookieValue=n,i.__qcCmpCookieAccessCall.cookiePath=Ne.coreConfig.cookiePath,i.__qcCmpCookieAccessCall.expires=s}else this.groupCookieAccessCallbacks[o]={cookieName:t,resolve:r};this._cookieAccessIframe.contentWindow.postMessage(i,"*")}},{key:"createGroupCookieAccessIframe",value:function(e,t){var n=this._cookieAccessIframe;n.src=e,n.style.display="none",n.id=t;!function e(){document.body?document.body.appendChild(n):setTimeout(e,5)}()}},{key:"groupCookieAccessHandler",value:function(e){var t;if((t="string"===typeof e.data?-1!==e.data.indexOf("__qcCmpCookieAccessReturn")?JSON.parse(e.data):{}:e.data).__qcCmpCookieAccessReturn){if(t.__qcCmpCookieAccessReturn.isHandlerRegistered)return void(this._isCookieAccessIframeReady=!0);var n=t.__qcCmpCookieAccessReturn,r=this.groupCookieAccessCallbacks[t.callId];if(r.resolve){var o=null;"get"===n.cmd&&(o=-1!==["euconsent-v2","addtl_consent"].indexOf(r.cookieName)?"euconsent-v2"===r.cookieName?this.returnLatestVendorCookie(n.cookies):n.isSuccess?n.cookies[0]:null:n.cookies,r.resolve(o)),delete this.groupCookieAccessCallbacks[t.callId]}}}},{key:"returnLatestVendorCookie",value:function(e){return e&&e.length?bt(e):new Error("euconsent-v2 not found.")}},{key:"isCookieAccessIframeReady",get:function(){return this.isCookieAccessIframeReady}},{key:"cookieAccessIframe",get:function(){return this._cookieAccessIframe}}]),e}(),ot=function(){function e(){p(this,e),this.version=void 0,this._data=void 0,this.whitelist=void 0,this.version=1,this._data=[],this.whitelist=Ne.premiumProperties.googleWhitelist}return d(e,[{key:"encode",value:function(e){return Ge.encode({cookieName:U,vendorConsents:e,version:this.version})}},{key:"decode",value:function(e){return Ge.decode(U,e)}},{key:"setCookie",value:function(e){"string"===typeof e?Ge.set(U,e,!1):console.error(e.message)}},{key:"getCookie",value:function(e){var t=Ge.get(U);return t&&"string"===typeof t?e?t:this.decode(t):null}},{key:"fetchPartners",value:function(){var e=this;if(Ne.coreConfig.googleEnabled){return new Promise(function(t){return JSON.stringify(e.whitelist)===JSON.stringify([-1])?(e._data=[],t(e._data)):e._data.length>0?t(e._data):Z.get("https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json").then(function(n){var r=[];for(var o in n.data){var i=n.data[o];if("undefined"!==typeof i.provider_id&&""!==i.provider_id&&(JSON.stringify(e.whitelist)===JSON.stringify([1])||e.whitelist.length>0&&e.whitelist.includes(parseInt(i.provider_id)))){var s={name:i.provider_name,id:i.provider_id,policyUrl:i.policy_url,description:i.domains};r.push(s)}e._data=r}t(e._data)}).catch(function(e){return console.log(e)})})}}},{key:"data",get:function(){return this._data}}]),e}();J.GVL.baseUrl="https://quantcast.mgr.consensu.org/GVL-v2/";var it,st,at=new K,ct=function(){var e=u(a.a.mark(function e(t){var n,r,o,i;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=(Ne=t).coreConfig,n.consentScope,r=n.privacyMode,o=n.publisherCountryCode,i=n.showSummaryView,"",it="",Fe=new Qe,Be=new $("inUS"),je=function(){var e=u(a.a.mark(function e(){var t,n;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t="",e.prev=1,e.next=4,Fe.regulationToInit();case 4:"USP"===(t=e.sent)||r.includes("USP")?St.initUsp():(n=function(e,t,n){const $___old_53bc2c670f18a788={}.constructor.getOwnPropertyDescriptor(window,"localStorage");try{if($___old_53bc2c670f18a788)({}).constructor.defineProperty(window,"localStorage",$___mock_c6e61d92b949e349.localStorage);return function(){"getUSPData"===e&&1===t&&"function"===typeof n&&n({version:1,uspString:"1---"},!0)}.apply(this,arguments)}finally{if($___old_53bc2c670f18a788)({}).constructor.defineProperty(window,"localStorage",$___old_53bc2c670f18a788)}},Object.assign(window,{__uspapi:n})),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.log(e.t0);case 11:return e.abrupt("return",t);case 12:case"end":return e.stop()}},e,null,[[1,8]])}));return function(){return e.apply(this,arguments)}}(),Ge=new Ae,He=new Xe,qe=new nt,ze=new $e,Ke=new ot,Je=new Pe,We=null,Ye=function(){var e=u(a.a.mark(function e(){var t,n,r,i,s,c=arguments;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=c.length>0&&void 0!==c[0]&&c[0],((r="GDPR"===it)||t)&&((We=new W.TCModel).cmpId=10,We.cmpVersion=A,We.publisherCountryCode=o,We.isServiceSpecific=!0,i=fe(Ne),(s=i.purposeIds).includes(1)||("DE"===o?We.purposeOneTreatment=!0:s.push(1))),e.prev=3,!r&&!t){e.next=15;break}return e.next=7,Fe.fetchCookieValues();case 7:return e.next=9,He.fetchList();case 9:return e.next=11,Fe.fetchDataToReprompt();case 11:if(!(n=e.sent)){e.next=15;break}return e.next=15,Fe.loadGVL();case 15:e.next=20;break;case 17:e.prev=17,e.t0=e.catch(3),console.error(e.t0);case 20:return e.abrupt("return",n);case 21:case"end":return e.stop()}},e,null,[[3,17]])}));return function(){return e.apply(this,arguments)}}(),e.next=17,je();case 17:return it=e.sent,e.next=20,Ye();case 20:e.sent&&"GDPR"===it?at.displayUi("GDPR",i?0:1,!0):Fe.updateApiVisible(it,!1);case 22:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),ut=function(e){return i(i(i(i({},e.coreConfig),e.premiumProperties),e.coreUiLabels),e.premiumUiLabels)},pt=function(e){return Math.floor(e.getTime()/100)},lt=function(e){return new Date(100*e)},dt=function(e,t){var n=Object.keys(t).filter(function(t){return-1===e.indexOf(t)});return n.length&&(t.notFound=n),t},ft=function(e,t){return!(!e&&"always"!==t)},ht=function(e,t){var n={};return t&&t.length>0?(t.forEach(function(t){void 0!==e[t]?n[t]=e[t]:n[t]=!1}),n):e},vt=function(e){var t=new Date(Date.now()+1e3*e.maxAge).toUTCString(),n="https:"===window.location.protocol?";SameSite=Lax;secure":"",r=Ne.coreConfig.cookiePath||"/";document.cookie=e.cookieName+"="+e.encodedValue+";path="+r+";max-age="+e.maxAge+";expires="+t+";domain="+Ne.coreConfig.cookieDomain+n},yt=function(e){return we.TCString.encode(e)},gt=function(e){return we.TCString.decode(e)},mt=function(e){var t=!1;switch(e){case"firefox":t=navigator.userAgent.toLowerCase().indexOf(e)>-1;break;case"safari":t=navigator.userAgent.toLowerCase().indexOf(e)>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}return t},bt=function(e){var t=null,n=new Error("euconsent-v2 not valid");return e.forEach(function(e){var r=null;try{r=gt(e)}catch(o){console.error("Failed to decode euconsent-v2 cookie: "+e)}r&&r.lastUpdated&&r.lastUpdated>t&&(t=r.lastUpdated,n=e)}),n},Ct=function(){function e(){var t=this;p(this,e),this.cmpApi=void 0,this.isInitialized=void 0,this.config=void 0,this.MyCustomCommands=void 0;var n,r=window.__tcfapi();r.length&&r.forEach(function(e){e&&"init"===e[0]&&(n=e[3])}),this.isInitialized=!1;var o="thirdPartyStorageType"in n.coreConfig?n.coreConfig.thirdPartyStorageType:"iframe",i="consentScope"in n.coreConfig?n.coreConfig.consentScope:"service",s="consentScopeGroupURL"in n.coreConfig?n.coreConfig.consentScopeGroupURL:"";i.includes("group")&&"iframe"===o&&s&&(st=new rt(n)),this.MyCustomCommands={getConfig:function(e,n){var r=t.getConfig(n),o=!1;"object"===typeof r&&(o=!0),e(r,o)},getNonIABVendorConsents:function(){var e=u(a.a.mark(function e(n,r){var o,i;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.getNonIABVendorConsents(r);case 2:o=e.sent,i=!1,"object"===typeof o&&(i=!0),n(o,i);case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),displayConsentUi:function(e){return e(t.displayConsentUi())},setConsentInfo:function(e,t){return e(Fe.setConsents(t))},setPublisherRestriction:function(e,t){return e(Fe.setPublisherRestriction(t))},notifyUiState:function(e,t){return e(Fe.updateApiVisible(t.regulation,t.visible))},init:function(e,n){return e(t.init(n))}},this.addGetTCDataToSupportGoogle(n),this.cmpApi=new g.CmpApi(10,A,!0,this.MyCustomCommands)}return d(e,[{key:"addGetTCDataToSupportGoogle",value:function(e){if("googleEnabled"in e.coreConfig&&e.coreConfig.googleEnabled){var t=function(){var e=u(a.a.mark(function e(t,n){var r,o;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("object"!==typeof n){e.next=8;break}if(!Fe.fetchCookiesCalled){e.next=8;break}if(Fe.cookieValues.fetched){e.next=5;break}return e.next=5,Fe.cookieValues.promise;case 5:r=Fe.cookieValues.googleCookieValue,o=r?he(r):void 0,n.addtlConsent=o;case 8:"function"===typeof t&&("boolean"===typeof n?t(n):t(n,!0));case 9:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}();this.MyCustomCommands.getTCData=t,this.MyCustomCommands.getInAppTCData=t}}},{key:"displayConsentUi",value:function(){at.displayUi("GDPR",1,!1)}},{key:"init",value:function(e){if(!this.isInitialized)return this.isInitialized=!0,this.config||(this.config=new z(e),this.config.initializeConfig()),ct(this.config);console.warn("init has already been called and should only be run one time.")}},{key:"getConfig",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"all";if(this.config)switch(e){case"all":return{coreConfig:this.config.coreConfig,coreUiLabels:this.config.coreUiLabels,premiumProperties:this.config.premiumProperties,premiumUiLabels:this.config.premiumUiLabels,theme:this.config.theme,nonIabVendorsInfo:this.config.nonIabVendorsInfo};case"Core Config":return this.config.coreConfig;case"Premium Properties":return this.config.premiumProperties;case"Core UI Labels":return this.config.coreUiLabels;case"Premium UI Labels":return this.config.premiumUiLabels;case"Theme":return this.config.theme;case"Non Iab Vendors Info":return this.config.nonIabVendorsInfo;default:var t=ut(this.config);if(t[e])return t[e];console.warn('"'.concat(e,'": was not found in configs'))}else console.error("Should run init before running getConfig")}},{key:"getConfigInstance",value:function(){return this.config}},{key:"getNonIABVendorConsents",value:function(){var e=u(a.a.mark(function e(t){var n,r,o;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("undefined"===typeof this.config){e.next=12;break}if(!Fe.fetchCookiesCalled){e.next=5;break}if(Fe.cookieValues.fetched){e.next=5;break}return e.next=5,Fe.cookieValues.promise;case 5:return n=ve(He.decode,Fe.cookieValues.nonIabVendorConsent),r=null,o="USP"!==it&&ft(Be.isUserInEU,this.config.coreConfig.displayUi),n&&t?r=ht(n.vendorConsents,t):n&&(r=i({},n.vendorConsents)),e.abrupt("return",{gdprApplies:o,metadata:r?Ge.encode(i(i({},n),{},{cookieName:"noniabvendorconsent"}),!0):null,nonIabVendorConsents:r||null});case 12:console.log("Config was not found");case 13:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()}]),e}(),_t=function(){function e(){var t=this;p(this,e),this.__uspapi=void 0,this._uspVersion=1,this.isUspJurisdiction=function(){var e=u(a.a.mark(function e(n){var r,o,i,s;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(r=!0,o=Ne.coreConfig,i=o.uspJurisdiction,o.isAMP){e.next=8;break}return e.next=5,Be.checkSpecificLocation();case 5:(s=e.sent)&&"string"===typeof s.region&&(s=s.region.toUpperCase()),i.includes(s)||("function"===typeof n&&n({version:t._uspVersion,uspString:"1---"},!0),r=!1);case 8:return e.abrupt("return",r);case 9:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),this.__uspapi=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0;if(n===t._uspVersion)if("function"===typeof r)try{void 0!==o?t[e](r,o):t[e](r)}catch(i){console.error("The function ".concat(e," is not defined"))}else if(void 0===r)try{t[e]()}catch(i){console.error("The function ".concat(e," is missing required parameters"))}else console.warn("The third parameter should be a callback for the ".concat(e," function"));else console.warn("this command is only available for uspVersion 1")}}return d(e,[{key:"initUsp",value:function(){var e=this,t=this.__uspapi;Ne.coreConfig.isAMP&&this.getUSPData(function(t){t||e.setUspDftData(function(e){var t,n;t=!0,n={type:Se.CONSENT_RESPONSE,action:Le.ACCEPT,info:e.uspString,consentMetadata:{consentStringType:Ie.USP,gdprApplies:!1}},t&&window.parent.postMessage(n,"*")})}),Object.assign(window,{__uspapi:t})}},{key:"uspPing",value:function(){var e=u(a.a.mark(function e(t){var n;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!==typeof t){e.next=8;break}return e.next=3,Be.checkSpecificLocation();case 3:(n=e.sent)&&"object"===typeof n&&(n=n.region),t({mode:Ne.coreConfig.privacyMode,jurisdiction:Ne.coreConfig.uspJurisdiction,location:n,cmpLoaded:!0},!0),e.next=9;break;case 8:console.error("The callback function is missing");case 9:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()},{key:"setUspDftData",value:function(){var e=u(a.a.mark(function e(t){var n,r,o;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!==typeof t){e.next=10;break}return n=Ne.coreConfig.isAMP?null:qe.getCookie(),e.next=4,this.isUspJurisdiction(t);case 4:if(e.sent){e.next=7;break}return e.abrupt("return");case 7:"string"!==typeof n?(r=qe.encode(this._uspVersion,!1),Ne.coreConfig.isAMP||qe.setCookie(r),t({version:this._uspVersion,uspString:r},!0)):(o=n.split("")[0],t({version:o,uspString:n},!0)),e.next=11;break;case 10:console.error("The callback function is missing");case 11:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"setUspData",value:function(){var e=u(a.a.mark(function e(t,n){var r;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!==typeof t){e.next=10;break}return r=qe.encode(this._uspVersion,n),e.next=4,this.isUspJurisdiction(t);case 4:if(e.sent){e.next=7;break}return e.abrupt("return");case 7:"string"!==typeof r?t(null,!1):(Ne.coreConfig.isAMP||qe.setCookie(r),t({version:this._uspVersion,uspString:r,doNotSell:n},!0)),e.next=11;break;case 10:console.error("The callback function is missing");case 11:case"end":return e.stop()}},e,this)}));return function(t,n){return e.apply(this,arguments)}}()},{key:"getUSPData",value:function(){var e=u(a.a.mark(function e(t){var n,r;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!==typeof t){e.next=10;break}return n=Ne.coreConfig.isAMP?Ne.ampData.consentMetadata&&Ne.ampData.consentMetadata.consentStringType===Ie.USP&&Ne.ampData.consentString:qe.getCookie(),e.next=4,this.isUspJurisdiction(t);case 4:if(e.sent){e.next=7;break}return e.abrupt("return");case 7:"string"===typeof n?(r=n.split("")[0],t({version:r,uspString:n},!0)):t(null,!1),e.next=11;break;case 10:console.error("The callback function is missing");case 11:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"displayUspUi",value:function(){var e=u(a.a.mark(function e(t){var n,r=arguments;return a.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=r.length>1&&void 0!==r[1]?r[1]:1,e.next=3,this.isUspJurisdiction(void 0);case 3:if(e.sent){e.next=7;break}return console.warn("cannot display USP UI outside of configured jurisdiction(s)"),e.abrupt("return");case 7:1===n&&at.displayUi("USP",n);case 8:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()}]),e}(),Et=new Ct,St=new _t},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){e.exports=n(166)}])})()} diff --git a/resources/sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min.js b/resources/sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min.js new file mode 100644 index 00000000..4c194f30 --- /dev/null +++ b/resources/sugarcoat-gpt-83c6e054eb06b453d56c97b9ddd181d6.min.js @@ -0,0 +1 @@ +{const $___mock_70e0c9b62e10001d={};(exports=>{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_70e0c9b62e10001d);(function(){(function(E){var window=this;if(window.googletag&&googletag.evalScripts){googletag.evalScripts()}if(window.googletag&&googletag._loaded_)return;var aa=function(a){var b=0;return function(){return b>>0,fa[d]=ea?da.Symbol(d):"$jscp$"+a+"$"+d),ba(f,fa[d],{configurable:!0,writable:!0,value:b})))}};p("Symbol",function(a){if(a)return a;var b=function(f,g){this.g=f;ba(this,"description",{configurable:!0,writable:!0,value:g})};b.prototype.toString=function(){return this.g};var c="jscomp_symbol_"+(1e9*Math.random()>>>0)+"_",d=0,e=function(f){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new b(c+(f||"")+"_"+d++,f)};return e},"es6");p("Symbol.iterator",function(a){if(a)return a;a=(0,m.Symbol)("Symbol.iterator");for(var b="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),c=0;c=f}},"es6");p("String.prototype.repeat",function(a){return a?a:function(b){var c=qa(this,null,"repeat");if(0>b||1342177279>>=1)c+=c;return d}},"es6");var ra=function(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&cc&&(c=Math.max(c+e,0));c>>0),ua=0,wa=function(a,b){for(var c in b)a[c]=b[c]},xa=function(a,b){a=a.split(".");var c=w;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c[d]&&c[d]!==Object.prototype[d]?c=c[d]:c=c[d]={}:c[d]=b};var ya;var za=function(a){var b=!1,c;return function(){b||(c=a(),b=!0);return c}};var Aa=function(a,b){Array.prototype.forEach.call(a,b,void 0)},Ba=function(a,b){return Array.prototype.filter.call(a,b,void 0)},Ca=function(a,b){return Array.prototype.map.call(a,b,void 0)};function Da(a,b){a:{for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;eb?null:"string"===typeof a?a.charAt(b):a[b]}function Ea(a,b){a:{for(var c="string"===typeof a?a.split(""):a,d=a.length-1;0<=d;d--)if(d in c&&b.call(void 0,c[d],d,a)){b=d;break a}b=-1}return 0>b?null:"string"===typeof a?a.charAt(b):a[b]}function Fa(a,b){return 0<=Array.prototype.indexOf.call(a,b,void 0)}function Ga(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}var Ha={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};var Ka=function(a,b){this.h=a===Ia&&b||"";this.i=Ja};Ka.prototype.u=!0;Ka.prototype.g=function(){return this.h};var La=function(a){return a instanceof Ka&&a.constructor===Ka&&a.i===Ja?a.h:"type_error:Const"},x=function(a){return new Ka(Ia,a)},Ja={},Ia={};var y=function(a,b){this.i=b===Ma?a:""};y.prototype.u=!0;y.prototype.g=function(){return this.i.toString()};y.prototype.j=!0;y.prototype.h=function(){return 1};var Qa=function(a,b,c){a=Na.exec(Oa(a).toString());var d=a[3]||"";return new y(a[1]+Pa("?",a[2]||"",b)+Pa("#",d,c),Ma)};y.prototype.toString=function(){return this.i+""};var Oa=function(a){return a instanceof y&&a.constructor===y?a.i:"type_error:TrustedResourceUrl"},Ta=function(a,b){var c=La(a);if(!Ra.test(c))throw Error("Invalid TrustedResourceUrl format: "+c);a=c.replace(Sa,function(d,e){if(!Object.prototype.hasOwnProperty.call(b,e))throw Error('Found marker, "'+e+'", in format string, "'+c+'", but no valid label mapping found in args: '+JSON.stringify(b));d=b[e];return d instanceof Ka?La(d):encodeURIComponent(String(d))});return new y(a,Ma)},Sa=/%{(\w+)}/g,Ra=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i,Na=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/,Ua=function(a){for(var b="",c=0;ca.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};var Va=function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},cb=function(a){if(!Wa.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(Xa,"&"));-1!=a.indexOf("<")&&(a=a.replace(Ya,"<"));-1!=a.indexOf(">")&&(a=a.replace(Za,">"));-1!=a.indexOf('"')&&(a=a.replace($a,"""));-1!=a.indexOf("'")&&(a=a.replace(ab,"'"));-1!=a.indexOf("\0")&&(a=a.replace(bb,"�"));return a},Xa=/&/g,Ya=//g,$a=/"/g,ab=/'/g,bb=/\x00/g,Wa=/[\x00&<>"']/,eb=function(a,b){var c=0;a=Va(String(a)).split(".");b=Va(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&eb?1:0};var z=function(a,b){this.i=b===fb?a:""};z.prototype.u=!0;z.prototype.g=function(){return this.i.toString()};z.prototype.j=!0;z.prototype.h=function(){return 1};z.prototype.toString=function(){return this.i.toString()};var gb=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,hb=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,ib=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i,fb={},jb=new z("about:invalid#zClosurez",fb);var A;a:{var kb=w.navigator;if(kb){var lb=kb.userAgent;if(lb){A=lb;break a}}A=""}var B=function(a,b,c){this.i=c===mb?a:"";this.l=b};B.prototype.j=!0;B.prototype.h=function(){return this.l};B.prototype.u=!0;B.prototype.g=function(){return this.i.toString()};B.prototype.toString=function(){return this.i.toString()};var nb=function(a){return a instanceof B&&a.constructor===B?a.i:"type_error:SafeHtml"},ob=function(a){if(a instanceof B)return a;var b="object"==typeof a,c=null;b&&a.j&&(c=a.h());a=cb(b&&a.u?a.g():String(a));return new B(a,c,mb)},pb=/^[a-zA-Z0-9-]+$/,qb={action:!0,cite:!0,data:!0,formaction:!0,href:!0,manifest:!0,poster:!0,src:!0},sb=function(a,b){var c={src:a},d={};a={};for(var e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e]);for(e in d)Object.prototype.hasOwnProperty.call(d,e)&&(a[e]=d[e]);if(b)for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){var f=e.toLowerCase();if(f in c)throw Error("");f in d&&delete a[f];a[e]=b[e]}b=null;e="";if(a)for(g in a)if(Object.prototype.hasOwnProperty.call(a,g)){if(!pb.test(g))throw Error("");d=a[g];if(null!=d){c=g;if(d instanceof Ka)d=La(d);else{if("style"==c.toLowerCase())throw Error("");if(/^on/i.test(c))throw Error("");if(c.toLowerCase()in qb)if(d instanceof y)d=Oa(d).toString();else if(d instanceof z)d=d instanceof z&&d.constructor===z?d.i:"type_error:SafeUrl";else if("string"===typeof d)d instanceof z||(d="object"==typeof d&&d.u?d.g():String(d),ib.test(d)?d=new z(d,fb):(d=String(d),d=d.replace(/(%0A|%0D)/g,""),d=(f=d.match(hb))&&gb.test(f[1])?new z(d,fb):null)),d=(d||jb).g();else throw Error("")}d.u&&(d=d.g());c=c+'="'+cb(String(d))+'"';e+=" "+c}}var g="":(b=rb(e),g+=">"+nb(b).toString()+"<\/script>",b=b.h());(a=a&&a.dir)&&(/^(ltr|rtl|auto)$/i.test(a)?b=0:b=null);return new B(g,b,mb)},ub=function(a){var b=ob(tb),c=b.h(),d=[],e=function(f){Array.isArray(f)?f.forEach(e):(f=ob(f),d.push(nb(f).toString()),f=f.h(),0==c?c=f:0!=f&&c!=f&&(c=null))};a.forEach(e);return new B(d.join(nb(b).toString()),c,mb)},rb=function(a){return ub(Array.prototype.slice.call(arguments))},mb={},tb=new B(w.trustedTypes&&w.trustedTypes.emptyHTML||"",0,mb);var vb=function(a,b){a.write(nb(b))},xb=function(){a:{var a=w.document;if(a.querySelector&&(a=a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&wb.test(a))break a;a=""}return a},wb=/^[\w+/_-]+[=]{0,2}$/;var yb={},zb=null,Bb=function(a){var b;void 0===b&&(b=0);Ab();b=yb[b];for(var c=Array(Math.floor(a.length/3)),d=b[64]||"",e=0,f=0;e>2];g=b[(g&3)<<4|h>>4];h=b[(h&15)<<2|k>>6];k=b[k&63];c[f++]=l+g+h+k}l=0;k=d;switch(a.length-e){case 2:l=a[e+1],k=b[(l&15)<<2]||d;case 1:a=a[e],c[f]=b[a>>2]+b[(a&3)<<4|l>>4]+k+d}return c.join("")},Db=function(a){var b=[];Cb(a,function(c){b.push(c)});return b},Cb=function(a,b){function c(k){for(;d>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h))}},Ab=function(){if(!zb){zb={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));yb[c]=d;for(var e=0;ed)return null;e=a.indexOf("&",d);if(0>e||e>c)e=c;d+=b.length+1;return decodeURIComponent(a.substr(d,e-d).replace(/\+/g," "))};var ec=function(a,b){if(!bc()&&!cc()){var c=Math.random();if(cMath.random()}),bc=za(function(){return gc("MSIE")}),gc=function(a){return-1!=A.indexOf(a)},hc=/^(-?[0-9.]{1,30})$/,ic=function(a,b){return hc.test(a)&&(a=Number(a),!isNaN(a))?a:void 0==b?null:b},jc=function(a){return/^true$/.test(a)},kc=za(function(){return Xb()||-1==A.indexOf("iPod")&&-1==A.indexOf("iPhone")&&-1==A.indexOf("Android")&&-1==A.indexOf("IEMobile")?Xb()?1:0:2}),lc=function(a,b){a=void 0===a?"":a;b=void 0===b?window:b;if(b=Zb(b.location.href.match(Yb)[3]||null))if(a=b+a,b=a.length,0==b)a=0;else{for(var c=305419896,d=0;d>2)+a.charCodeAt(d)&4294967295;a=0b)throw Error("ID "+c+" is past MaxVendorId "+b+"!")}),a):uc(a,b)},tc=function(a){for(var b=K(a,12),c=[];b--;){var d=!0===!!K(a,1),e=K(a,16);if(d)for(d=K(a,16);e<=d;e++)c.push(e);else c.push(e)}c.sort(function(f,g){return f-g});return c},uc=function(a,b,c){for(var d=[],e=0;ea.h.length)throw Error("Requested length "+b+" is past end of string.");var c=a.h.substring(a.g,a.g+b);a.g+=b;return parseInt(c,2)};var xc=function(a,b){try{var c=Db(a.split(".")[0]).map(function(e){return n(e.toString(2),"padStart").call(e.toString(2),8,"0")}).join(""),d=new sc(c);c={};c.tcString=a;c.gdprApplies=!0;d.g+=78;c.cmpId=K(d,12);c.cmpVersion=K(d,12);d.g+=30;c.tcfPolicyVersion=K(d,6);c.isServiceSpecific=!!K(d,1);c.useNonStandardStacks=!!K(d,1);c.specialFeatureOptins=wc(uc(d,12,rc),rc);c.purpose={consents:wc(uc(d,24,qc),qc),legitimateInterests:wc(uc(d,24,qc),qc)};c.purposeOneTreatment=!!K(d,1);c.publisherCC=String.fromCharCode(pc+K(d,6))+String.fromCharCode(pc+K(d,6));c.vendor={consents:wc(vc(d),b),legitimateInterests:wc(vc(d),b)};return c}catch(e){return null}},wc=function(a,b){var c={};if(Array.isArray(b)&&0!==b.length){b=r(b);for(var d=b.next();!d.done;d=b.next())d=d.value,c[d]=-1!==a.indexOf(d)}else for(a=r(a),d=a.next();!d.done;d=a.next())c[d.value]=!0;delete c[0];return c};var L=function(a,b){this.g=a;this.defaultValue=void 0===b?!1:b},yc=function(a,b){this.g=a;this.defaultValue=void 0===b?0:b};var zc=new L(374201268,!0),Ac=new L(530,!0),Bc=new L(378896074),Cc=new function(a,b){this.g=a;this.defaultValue=void 0===b?"":b}(531),Dc=new yc(532),Ec=new L(371364212,!0),Fc=new yc(24),Gc=new L(203),Hc=new L(241),Ic=new yc(1929,50),Jc=new yc(1905),Kc=new L(240),Lc=new L(1928),Mc=new L(1941),Nc=new L(370946349),Oc=new L(374326588),Pc=new L(379841917),Qc=new L(377105258),Rc=new yc(1935),Sc=new L(1942);var Uc=function(a){D(this,a,Tc,null)};u(Uc,C);var Tc=[6];var Vc=function(a){D(this,a,null,null)};u(Vc,C);var Wc=function(a){D(this,a,null,null)};u(Wc,C);var Xc=function(a){D(this,a,null,null)};u(Xc,C);var Yc=function(a){this.g=a||{cookie:""}};Yc.prototype.set=function(a,b,c){var d=!1;if("object"===typeof c){var e=c.va;d=c.wa||!1;var f=c.domain||void 0;var g=c.path||void 0;var h=c.ua}if(/[;=\s]/.test(a))throw Error('Invalid cookie name "'+a+'"');if(/[;\r\n]/.test(b))throw Error('Invalid cookie value "'+b+'"');void 0===h&&(h=-1);this.g.cookie=a+"="+b+(f?";domain="+f:"")+(g?";path="+g:"")+(0>h?"":0==h?";expires="+new Date(1970,1,1).toUTCString():";expires="+new Date(Date.now()+1e3*h).toUTCString())+(d?";secure":"")+(null!=e?";samesite="+e:"")};Yc.prototype.get=function(a,b){for(var c=a+"=",d=(this.g.cookie||"").split(";"),e=0,f;ea;case 12:return"string"===typeof a&&"string"===typeof e&&new RegExp(a).test(e);case 10:return null!=e&&-1===eb(String(e),a);case 11:return null!=e&&1===eb(String(e),a)}}}},Bd=function(a,b){return!a||!(!b||!Ad(a,b))};var Dd=function(a){D(this,a,Cd,null)};u(Dd,C);var Cd=[4];var Ed=function(a){D(this,a,null,null)};u(Ed,C);var Q=function(a){D(this,a,Fd,Gd)};u(Q,C);var Fd=[5],Gd=[[1,2,3,6,7]];var R=function(){var a={};this.g=(a[wd]={},a[O]={},a[P]={},a)};var Hd=jc("false");var Id=Hd,Jd=function(a,b){switch(b){case 1:return G(a,1,0);case 2:return G(a,2,0);case 3:return G(a,3,0);case 6:return G(a,6,0);default:return null}},Kd=function(a,b){if(!a)return null;switch(b){case 1:var c=void 0===c?!1:c;a=F(a,1);a=null==a?a:!!a;return null==a?c:a;case 7:return G(a,3,"");case 2:return Ob(a,2);case 3:return G(a,3,"");case 6:return F(a,4);default:return null}},Ld=za(function(){if(!Id)return{};try{var a=window.sessionStorage&&window.sessionStorage.getItem("GGDFSSK");if(a)return JSON.parse(a)}catch(b){}return{}}),Od=function(a,b,c,d){d=void 0===d?0:d;var e=Ld();if(null!=e[b])return e[b];b=Md(d)[b];if(!b)return c;b=new Q(b);b=Nd(b);a=Kd(b,a);return null!=a?a:c},Nd=function(a){var b=M(R).g;if(b){var c=Ea(J(a,Ed,5),function(d){return Bd(I(d,ud,1),b)});if(c)return I(c,Dd,2)}return I(a,Dd,4)},Pd=function(){this.g={};this.h=[]},Qd=function(a,b,c){return!!Od(1,a,void 0===b?!1:b,c)},Rd=function(a,b,c){b=void 0===b?0:b;a=Number(Od(2,a,b,c));return isNaN(a)?b:a},Sd=function(a,b,c){return Od(3,a,void 0===b?"":b,c)},Td=function(a,b,c){b=void 0===b?[]:b;return Od(6,a,b,c)},Md=function(a){return M(Pd).g[a]||(M(Pd).g[a]={})},Ud=function(a,b){var c=Md(b);fc(a,function(d,e){return c[e]=d})},Vd=function(a,b){var c=Md(b);Aa(a,function(d){var e=Nb(d,Gd[0]);(e=Jd(d,e))&&(c[e]=Sb(d))})},Wd=function(a,b){var c=Md(b);Aa(a,function(d){var e=new Q(d),f=Nb(e,Gd[0]);(e=Jd(e,f))&&(c[e]||(c[e]=d))})},Xd=function(){return Ca(n(Object,"keys").call(Object,M(Pd).g),function(a){return Number(a)})},Yd=function(a){Fa(M(Pd).h,a)||Ud(Md(4),a)};var S=function(a){this.methodName=a},Zd=new S(1),$d=new S(15),ae=new S(2),be=new S(3),ce=new S(4),de=new S(5),ee=new S(6),fe=new S(7),ge=new S(8),he=new S(9),ie=new S(10),je=new S(11),ke=new S(12),le=new S(13),me=new S(14),T=function(a,b,c){c.hasOwnProperty(a.methodName)||Object.defineProperty(c,String(a.methodName),{value:b})},U=function(a,b,c){return b[a.methodName]||c||function(){}},ne=function(a){T(de,Qd,a);T(ee,Rd,a);T(fe,Sd,a);T(ge,Td,a);T(le,Wd,a);T($d,Yd,a)},oe=function(a){T(ce,function(b){M(R).g=b},a);T(he,function(b,c){var d=M(R);d.g[wd][b]||(d.g[wd][b]=c)},a);T(ie,function(b,c){var d=M(R);d.g[O][b]||(d.g[O][b]=c)},a);T(je,function(b,c){var d=M(R);d.g[P][b]||(d.g[P][b]=c)},a);T(me,function(b){for(var c=M(R),d=r([wd,O,P]),e=d.next();!e.done;e=d.next())e=e.value,wa(c.g[e],b[e])},a)},pe=function(a){a.hasOwnProperty("init-done")||Object.defineProperty(a,"init-done",{value:!0})};var qe=function(){this.g=function(){};this.h=function(){return[]}},re=function(a,b,c){a.g=function(d){U(ae,b,function(){return[]})(d,c)};a.h=function(){return U(be,b,function(){return[]})(c)}};var se=function(a,b){try{a:{var c=a.split(".");a=w;for(var d=0,e;d=Math.random()&&oc({b:c,dp:b},"tagging_dupdiv"),!0;a.l[b]=!0;return!1},Je=function(a,b,c){var d=[],e=Ge(a.j,b);if(9!==b&&Fe(a,b,c)||!e.length)return d;var f=Fa(Ce,b);Aa(e,function(g){if(g=He(a,g,c)){var h=g.getId();d.push(h);Ie(a,h,f?4:c);var k=J(g,Q,2);k&&(f?Aa(Xd(),function(l){return Vd(k,l)}):Vd(k,c))}});return d},Ie=function(a,b,c){a.g[c]||(a.g[c]=[]);a=a.g[c];Fa(a,b)?oc({eids:JSON.stringify(a),dup:b},"gpt_dupeid"):a.push(b)},Ke=function(a,b){a.j.push.apply(a.j,t(Ba(Ca(b,function(c){return new V(c)}),function(c){return!Fa(Ce,c.B())})))},He=function(a,b,c){var d=M(R).g;if(!Bd(I(b,ud,3),d))return null;var e=J(b,we,2),f=e.length*G(b,1,0),g=G(b,6,0);if(g){f=d[O];switch(c){case 2:var h=f[8];break;case 1:h=f[7]}c=void 0;if(h)try{c=h(g)}catch(k){}return(b=Le(b,c))?Me(a,[b],1):null}if(g=G(b,10,0)){f=null;switch(c){case 1:f=d[O][9];break;case 2:f=d[O][10];break;default:return null}c=f?f(String(g)):void 0;return void 0===c&&1===G(b,11,0)?null:(b=Le(b,c))?Me(a,[b],1):null}c=d?Ba(e,function(k){return Bd(I(k,ud,3),d)}):e;return c.length?(b=G(b,4,0))?Ne(a,b,f,c):Me(a,c,f/1e3):null},Ne=function(a,b,c,d){var e=null!=a.i[b]?a.i[b]:1e3;if(0>=e)return null;d=Me(a,d,c/e);a.i[b]=d?0:e-c;return d},Me=function(a,b,c){var d=a.h,e=Da(b,function(f){return!!d[f.getId()]});return e?e:a.o?null:ec(b,c)},Oe=function(a,b){T(Zd,function(c){a.h[c]=!0},b);T(ae,function(c,d){return Je(a,c,d)},b);T(be,function(c){return(a.g[c]||[]).concat(a.g[4])},b);T(ke,function(c){return Ke(a,c)},b)},Ge=function(a,b){return(a=Da(a,function(c){return c.B()==b}))&&J(a,ye,2)||[]},Le=function(a,b){var c=J(a,we,2),d=c.length,e=G(a,1,0);a=G(a,8,0);b=void 0!==b?b:Math.floor(1e3*dc(window));var f=(b-a)%d;if(b=d*e-1)return null;c=c[f];d=M(R).g;return!c||d&&!Bd(I(c,ud,3),d)?null:c};var Pe=function(){this.g=function(){}},Qe=function(a){M(Pe).g(a)};var Te=function(a){var b=M(Re),c={Y:M(W)[211],Z:M(W)[227],$:M(W)[226]},d=void 0,e=2;d=void 0===d?ue():d;e=void 0===e?0:e;d.hasOwnProperty("init-done")?(U(ke,d)(Ca(J(a,V,2),function(f){return Sb(f)})),U(le,d)(Ca(J(a,Q,1),function(f){return Sb(f)}),e),b&&U(me,d)(b),Se(d,e)):(Oe(Ee(M(De),J(a,V,2),e,c),d),ne(d),oe(d),pe(d),Se(d,e),Vd(J(a,Q,1),e),Id=Id||!(!c||!c.ta),Qe(M(te)),b&&Qe(b))},Se=function(a,b){a=void 0===a?ue():a;b=void 0===b?0:b;var c=a,d=b;d=void 0===d?0:d;re(M(qe),c,d);Ue(a,b);M(Pe).g=U(me,a);M(ld).i()},Ue=function(a,b){b=void 0===b?0:b;var c=M(ld);c.g=function(d,e){return U(de,a,function(){return!1})(d,e,b)};c.h=function(d,e){return U(ee,a,function(){return 0})(d,e,b)};c.j=function(d,e){return U(fe,a,function(){return""})(d,e,b)};c.l=function(d,e){return U(ge,a,function(){return[]})(d,e,b)};c.i=function(){U($d,a)(b)}};var Ve=["AwfG8hAcHnPa/kJ1Co0EvG/K0F9l1s2JZGiDLt2mhC3QI5Fh4qmsmSwrWObZFbRC9ieDaSLU6lHRxhGUF/i9sgoAAACBeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","AwQ7dCmHkvR6FuOFxAuNnktYSQrGbL4dF+eBkrwNLALc69Wr//PnO1yzns3pjUoCaYbKHtVcnng2hU+8OUm0PAYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","AysVDPGQTLD/Scn78x4mLwB1tMfje5jwUpAAzGRpWsr1NzoN7MTFhT3ClmImi2svDZA7V6nWGIV8YTPsSRTe0wYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"];function We(a){a=void 0===a?window.document:a;mc(Ve,a)}var Xe=function(a){a=void 0===a?w:a;return(a=a.performance)&&a.now?a.now():null};var Ye=w.performance,Ze=!!(Ye&&Ye.mark&&Ye.measure&&Ye.clearMarks),$e=za(function(){var a;if(a=Ze)a=rd(),a=!!a.indexOf&&0<=a.indexOf("1337");return a});var af=function(a,b,c){this.g=void 0===a?null:a;this.i=void 0===b?"jserror":b;this.h=null;this.j=void 0===c?.01:c;this.o=this.l},bf=function(a,b){a.h=b};af.prototype.l=function(a,b,c,d,e){c=void 0===c?this.j:c;e=void 0===e?this.i:e;if(Math.random()>c)return!1;b.error&&b.meta&&b.id||(b=new Vb(b,{context:a,id:e}));if(d||this.h)b.meta={},this.h&&this.h(b.meta),d&&d(b.meta);w.google_js_errors=w.google_js_errors||[];w.google_js_errors.push(b);w.error_rep_loaded||(b=w.document,a=b.createElement("script"),a.src=Oa(new y(w.location.protocol+"//pagead2.googlesyndication.com/pagead/js/err_rep.js",Ma)),Ub(a),(b=b.getElementsByTagName("script")[0])&&b.parentNode&&b.parentNode.insertBefore(a,b),w.error_rep_loaded=!0);return!1};var cf=function(a,b){try{var c=a.g&&a.g.start("420",3);b();a.g&&c&&a.g.end(c)}catch(d){if(a.g&&c&&(b=c)&&Ye&&$e()&&(Ye.clearMarks("goog_"+b.label+"_"+b.uniqueId+"_start"),Ye.clearMarks("goog_"+b.label+"_"+b.uniqueId+"_end")),!a.o(420,d,a.j,void 0,a.i))throw d}};var df=["A3HucHUo1oW9s+9kIKz8mLkbcmdaj5lxt3eiIMp1Nh49dkkBlg1Fhg4Fd/r0vL69mRRA36YutI9P/lJUfL8csQoAAACFeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjI2MjIwNzk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ==","A0OysezhLoCRYomumeYlubLurZTCmsjTb087OvtCy95jNM65cfEsbajrJnhaGwiTxhz38ZZbm+UhUwQuXfVPTg0AAACLeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjI2MjIwNzk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ==","AxoOxdZQmIoA1WeAPDixRAeWDdgs7ZtVFfH2y19ziTgD1iaHE5ZGz2UdSjubkWvob9C5PrjUfkWi4ZSLgWk3Xg8AAACLeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjI2MjIwNzk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ==","A7+rMYR5onPnACrz+niKSeFdH3xw1IyHo2AZSHmxrofRk9w4HcQPMYcpBUKu6OQ6zsdxf4m/vqa6tG6Na4OLpAQAAAB4eyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjI2MjIwNzk5LCJpc1RoaXJkUGFydHkiOnRydWV9"];function ef(a){a=void 0===a?window.document:a;mc(df,a)}var ff=x("gpt/pubads_impl_"),gf=x("https://securepubads.g.doubleclick.net/");var hf=function(a,b){var c=Xe(b);c&&(a={label:a,type:9,value:c},b=b.google_js_reporting_queue=b.google_js_reporting_queue||[],2048>b.length&&b.push(a))},jf=function(a,b,c){var d=window;return function(){var e=Xe(),f=3;try{var g=b.apply(this,arguments)}catch(h){f=13;if(c)return c(a,h),g;throw h}finally{d.google_measure_js_timing&&e&&(e={label:a.toString(),value:e,duration:(Xe()||0)-e,type:f},f=d.google_js_reporting_queue=d.google_js_reporting_queue||[],2048>f.length&&f.push(e))}return g}},kf=function(a,b){return jf(a,b,function(c,d){(new af).l(c,d)})};function X(a,b){return null==b?"&"+a+"=null":"&"+a+"="+Math.floor(b)}function lf(a,b){return"&"+a+"="+b.toFixed(3)}function mf(){var a=new m.Set;try{if("undefined"===typeof googletag||!googletag.pubads)return a;for(var b=googletag.pubads(),c=r(b.getSlots()),d=c.next();!d.done;d=c.next())a.add(d.value.getSlotId().getDomId())}catch(e){}return a}function nf(a){a=a.id;return null!=a&&(mf().has(a)||n(a,"startsWith").call(a,"google_ads_iframe_")||n(a,"startsWith").call(a,"aswift"))}function of(a,b,c){if(!a.sources)return!1;var d=md(Ic);switch(pf(a)){case 2:var e=qf(a);if(e)return c.some(function(g){return rf(e,g,d)});case 1:var f=sf(a);if(f)return b.some(function(g){return rf(f,g,d)})}return!1}function pf(a){if(!a.sources)return 0;a=a.sources.filter(function(b){return b.previousRect&&b.currentRect});if(1<=a.length){a=a[0];if(a.previousRect.topa.currentRect.top)return 1}return 0}function sf(a){return tf(a,function(b){return b.currentRect})}function qf(a){return tf(a,function(b){return b.previousRect})}function tf(a,b){return a.sources.reduce(function(c,d){d=b(d);return c?d&&0!==d.width*d.height?d.topf.C&&(f.C=Number(e.value));f.D+=1;var g=of(e,c,d);g&&(f.l+=e.value,f.S++);if(5e3f.H&&(f.H=f.g,f.X=f.h,f.W=e.startTime+e.duration)}break;case"largest-contentful-paint":a.P=Math.floor(e.renderTime||e.loadTime);a.O=e.size;break;case"first-input":a.M=Number((e.processingStart-e.startTime).toFixed(3));a.N=!0;break;case"longtask":e=Math.max(0,e.duration-50),a.o+=e,a.K=Math.max(a.K,e),a.F+=1}})));return a.G},wf=function(a){var b=kf(641,function(){var f=document;2==({visible:1,hidden:2,prerender:3,preview:4,unloaded:5}[f.visibilityState||f.webkitVisibilityState||f.mozVisibilityState||""]||0)&&Cf(a)}),c=kf(641,function(){return void Cf(a)});document.addEventListener("visibilitychange",b);document.addEventListener("unload",c);var d=md(Jc),e;0=d||0>=a?!1:100*d*a/((b.right-b.left)*(b.bottom-b.top))>=c},Bf=function(){var a=[].concat(t(document.getElementsByTagName("iframe"))).filter(nf),b=[].concat(t(mf())).map(function(c){return document.getElementById(c)}).filter(function(c){return null!==c});yf=window.scrollX;zf=window.scrollY;return Af=[].concat(t(a),t(b)).map(function(c){return c.getBoundingClientRect()})},yf=void 0,zf=void 0,Af=[];var Df=function(a){a=void 0===a?window:a;return!a.PeriodicSyncManager},Ef={issuerOrigin:"https://adservice.google.com",issuancePath:"/tt/i",redemptionPath:"/tt/r",shouldRedeemToken:function(){var a=void 0===a?window:a;return!Df(a)||N(Sc)?!0:!1},shouldRequestToken:function(){return!1}},Ff=function(){var a=void 0===a?window:a;if(!Df(a)&&N(Lc)||Df(a)&&N(Mc)){a=a.navigator.userAgent;var b=/Chrome/.test(a);return/Android/.test(a)&&b}return!1},Gf={issuerOrigin:"https://attestation.android.com",issuancePath:"/att/i",redemptionPath:"/att/r",shouldRedeemToken:function(){return Ff()},shouldRequestToken:function(){return Ff()}};var Hf=["A+b/H0b8RPXNaJgaNFpO0YOFuGK6myDQXlwnJB3SwzvNMfcndat4DZYMrP4ClJIzYWo3/yP2S+8FTZ/lpqbPAAEAAABueyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzVGhpcmRQYXJ0eSI6dHJ1ZX0=","A9ZgbRtm4pU3oZiuNzOsKcC8ppFSZdcjP2qYcdQrFKVzkmiWH1kdYY1Mi9x7G8+PS8HV9Ha9Cz0gaMdKsiVZIgMAAAB7eyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","AxL6oBxcpn5rQDPKSAs+d0oxNyJYq2/4esBUh3Yx5z8QfcLu+AU8iFCXYRcr/CEEfDnkxxLTsvXPJFQBxHfvkgMAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","A9KPtG5kl3oLTk21xqynDPGQ5t18bSOpwt0w6kGa6dEWbuwjpffmdUpR3W+faZDubGT+KIk2do0BX2ca16x8qAcAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","AookgM0K6zABiuRTZwpn+R95G2CKmUH/2+zf2kS/QpMlVZ6HTI6QekeLkrJyxeIi62p2ejcQTF464pkdlx0Nwg0AAABmeyJvcmlnaW4iOiJodHRwczovL3d3dy5nb29nbGUuY29tOjQ0MyIsImZlYXR1cmUiOiJUcnVzdFRva2VucyIsImV4cGlyeSI6MTYzNDA4MzE5OSwiaXNTdWJkb21haW4iOnRydWV9"],Kf=function(a,b,c){a=void 0===a?function(){}:a;b=void 0===b?null:b;c=void 0===c?!1:c;nd.call(this);If();this.o=b||N(Oc)?[Gf]:[Ef,Gf];this.h=c;this.l=a;if(document.hasTrustToken&&!N(Nc))if(N(Qc)){if(!Array.isArray(window.goog_tt_state)){var d=Jf(this);Object.defineProperty(window,"goog_tt_state",{configurable:!1,get:function(){return d.slice()}})}}else this.g=Jf(this)};u(Kf,nd);var If=function(){var a=void 0===a?window.document:a;mc(Hf,a)},Jf=function(a){var b=a.o.map(function(c){return{issuerOrigin:c.issuerOrigin,state:N(Pc)&&!a.h?12:1}});N(Qc)||a.l(b);return b},Y=function(a,b,c){if(N(Qc)){if(a=n(window.goog_tt_state,"find").call(window.goog_tt_state,function(e){return e.issuerOrigin===b}))a.state=c}else{var d=n(a.g,"find").call(a.g,function(e){return e.issuerOrigin===b});d&&(d.state=c,a.l(a.g))}},Lf=function(){var a=window.goog_tt_state;return Array.isArray(a)&&a.some(function(b){return 1!=b.state})},Mf=function(a,b){var c=b.issuerOrigin+b.redemptionPath,d={keepalive:!0,redirect:"follow",method:"get",trustToken:{type:"token-redemption",issuer:b.issuerOrigin,refreshPolicy:"none"}};Y(a,b.issuerOrigin,2);return window.fetch(c,d).then(function(e){if(!e.ok)throw Error(e.status+": Network response was not ok!");Y(a,b.issuerOrigin,6)}).catch(function(e){e&&"NoModificationAllowedError"===e.name?Y(a,b.issuerOrigin,6):Y(a,b.issuerOrigin,5)})},Nf=function(a,b,c){var d=b.issuerOrigin+b.issuancePath;Y(a,b.issuerOrigin,8);return window.fetch(d,{trustToken:{type:"token-request"}}).then(function(e){if(!e.ok)throw Error(e.status+": Network response was not ok!");Y(a,b.issuerOrigin,10);if(c)return Mf(a,b)}).catch(function(e){if(e&&"NoModificationAllowedError"===e.name){if(Y(a,b.issuerOrigin,10),c)return Mf(a,b)}else Y(a,b.issuerOrigin,9)})},Of=function(a){if(!(!document.hasTrustToken||N(Nc)||N(Pc)&&!a.h||N(Qc)&&Lf())){var b=[];a.o.forEach(function(c){var d=c.shouldRedeemToken(),e=c.shouldRequestToken();if(d||e){var f=document.hasTrustToken(c.issuerOrigin).then(function(g){if(g){if(d)return Mf(a,c)}else{if(e)return Nf(a,c,d);Y(a,c.issuerOrigin,3)}});b.push(f)}else Y(a,c.issuerOrigin,7)});if(window.Promise&&window.Promise.all)return window.Promise.all(b)}};var Pf="platform platformVersion architecture model uaFullVersion bitness".split(" "),Qf=function(a){return a.navigator&&a.navigator.userAgentData&&"function"===typeof a.navigator.userAgentData.getHighEntropyValues?a.navigator.userAgentData.getHighEntropyValues(Pf).then(function(b){var c=new Uc;c=H(c,1,b.platform);c=H(c,2,b.platformVersion);c=H(c,3,b.architecture);c=H(c,4,b.model);c=H(c,5,b.uaFullVersion);return H(c,9,b.bitness)}):null};var Rf=function(){return w.googletag||(w.googletag={})},Sf=function(a,b){var c=Rf();c.hasOwnProperty(a)||(c[a]=b)},Tf=function(a,b){a.addEventListener?a.addEventListener("load",b,!1):a.attachEvent&&a.attachEvent("onload",b)};var Z={247:"https://securepubads.g.doubleclick.net",7:.02,13:1500,23:.001,38:.001,58:1,150:"",211:!1,253:!1,172:null,245:{},180:null,246:[],227:{},226:[],248:0,228:"//www.googletagservices.com/pubconsole/",261:"//console.googletagservices.com/pubconsole/",250:null,252:null,258:null,251:null,259:null};Z[6]=function(a,b){b=void 0===b?!0:b;try{for(var c=null;c!=a;c=a,a=a.parent)switch(a.location.protocol){case"https:":return!0;case"file:":return b;case"http:":return!1}}catch(d){}return!0}(window);Z[49]=(new Date).getTime();Z[36]=jc("false");Z[148]=Hd;Z[221]=jc("");Z[254]=jc("true");Z[204]=ic("{{MOD}}",-1);Z[257]=jc("false");Z[260]=void 0;var W=function(){wa(this,Z)},Uf=function(a,b){M(W)[a]=b},Vf=Rf(),Wf=M(W);wa(Wf,Vf._vars_);Vf._vars_=Wf;var Xf=new m.WeakMap,Yf=function(a,b){a=[a];for(var c=b.length-1;0<=c;--c)a.push(typeof b[c],b[c]);return a.join("\v")};var Zf=function(a,b){b=void 0===b?Yf:b;var c=va(a),d=function(e){e=r(e);e.next();e=ia(e);return b(c,e)};return function(e){for(var f=[],g=0;ga||Math.floor(a)!==a?(oc({v:"2021070101"},"gpt_inv_ver"),a="1"):a="2021070101";return a}var Re=function(){var a={};this[wd]=(a[3]=$f,a[2]=M(W)[36],a[17]=function(b){for(var c=[],d=0;dc.status?(hf("13",a),lg(d,204==c.status?"":c.responseText)):lg(d,void 0,new a.Error("resp:"+c.status))},c.onerror=function(){return lg(d,void 0,new a.Error("s:"+c.status+" rs:"+c.readyState))},c.send())}.apply(this,arguments)}finally{if($___old_6d9f72ce0f632844)({}).constructor.defineProperty(window,"XMLHttpRequest",$___old_6d9f72ce0f632844)}},og=function(a,b,c,d){Uf(172,d);Uf(259,ig(a));new dg(b);M(qe).g(12);M(qe).g(5);N(Pc)||(a=N(Qc)?new Kf:new Kf(function(e){Uf(250,e)}),0{"use strict";const xhrUnsent=0;const xhrOpened=1;const xhrHeadersReceived=2;const xhrLoading=3;const xhrDone=4;const xhrDeferredHandleSymbol=Symbol("deferredHandle");const xhrOnLoadStartSymbol=Symbol("onloadstart");const xhrOnProgressSymbol=Symbol("onprogress");const xhrOnAbortSymbol=Symbol("onabort");const xhrOnErrorSymbol=Symbol("onerror");const xhrOnLoadSymbol=Symbol("onload");const xhrOnTimeoutSymbol=Symbol("ontimeout");const xhrOnLoadEndSymbol=Symbol("onloadend");const xhrOnReadyStateChangeSymbol=Symbol("onreadystatechange");const xhrReadyStateSymbol=Symbol("readyState");const xhrTimeoutSymbol=Symbol("timeout");const xhrWithCredentialsSymbol=Symbol("withCredentials");const xhrUploadSymbol=Symbol("upload");const xhrResponseTypeSymbol=Symbol("responseType");const defineEvent=(obj,symbol)=>{const type=symbol.description.substring(2);Object.defineProperty(obj,symbol,{configurable:false,enumerable:false,value:null,writable:true});obj.addEventListener(type,function(event){const handler=this[symbol];if(handler){handler.call(this,event)}})};const changeReadyState=(xhr,readyState)=>{xhr[xhrReadyStateSymbol]=readyState;xhr.dispatchEvent(new Event("readystatechange"))};let isSealed=true;class XMLHttpRequestEventTarget extends EventTarget{constructor(){super();if(!(this instanceof XMLHttpRequest)&&!(this instanceof XMLHttpRequestUpload)){throw new TypeError("Illegal constructor")}defineEvent(this,xhrOnLoadStartSymbol);defineEvent(this,xhrOnProgressSymbol);defineEvent(this,xhrOnAbortSymbol);defineEvent(this,xhrOnErrorSymbol);defineEvent(this,xhrOnLoadSymbol);defineEvent(this,xhrOnTimeoutSymbol);defineEvent(this,xhrOnLoadEndSymbol)}get onloadstart(){return this[xhrOnLoadStartSymbol]}set onloadstart(value){this[xhrOnLoadStartSymbol]=value}get onprogress(){return this[xhrOnProgressSymbol]}set onprogress(value){this[xhrOnProgressSymbol]=value}get onabort(){return this[xhrOnAbortSymbol]}set onabort(value){this[xhrOnAbortSymbol]=value}get onerror(){return this[xhrOnErrorSymbol]}set onerror(value){this[xhrOnErrorSymbol]=value}get ontimeout(){return this[xhrOnTimeoutSymbol]}set ontimeout(value){this[xhrOnTimeoutSymbol]=value}get onloadend(){return this[xhrOnLoadEndSymbol]}set onloadend(value){this[xhrOnLoadEndSymbol]=value}}exports.XMLHttpRequestEventTarget={configurable:true,enumerable:true,value:XMLHttpRequestEventTarget,writable:true};class XMLHttpRequestUpload extends XMLHttpRequestEventTarget{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}super()}}exports.XMLHttpRequestUpload={configurable:true,enumerable:true,value:XMLHttpRequestUpload,writable:true};class XMLHttpRequest extends XMLHttpRequestEventTarget{constructor(){super();isSealed=false;const xhrUpload=new XMLHttpRequestUpload;isSealed=true;Object.defineProperty(this,xhrDeferredHandleSymbol,{configurable:false,enumerable:false,value:null,writable:true});defineEvent(this,xhrOnReadyStateChangeSymbol);Object.defineProperty(this,xhrReadyStateSymbol,{configurable:false,enumerable:false,value:xhrUnsent,writable:true});Object.defineProperty(this,xhrTimeoutSymbol,{configurable:false,enumerable:false,value:0,writable:true});Object.defineProperty(this,xhrWithCredentialsSymbol,{configurable:false,enumerable:false,value:false,writable:true});Object.defineProperty(this,xhrUploadSymbol,{configurable:false,enumerable:false,value:xhrUpload,writable:false});Object.defineProperty(this,xhrResponseTypeSymbol,{configurable:false,enumerable:false,value:"",writable:true})}get onreadystatechange(){return this[xhrOnReadyStateChangeSymbol]}set onreadystatechange(value){this[xhrOnReadyStateChangeSymbol]=value}get readyState(){return this[xhrReadyStateSymbol]}open(method,url){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrDone:{changeReadyState(this,xhrOpened);break}}}setRequestHeader(name,value){}setTrustToken(trustToken){}get timeout(){return this[xhrTimeoutSymbol]}set timeout(value){this[xhrTimeoutSymbol]=value}get withCredentials(){return this[xhrWithCredentialsSymbol]}set withCredentials(value){switch(this[xhrReadyStateSymbol]){case xhrUnsent:case xhrOpened:{break}default:{throw new DOMException("Failed to set the 'withCredentials' property on 'XMLHttpRequest': The value may only be set if the object's state is UNSENT or OPENED.")}}this[xhrWithCredentialsSymbol]=!!value}get upload(){return this[xhrUploadSymbol]}send(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]===null){this[xhrDeferredHandleSymbol]=setTimeout(()=>{this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrDone);this.dispatchEvent(new ProgressEvent("error"));this.dispatchEvent(new ProgressEvent("loadend"))},0)}else{throw new DOMException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.")}}abort(){if(this[xhrReadyStateSymbol]===xhrOpened&&this[xhrDeferredHandleSymbol]!==null){clearTimeout(this[xhrDeferredHandleSymbol]);this[xhrDeferredHandleSymbol]=null;changeReadyState(this,xhrUnsent);this.dispatchEvent(new ProgressEvent("abort"));this.dispatchEvent(new ProgressEvent("loadend"))}}get responseURL(){return""}get status(){return 0}get statusText(){return""}getResponseHeader(name){return null}overrideMimeType(mime){}get responseType(){return this[xhrResponseTypeSymbol]}set responseType(value){switch(this[xhrReadyStateSymbol]){case xhrDone:{throw new DOMException("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set if the object's state is LOADING or DONE.")}}switch(value){case"":case"arraybuffer":case"blob":case"document":case"json":case"text":{this[xhrResponseTypeSymbol]=value;break}}}get response(){const responseType=this[xhrResponseTypeSymbol];return responseType===""||responseType==="text"?"":null}get responseText(){const responseType=this[xhrResponseTypeSymbol];if(responseType===""||responseType==="text"){return""}else{throw new DOMException("Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer').")}}get responseXML(){return null}}Object.defineProperty(XMLHttpRequest,"UNSENT",{configurable:false,enumerable:true,value:xhrUnsent});Object.defineProperty(XMLHttpRequest,"OPENED",{configurable:false,enumerable:true,value:xhrOpened});Object.defineProperty(XMLHttpRequest,"HEADERS_RECEIVED",{configurable:false,enumerable:true,value:xhrHeadersReceived});Object.defineProperty(XMLHttpRequest,"LOADING",{configurable:false,enumerable:true,value:xhrLoading});Object.defineProperty(XMLHttpRequest,"DONE",{configurable:false,enumerable:true,value:xhrDone});exports.XMLHttpRequest={configurable:true,enumerable:true,value:XMLHttpRequest,writable:true}})($___mock_f8e9a6d6172a3144);const $___mock_c7caec501dca2387={};(exports=>{"use strict";let isSealed=false;class Storage{constructor(){if(isSealed){throw new TypeError("Illegal constructor")}}get length(){return Object.keys(this).length}key(index){const keys=Object.keys(this);if(index<0||index>=keys.length){return null}return keys[index]}getItem(key){return Object.prototype.hasOwnProperty.call(this,key)?this[key]:null}setItem(key,value){this[key]=String(value)}removeItem(key){delete this[key]}clear(){const keys=Object.keys(this);for(const key of keys){delete this[key]}}}exports.Storage={configurable:true,enumerable:true,value:Storage,writable:true};const localStorage=new Storage;exports.localStorage={configurable:true,enumerable:true,get(){return localStorage}};const sessionStorage=new Storage;exports.sessionStorage={configurable:true,enumerable:true,get(){return sessionStorage}};isSealed=true})($___mock_c7caec501dca2387);(function(){window._satellite=window._satellite||{},window._satellite.container={buildInfo:{minified:!0,buildDate:"2021-06-19T11:02:21Z",environment:"production",turbineBuildDate:"2021-04-26T16:54:28Z",turbineVersion:"27.1.3"},dataElements:{"gTag:btnFBPageListMapping":{defaultValue:"",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){return{"/en-us/printing/design-services.html":"AddToCart","/en-us/printing/small-medium-business-offers.html":"Lead"}}}},"dfa:pageListMapping":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){return{sg:{"/en-sg/open-account/personal.html":"https://9188205.fls.doubleclick.net/activityi;src=9188205;type=invmedia;cat=perso0;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;npa=;ord=","/en-sg/open-account/corporate.html":" https://9188205.fls.doubleclick.net/activityi;src=9188205;type=invmedia;cat=corpo00;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;npa=;ord="},tw:{"/zh-tw/open-account/personal.html?intcmp=BAL-1005245-4-1-962-1000000-APAC-TW-ZH-FY19Q4PACCLNKXA":"https://9188205.fls.doubleclick.net/activityi;src=9188205;type=invmedia;cat=perso001;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;npa=;ord","/en-tw/open-account/personal.html?intcmp=BAL-1005245-4-1-962-1000000-APAC-TW-ZH-FY19Q4PACCLNKXA":"https://9188205.fls.doubleclick.net/activityi;src=9188205;type=invmedia;cat=perso001;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;npa=;ord"}}}}},"content:locale":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/javascriptVariable.js",settings:{path:"FDX.DATALAYER.page.pageInfo.locale"}},"content:region":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){var e=FDX.DATALAYER.page.pageInfo.region;return"en_in"==_satellite.getVar("content:locale")&&"meisa"!==e&&(e="meisa"),e}}},"dotTag:enabledPageList":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){return{"/en-us/possibilities.html":{startTime:"",endTime:"1590969599000"},"/en-us/holiday/consumer-shipping-delivery-guide.html":{startTime:"",endTime:""},"/en-ca/shipping-services/international-shipping.html":{startTime:"1578268799000",endTime:"1588550399000"},"/fr-ca/shipping-services/international-shipping.html":{startTime:"1578268799000",endTime:"1588550399000"},"/en-us/holiday.html":{startTime:"",endTime:""},"/en-us/coupon-offers/ground.html":{startTime:"",endTime:""},"/en-us/shipping/onsite/walgreens-package-pickup.html":{startTime:"",endTime:""},"/en-us/healthcare/vaccine-shipping.html":{startTime:"",endTime:""},"/en-us/ecommerce/offer-store-pickup-at-checkout.html":{startTime:"",endTime:""},"en-ca/shipping-tools/freight-quote-no-account.html":{startTime:"",endTime:""},"en-ca/shipping-tools/freight-quote.html":{startTime:"",endTime:""},"en-ca/shipping-services/express-freight.html":{startTime:"",endTime:""},"fr-ca/shipping-tools/freight-quote-no-account.html":{startTime:"",endTime:""},"fr-ca/shipping-tools/freight-quote.html":{startTime:"",endTime:""},"fr-ca/shipping-services/express-freight.html":{startTime:"",endTime:""},"/en-ca/small-business/ecommerce-solutions.html":{startTime:"",endTime:""},"/fr-ca/small-business/ecommerce-solutions.html":{startTime:"",endTime:""},"/en-ca/small-business.html":{startTime:"",endTime:""},"/fr-ca/small-business.html":{startTime:"",endTime:""},"/en-ca/shipping-services/express-freight/international-air-freight-quote.html":{startTime:"",endTime:""},"/fr-ca/shipping-services/express-freight/international-air-freight-quote.html":{startTime:"",endTime:""}}}}},"content:deviceType":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){var e="";return window.matchMedia("(min-width: 993px)").matches&&(e="desktop"),window.matchMedia("(max-width: 992px)").matches&&(e="tablet"),window.matchMedia("(max-width: 767px)").matches&&(e="mobile"),e}}},"content:page type":{defaultValue:"",forceLowerCase:!0,cleanText:!0,storageDuration:"pageview",modulePath:"core/src/lib/dataElements/javascriptVariable.js",settings:{path:"FDX.DATALAYER.page.category.pageType"}},"gTag:AdWordsEventMapping":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){return{us:{"/en-us/possibilities.html":"AW-863238793/ysZTCMOR74YBEIn1z5sD","/en-us/shipping/onsite.html":"AW-863238793/0ZuFCNzX5YYBEIn1z5sD","/en-us/shipping/packing.html":"AW-863238793/jrp5COqC74YBEIn1z5sD","/en-us/shipping/store/ground.html":"AW-863238793/EAXYCPSD74YBEIn1z5sD","/en-us/delivery-manager/business-toolkit.html":"AW-863238793/9nDvCIj77LcBEIn1z5sD","/en-us/shipping/returns/business.html":"AW-863238793/b6IdCLfnh7gBEIn1z5sD","/en-us/shipping/international/how-to-ship.html":"AW-863238793/bZs3CKHph7gBEIn1z5sD","/en-us/shipping/7-day-delivery.html":"AW-863238793/bjnQCOqJ7bcBEIn1z5sD","/en-us/ecommerce/fulfillment-shipping.html":"AW-863238793/tKSLCLXr_LcBEIn1z5sD","/en-us/discount-programs/ag13398602.html":"/en-us/discount-programs/ag13398602.html","/en-us/ecommerce.html":"AW-863238793/pg44CPOH6MIBEIn1z5sD","/en-us/big-commerce.html":"AW-863238793/OAfRCLGTyM0BEIn1z5sD","/en-us/printing/small-medium-business-offers.html":"AW-863238793/_wfuCKPQtc8BEIn1z5sD","/en-us/printing/design-services.html":"AW-863238793/ViUiCK2nntABEIn1z5sD","/en-us/delivery-manager.html":"AW-863238793/eS7bCMrh3NwBEIn1z5sD","/en-us/delivery-manager/manage-your-deliveries.html":"AW-863238793/nUeFCLDv5dwBEIn1z5sD","/en-us/holiday/consumer-shipping-delivery-guide.html":"AW-863238793/F5v5CJ_KruEBEIn1z5sD","/en-us/holiday.html":"AW-863238793/K_AyCP61k-EBEIn1z5sD","/en-us/printing/consumer-offers.html":"AW-863238793/i37fCNXpkOIBEIn1z5sD","/en-us/shipping/onsite/walgreens-package-pickup.html":"AW-863238793/COsKCMeEheIBEIn1z5sD","/en-us/printing/flash-sale-offers.html":"AW-863238793/C402CO_9kOIBEIn1z5sD","/en-us/shipping/onsite/dollar-general-pick-up-drop-off-package.html":"AW-863238793/SY0qCN678-EBEIn1z5sD","/en-us/shipping/hold-at-location.html":"AW-863238793/m0FxCJq1luMBEIn1z5sD","/en-us/coupon-offers/ground.html":"AW-863238793/VmlwCIOy-eEBEIn1z5sD","/en-us/healthcare/vaccine-shipping.html":"AW-863238793/vFzsCOfqnPEBEIn1z5sD","/en-us/ecommerce/offer-store-pickup-at-checkout.html":"AW-863238793/RCSLCIP_lfMBEIn1z5sD","/en-us/shipping/returns/technology.html":"AW-863238793/TLyYCMP7zO0BEIn1z5sD","/en-us/ecommerce/shipping-options.html":"AW-863238793/S0a4CMOg8O0BEIn1z5sD","/en-us/shipping/international.html":"AW-863238793/vCwCCKm53-0BEIn1z5sD","/en-us/shipping/home-delivery.html":"AW-863238793/OE39CMr3ze0BEIn1z5sD","/en-us/ecommerce/tools-and-services.html":"AW-863238793/I3YYCI3KlO4BEIn1z5sD"},za:{"/en-za/about/possibilities.html":"AW-698520817/ZsfzCP-iqrMBEPGpis0C","/en-za/open-account.html":"AW-698520817/XRq6CJvnnbMBEPGpis0C","/en-za/campaign/delivering-what-matters.html":"AW-634373607/apJKCLqF4dEBEOeLv64C"},au:{"/en-au/campaign/tt.html":"AW-683987082/8rSoCNDBkLgBEIqhk8YC","/en-au/new-customer.html":"AW-683987082/pr-rCJ_bhbgBEIqhk8YC"},nz:{"/en-nz/campaign/tt.html":"AW-683987082/cqjWCPLghbgBEIqhk8YC","/en-nz/new-customer.html":"AW-683987082/eT7tCPyG9rcBEIqhk8YC"},in:{"/en-in/open-account/thank-you.html":"AW-1066501107/zAjuCIXa8gEQ84fG_AM"}}}}},"login:fdx_cbid":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){return void 0!==_satellite.cookie.get("fdx_cbid")?_satellite.cookie.get("fdx_cbid"):""}}},"external-campaign:link":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/queryStringParameter.js",settings:{name:"LINK",caseInsensitive:!0}},"content:historicalPageName":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/javascriptVariable.js",settings:{path:"FDX.DATALAYER.page.pageInfo.historicalPageName"}},"content:page name":{defaultValue:"no pageName found",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){"undefined"==typeof _fdx&&_satellite.getVar("_fdxUtil");var e=_fdx.pcfUtil(),t="";e.match(/www(sbox.idev|base.idev|dev.idev|drt.idev|stress.dmz.idev|bit.idev|test|).fedex.com/gi)?t="fedex/":e.match(/(webapp.dev.|www.|)ftn.fedex.com/gi)&&(t="ftn/");var n=_satellite.getVar("content:pagePath");return t!=n.slice(0,t.length)&&(n=t+n),n}}},"gTag:ConfigLogic":{defaultValue:"",storageDuration:"pageview",modulePath:"core/src/lib/dataElements/customCode.js",settings:{source:function(){var e=_satellite.getVar("gTag:ConfigIDMapping"),t=_satellite.getVar("content:countryCode"),n="";if(void 0!==e&&""!==e&&void 0!==t&&""!==t)for(var r in e){if(-1this.MAX_SYNCS_LENGTH)for(e.sort(function(e,t){return parseInt(e.split("-")[1],10)-parseInt(t.split("-")[1],10)});e.join("*").length>this.MAX_SYNCS_LENGTH;)e.shift()},fireSync:function(e,t,n,r,l,i){var d=this;if(e){if("img"===t.tag){var a,o,s,c,u=t.url,f=g.loadSSL?"https:":"http:";for(a=0,o=u.length;ate.DAYS_BETWEEN_SYNC_ID_CALLS},attachIframeASAP:function(){function e(){t.startedAttachingIframe||(i.body?t.attachIframe():setTimeout(e,30))}var t=this;e()}}},N={audienceManagerServer:{},audienceManagerServerSecure:{},cookieDomain:{},cookieLifetime:{},cookieName:{},doesOptInApply:{},disableThirdPartyCalls:{},discardTrackingServerECID:{},idSyncAfterIDCallResult:{},idSyncAttachIframeOnWindowLoad:{},idSyncContainerID:{},idSyncDisable3rdPartySyncing:{},disableThirdPartyCookies:{},idSyncDisableSyncs:{},disableIdSyncs:{},idSyncIDCallResult:{},idSyncSSLUseAkamai:{},isCoopSafe:{},isIabContext:{},isOptInStorageEnabled:{},loadSSL:{},loadTimeout:{},marketingCloudServer:{},marketingCloudServerSecure:{},optInCookieDomain:{},optInStorageExpiry:{},overwriteCrossDomainMCIDAndAID:{},preOptInApprovals:{},previousPermissions:{},resetBeforeVersion:{},sdidParamExpiry:{},serverState:{},sessionCookieName:{},secureCookie:{},takeTimeoutMetrics:{},trackingServer:{},trackingServerSecure:{},whitelistIframeDomains:{},whitelistParentDomain:{}},B={getConfigNames:function(){return Object.keys(N)},getConfigs:function(){return N},normalizeConfig:function(e){return"function"!=typeof e?e:e()}},U=function(e){var i={};return e.on=function(e,t,n){if(!t||"function"!=typeof t)throw new Error("[ON] Callback should be a function.");i.hasOwnProperty(e)||(i[e]=[]);var r=i[e].push({callback:t,context:n})-1;return function(){i[e].splice(r,1),i[e].length||delete i[e]}},e.off=function(e,t){i.hasOwnProperty(e)&&(i[e]=i[e].filter(function(e){if(e.callback!==t)return e}))},e.publish=function(e){if(i.hasOwnProperty(e)){var t=[].slice.call(arguments,1);i[e].slice(0).forEach(function(e){e.callback.apply(e.context,t)})}},e.publish},re={PENDING:"pending",CHANGED:"changed",COMPLETE:"complete"},ie={AAM:"aam",ADCLOUD:"adcloud",ANALYTICS:"aa",CAMPAIGN:"campaign",ECID:"ecid",LIVEFYRE:"livefyre",TARGET:"target",MEDIA_ANALYTICS:"mediaaa"},ae=(e(h={},ie.AAM,565),e(h,ie.ECID,565),h),oe=(e(v={},ie.AAM,[1,10]),e(v,ie.ECID,[1,10]),v),se=["videoaa","iabConsentHash"],ce=(b=ie,Object.keys(b).map(function(e){return b[e]})),ue=function(){var r={};return r.callbacks=Object.create(null),r.add=function(e,t){if(!c(t))throw new Error("[callbackRegistryFactory] Make sure callback is a function or an array of functions.");r.callbacks[e]=r.callbacks[e]||[];var n=r.callbacks[e].push(t)-1;return function(){r.callbacks[e].splice(n,1)}},r.execute=function(e,t){if(r.callbacks[e]){t=(t=void 0===t?[]:t)instanceof Array?t:[t];try{for(;r.callbacks[e].length;){var n=r.callbacks[e].shift();"function"==typeof n?n.apply(null,t):n instanceof Array&&n[1].apply(n[0],t)}delete r.callbacks[e]}catch(r){}}},r.executeAll=function(n,e){(e||n&&!s(n))&&Object.keys(r.callbacks).forEach(function(e){var t=void 0!==n[e]?n[e]:"";r.execute(e,t)},r)},r.hasCallbacks=function(){return Boolean(Object.keys(r.callbacks).length)},r},le=function(){},de=function(e){var t=window.console;return!!t&&"function"==typeof t[e]},fe=function(r,i,e){return e()?function(){if(de(r)){for(var e=arguments.length,t=new Array(e),n=0;n>>1:t>>>1;i.push(t)}return function(e,t){e=unescape(encodeURIComponent(e)),t||(t=0),t^=-1;for(var n=0;n>>8^i[r]}return(t^=-1)>>>0}}(),me=new pe("[ADOBE OPT-IN]"),he=function(e,t){return q(e)===t},ve=function(e,t){return e instanceof Array?e:he(e,"string")?[e]:t||[]},be=function(t){var e=Object.keys(t);return!!e.length&&e.every(function(e){return!0===t[e]})},ye=function(e,t){var n=1>>t|e<<32-t}for(var n,r,i=Math.pow,a=i(2,32),o="",s=[],c=8*e.length,u=q.h=q.h||[],l=q.k=q.k||[],d=l.length,f={},p=2;d<64;p++)if(!f[p]){for(n=0;n<313;n+=p)f[n]=p;u[d]=i(p,.5)*a|0,l[d++]=i(p,1/3)*a|0}for(e+="€";e.length%64-56;)e+="\0";for(n=0;n>8)return;s[n>>2]|=r<<(3-n)%4*8}for(s[s.length]=c/a|0,s[s.length]=c,r=0;r>>3)+g[n-7]+(t(v,17)^t(v,19)^v>>>10)|0);(u=[_+((t(b,2)^t(b,13)^t(b,22))+(b&u[1]^b&u[2]^u[1]&u[2]))|0].concat(u))[4]=u[4]+_|0}for(n=0;n<8;n++)u[n]=u[n]+m[n]|0}for(n=0;n<8;n++)for(r=3;r+1;r--){var C=u[n]>>8*r&255;o+=(C<16?0:"")+C.toString(16)}return o},Fe=function(e,t){return"SHA-256"!==t&&"SHA256"!==t&&"sha256"!==t&&"sha-256"!==t||(e=Re(e)),e},Ne=function(e){return String(e).trim().toLowerCase()},Be=Me.OptIn;W.defineGlobalNamespace(),window.adobe.OptInCategories=Be.Categories;var Ue=function(r,n,e){function f(){v._customerIDsHashChanged=!1}function t(e){var r=e;return function(e){var t=e||k.location.href;try{var n=v._extractParamFromUri(t,r);if(n)return F.parsePipeDelimetedKeyValues(n)}catch(e){}}}function i(e){function t(e,t,n){e&&e.match(te.VALID_VISITOR_ID_REGEX)&&(n===D&&(x=!0),t(e))}t(e[D],v.setMarketingCloudVisitorID,D),v._setFieldExpire(O,-1),t(e[T],v.setAnalyticsVisitorID)}function a(e){e=e||{},v._supplementalDataIDCurrent=e.supplementalDataIDCurrent||"",v._supplementalDataIDCurrentConsumed=e.supplementalDataIDCurrentConsumed||{},v._supplementalDataIDLast=e.supplementalDataIDLast||"",v._supplementalDataIDLastConsumed=e.supplementalDataIDLastConsumed||{}}function o(e){function i(e,t,n){return(n=n?n+="|":n)+(e+"=")+encodeURIComponent(t)}function t(e,t){var n=t[0],r=t[1];return null!=r&&r!==j&&(e=i(n,r,e)),e}var n,r=e.reduce(t,"");return(n=(n=r)?n+="|":n)+"TS="+F.getTimestampInSeconds()}function s(e){var t=e.minutesToLive,n="";return(v.idSyncDisableSyncs||v.disableIdSyncs)&&(n=n||"Error: id syncs have been disabled"),"string"==typeof e.dpid&&e.dpid.length||(n=n||"Error: config.dpid is empty"),"string"==typeof e.url&&e.url.length||(n=n||"Error: config.url is empty"),void 0===t?t=20160:(t=parseInt(t,10),(isNaN(t)||t<=0)&&(n=n||"Error: config.minutesToLive needs to be a positive number")),{error:n,ttl:t}}function c(){return!(!v.configs.doesOptInApply||b.optIn.isComplete&&d())}function d(){return v.configs.doesOptInApply&&v.configs.isIabContext?b.optIn.isApproved(b.optIn.Categories.ECID)&&C:b.optIn.isApproved(b.optIn.Categories.ECID)}function u(){[["getMarketingCloudVisitorID"],["setCustomerIDs",void 0],["syncIdentity",void 0],["getAnalyticsVisitorID"],["getAudienceManagerLocationHint"],["getLocationHint"],["getAudienceManagerBlob"]].forEach(function(e){var t=e[0],n=2===e.length?e[1]:"",r=v[t];v[t]=function(e){return d()&&v.isAllowed()?r.apply(v,arguments):("function"==typeof e&&v._callCallback(e,[n]),n)}})}function l(){var e=v._getAudienceManagerURLData(),t=e.url;return v._loadData(w,t,null,e)}function p(e,t){if(C=!0,e)throw new Error("[IAB plugin] : "+e);t&&t.gdprApplies&&(y=t.consentString,_=t.hasConsentChangedSinceLastCmpPull?1:0),l(),h()}function g(e,t){if(C=!0,e)throw new Error("[IAB plugin] : "+e);t.gdprApplies&&(y=t.consentString,_=t.hasConsentChangedSinceLastCmpPull?1:0),v.init(),h()}function m(){b.optIn.isComplete&&(b.optIn.isApproved(b.optIn.Categories.ECID)?v.configs.isIabContext?b.optIn.execute({command:"iabPlugin.fetchConsentData",callback:g}):(v.init(),h()):v.configs.isIabContext?b.optIn.execute({command:"iabPlugin.fetchConsentData",callback:p}):(u(),h()))}function h(){b.optIn.off("complete",m)}if(!e||e.split("").reverse().join("")!==r)throw new Error("Please use `Visitor.getInstance` to instantiate Visitor.");var v=this,b=window.adobe,y="",_=0,C=!1,x=!1;v.version="5.0.1";var k=z,E=k.Visitor;E.version=v.version,E.AuthState=H.AUTH_STATE,E.OptOut=H.OPT_OUT,k.s_c_in||(k.s_c_il=[],k.s_c_in=0),v._c="Visitor",v._il=k.s_c_il,v._in=k.s_c_in,v._il[v._in]=v,k.s_c_in++,v._instanceType="regular",v._log={requests:[]},v.marketingCloudOrgID=r,v.cookieName="AMCV_"+r,v.sessionCookieName="AMCVS_"+r,v.cookieDomain=Q(),v.loadSSL=!0,v.loadTimeout=3e4,v.CORSErrors=[],v.marketingCloudServer=v.audienceManagerServer="dpm.demdex.net",v.sdidParamExpiry=30;var I=null,w="MC",D="MCMID",A="MCIDTS",S="A",T="MCAID",P="AAM",O="MCAAMB",j="NONE",L=function(e){return!Object.prototype[e]},M=ee(v);v.FIELDS=H.FIELDS,v.cookieRead=function(e){return K.get(e)},v.cookieWrite=function(e,t,n){var r=v.cookieLifetime?(""+v.cookieLifetime).toUpperCase():"",i=!1;return v.configs&&v.configs.secureCookie&&"https:"===location.protocol&&(i=!0),K.set(e,""+t,{expires:n,domain:v.cookieDomain,cookieLifetime:r,secure:i})},v.resetState=function(e){e?v._mergeServerState(e):a()},v._isAllowedDone=!1,v._isAllowedFlag=!1,v.isAllowed=function(){return v._isAllowedDone||(v._isAllowedDone=!0,(v.cookieRead(v.cookieName)||v.cookieWrite(v.cookieName,"T",1))&&(v._isAllowedFlag=!0)),"T"===v.cookieRead(v.cookieName)&&v._helpers.removeCookie(v.cookieName),v._isAllowedFlag},v.setMarketingCloudVisitorID=function(e){v._setMarketingCloudFields(e)},v._use1stPartyMarketingCloudServer=!1,v.getMarketingCloudVisitorID=function(e,t){v.marketingCloudServer&&v.marketingCloudServer.indexOf(".demdex.net")<0&&(v._use1stPartyMarketingCloudServer=!0);var n=v._getAudienceManagerURLData("_setMarketingCloudFields"),r=n.url;return v._getRemoteField(D,r,e,t,n)};var V=function(t,e){var n={};v.getMarketingCloudVisitorID(function(){e.forEach(function(e){n[e]=v._getField(e,!0)}),-1!==e.indexOf("MCOPTOUT")?v.isOptedOut(function(e){n.MCOPTOUT=e,t(n)},null,!0):t(n)},!0)};v.getVisitorValues=function(e,t){var n={MCMID:{fn:v.getMarketingCloudVisitorID,args:[!0],context:v},MCOPTOUT:{fn:v.isOptedOut,args:[void 0,!0],context:v},MCAID:{fn:v.getAnalyticsVisitorID,args:[!0],context:v},MCAAMLH:{fn:v.getAudienceManagerLocationHint,args:[!0],context:v},MCAAMB:{fn:v.getAudienceManagerBlob,args:[!0],context:v}},r=t&&t.length?W.pluck(n,t):n;t&&-1===t.indexOf("MCAID")?V(e,t):X(r,e)},v._currentCustomerIDs={},v._customerIDsHashChanged=!1,v._newCustomerIDsHash="",v.setCustomerIDs=function(e,t){if(!v.isOptedOut()&&e){if(!W.isObject(e)||W.isObjectEmpty(e))return!1;var n,r,i,a;for(n in v._readVisitor(),e)if(L(n)&&(v._currentCustomerIDs.dataSources=v._currentCustomerIDs.dataSources||{},t=(r=e[n]).hasOwnProperty("hashType")?r.hashType:t,r))if("object"===q(r)){var o={};if(r.id){if(t){if(!(a=Fe(Ne(r.id),t)))return;r.id=a,o.hashType=t}o.id=r.id}null!=r.authState&&(o.authState=r.authState),v._currentCustomerIDs.dataSources[n]=o}else if(t){if(!(a=Fe(Ne(r),t)))return;v._currentCustomerIDs.dataSources[n]={id:a,hashType:t}}else v._currentCustomerIDs.dataSources[n]={id:r};var s=v.getCustomerIDs(!0),c=v._getField("MCCIDH"),u="";for(i in c||(c=0),s){var l=s[i];if(!W.isObjectEmpty(l))for(n in l)L(n)&&(u+=(u?"|":"")+n+"|"+((r=l[n]).id?r.id:"")+(r.authState?r.authState:""))}v._newCustomerIDsHash=String(v._hash(u)),v._newCustomerIDsHash!==c&&(v._customerIDsHashChanged=!0,v._mapCustomerIDs(f))}},v.syncIdentity=function(e,t){if(!v.isOptedOut()&&e){if(!W.isObject(e)||W.isObjectEmpty(e))return!1;var n,r,i,a,o;for(n in v._readVisitor(),e)if(L(n)&&(v._currentCustomerIDs.nameSpaces=v._currentCustomerIDs.nameSpaces||{},t=(r=e[n]).hasOwnProperty("hashType")?r.hashType:t,r&&"object"===q(r))){var s={};if(r.id){if(t){if(!(i=Fe(Ne(r.id),t)))return;r.id=i,s.hashType=t}s.id=r.id}null!=r.authState&&(s.authState=r.authState),r.dataSource&&(v._currentCustomerIDs.dataSources=v._currentCustomerIDs.dataSources||{},a=r.dataSource,v._currentCustomerIDs.dataSources[a]=s),v._currentCustomerIDs.nameSpaces[n]=s}var c=v.getCustomerIDs(!0),u=v._getField("MCCIDH"),l="";for(o in u||(u="0"),c){var d=c[o];if(!W.isObjectEmpty(d))for(n in d)L(n)&&(l+=(l?"|":"")+n+"|"+((r=d[n]).id?r.id:"")+(r.authState?r.authState:""))}v._newCustomerIDsHash=String(v._hash(l)),v._newCustomerIDsHash!==u&&(v._customerIDsHashChanged=!0,v._mapCustomerIDs(f))}},v.getCustomerIDs=function(e){v._readVisitor();var t,n,r={dataSources:{},nameSpaces:{}},i=v._currentCustomerIDs.dataSources;for(t in i)L(t)&&(n=i[t]).id&&(r.dataSources[t]||(r.dataSources[t]={}),r.dataSources[t].id=n.id,null!=n.authState?r.dataSources[t].authState=n.authState:r.dataSources[t].authState=E.AuthState.UNKNOWN,n.hashType&&(r.dataSources[t].hashType=n.hashType));var a=v._currentCustomerIDs.nameSpaces;for(t in a)L(t)&&(n=a[t]).id&&(r.nameSpaces[t]||(r.nameSpaces[t]={}),r.nameSpaces[t].id=n.id,null!=n.authState?r.nameSpaces[t].authState=n.authState:r.nameSpaces[t].authState=E.AuthState.UNKNOWN,n.hashType&&(r.nameSpaces[t].hashType=n.hashType));return e?r:r.dataSources},v.setAnalyticsVisitorID=function(e){v._setAnalyticsFields(e)},v.getAnalyticsVisitorID=function(e,t,n){if(!F.isTrackingServerPopulated()&&!n)return v._callCallback(e,[""]),"";var r="";if(n||(r=v.getMarketingCloudVisitorID(function(){v.getAnalyticsVisitorID(e,!0)})),r||n){var i=n?v.marketingCloudServer:v.trackingServer,a="";v.loadSSL&&(n?v.marketingCloudServerSecure&&(i=v.marketingCloudServerSecure):v.trackingServerSecure&&(i=v.trackingServerSecure));var o={};if(i){var s="http"+(v.loadSSL?"s":"")+"://"+i+"/id",c="d_visid_ver="+v.version+"&mcorgid="+encodeURIComponent(v.marketingCloudOrgID)+(r?"&mid="+encodeURIComponent(r):"")+(v.idSyncDisable3rdPartySyncing||v.disableThirdPartyCookies?"&d_coppa=true":""),u=["s_c_il",v._in,"_set"+(n?"MarketingCloud":"Analytics")+"Fields"];a=s+"?"+c+"&callback=s_c_il%5B"+v._in+"%5D._set"+(n?"MarketingCloud":"Analytics")+"Fields",o.corsUrl=s+"?"+c,o.callback=u}return o.url=a,v._getRemoteField(n?D:T,a,e,t,o)}return""},v.getAudienceManagerLocationHint=function(e,t){if(v.getMarketingCloudVisitorID(function(){v.getAudienceManagerLocationHint(e,!0)})){var n=v._getField(T);if(!n&&F.isTrackingServerPopulated()&&(n=v.getAnalyticsVisitorID(function(){v.getAudienceManagerLocationHint(e,!0)})),n||!F.isTrackingServerPopulated()){var r=v._getAudienceManagerURLData(),i=r.url;return v._getRemoteField("MCAAMLH",i,e,t,r)}}return""},v.getLocationHint=v.getAudienceManagerLocationHint,v.getAudienceManagerBlob=function(e,t){if(v.getMarketingCloudVisitorID(function(){v.getAudienceManagerBlob(e,!0)})){var n=v._getField(T);if(!n&&F.isTrackingServerPopulated()&&(n=v.getAnalyticsVisitorID(function(){v.getAudienceManagerBlob(e,!0)})),n||!F.isTrackingServerPopulated()){var r=v._getAudienceManagerURLData(),i=r.url;return v._customerIDsHashChanged&&v._setFieldExpire(O,-1),v._getRemoteField(O,i,e,t,r)}}return""},v._supplementalDataIDCurrent="",v._supplementalDataIDCurrentConsumed={},v._supplementalDataIDLast="",v._supplementalDataIDLastConsumed={};var R=!(v.getSupplementalDataID=function(e,t){v._supplementalDataIDCurrent||t||(v._supplementalDataIDCurrent=v._generateID(1));var n=v._supplementalDataIDCurrent;return v._supplementalDataIDLast&&!v._supplementalDataIDLastConsumed[e]?(n=v._supplementalDataIDLast,v._supplementalDataIDLastConsumed[e]=!0):n&&(v._supplementalDataIDCurrentConsumed[e]&&(v._supplementalDataIDLast=v._supplementalDataIDCurrent,v._supplementalDataIDLastConsumed=v._supplementalDataIDCurrentConsumed,v._supplementalDataIDCurrent=n=t?"":v._generateID(1),v._supplementalDataIDCurrentConsumed={}),n&&(v._supplementalDataIDCurrentConsumed[e]=!0)),n});v._liberatedOptOut=null,v.getOptOut=function(e,t){var n=v._getAudienceManagerURLData("_setMarketingCloudFields"),r=n.url;if(d())return v._getRemoteField("MCOPTOUT",r,e,t,n);if(v._registerCallback("liberatedOptOut",e),null!==v._liberatedOptOut)return v._callAllCallbacks("liberatedOptOut",[v._liberatedOptOut]),R=!1,v._liberatedOptOut;if(R)return null;R=!0;var i="liberatedGetOptOut";return n.corsUrl=n.corsUrl.replace(/\.demdex\.net\/id\?/,".demdex.net/optOutStatus?"),n.callback=[i],z[i]=function(e){if(e===Object(e)){var t,n,r=W.parseOptOut(e,t,j);t=r.optOut,n=1e3*r.d_ottl,v._liberatedOptOut=t,setTimeout(function(){v._liberatedOptOut=null},n)}v._callAllCallbacks("liberatedOptOut",[t]),R=!1},M.fireCORS(n),null},v.isOptedOut=function(n,r,e){r||(r=E.OptOut.GLOBAL);var t=v.getOptOut(function(e){var t=e===E.OptOut.GLOBAL||0<=e.indexOf(r);v._callCallback(n,[t])},e);return t?t===E.OptOut.GLOBAL||0<=t.indexOf(r):null},v._fields=null,v._fieldsExpired=null,v._hash=function(e){var t,n=0;if(e)for(t=0;tte.ADOBE_MC_TTL_IN_MIN||e.MCORGID!==r)return;i(e)}},v._mergeServerState=function(e){if(e)try{if(r=e,(e=F.isObject(r)?r:JSON.parse(r))[v.marketingCloudOrgID]){var t=e[v.marketingCloudOrgID];n=t.customerIDs,F.isObject(n)&&v.setCustomerIDs(n),a(t.sdid)}}catch(e){throw new Error("`serverState` has an invalid format.")}var n,r},v._timeout=null,v._loadData=function(e,t,n,r){t=v._addQuerystringParam(t,"d_fieldgroup",e,1),r.url=v._addQuerystringParam(r.url,"d_fieldgroup",e,1),r.corsUrl=v._addQuerystringParam(r.corsUrl,"d_fieldgroup",e,1),U.fieldGroupObj[e]=!0,r===Object(r)&&r.corsUrl&&"XMLHttpRequest"===M.corsMetadata.corsType&&M.fireCORS(r,n,e)},v._clearTimeout=function(e){null!=v._timeout&&v._timeout[e]&&(clearTimeout(v._timeout[e]),v._timeout[e]=0)},v._settingsDigest=0,v._getSettingsDigest=function(){if(!v._settingsDigest){var e=v.version;v.audienceManagerServer&&(e+="|"+v.audienceManagerServer),v.audienceManagerServerSecure&&(e+="|"+v.audienceManagerServerSecure),v._settingsDigest=v._hash(e)}return v._settingsDigest},v._readVisitorDone=!1,v._readVisitor=function(){if(!v._readVisitorDone){v._readVisitorDone=!0;var e,t,n,r,i,a,o=v._getSettingsDigest(),s=!1,c=v.cookieRead(v.cookieName),u=new Date;if(c||x||v.discardTrackingServerECID||(c=v.cookieRead(te.FIRST_PARTY_SERVER_COOKIE)),null==v._fields&&(v._fields={}),c&&"T"!==c)for((c=c.split("|"))[0].match(/^[\-0-9]+$/)&&(parseInt(c[0],10)!==o&&(s=!0),c.shift()),c.length%2==1&&c.pop(),e=0;e=1e3*i||a&&!v.cookieRead(v.sessionCookieName))&&(v._fieldsExpired||(v._fieldsExpired={}),v._fieldsExpired[n]=!0)));!v._getField(T)&&F.isTrackingServerPopulated()&&(c=v.cookieRead("s_vi"))&&1<(c=c.split("|")).length&&0<=c[0].indexOf("v1")&&(0<=(e=(r=c[1]).indexOf("["))&&(r=r.substring(0,e)),r&&r.match(te.VALID_VISITOR_ID_REGEX)&&v._setField(T,r))}},v._appendVersionTo=function(e){var t="vVersion|"+v.version,n=e?v._getCookieVersion(e):null;return n?$.areVersionsDifferent(n,v.version)&&(e=e.replace(te.VERSION_REGEX,t)):e+=(e?"|":"")+t,e},v._writeVisitor=function(){var e,t,n=v._getSettingsDigest();for(e in v._fields)L(e)&&v._fields[e]&&"expire"!==e.substring(0,6)&&(t=v._fields[e],n+=(n?"|":"")+e+(v._fields["expire"+e]?"-"+v._fields["expire"+e]:"")+"|"+t);n=v._appendVersionTo(n),v.cookieWrite(v.cookieName,n,1)},v._getField=function(e,t){return null==v._fields||!t&&v._fieldsExpired&&v._fieldsExpired[e]?null:v._fields[e]},v._setField=function(e,t,n){null==v._fields&&(v._fields={}),v._fields[e]=t,n||v._writeVisitor()},v._getFieldList=function(e,t){var n=v._getField(e,t);return n?n.split("*"):null},v._setFieldList=function(e,t,n){v._setField(e,t?t.join("*"):"",n)},v._getFieldMap=function(e,t){var n=v._getFieldList(e,t);if(n){var r,i={};for(r=0;r\n"+t+"\n<\/script>"},s=function(t,e){var n="__runScript"+ ++i;return _satellite[n]=function(e){e.call(t.event.element,t.event,t.event.target),delete _satellite[n]},'